/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cassandra.serializers; import org.junit.Test; import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; public class TimeSerializerTest { @Test public void testSerializerFromString() { // nano long expected = 5; Long time = TimeSerializer.timeStringToLong("00:00:00.000000005"); assert time == expected : String.format("Failed nano conversion. Expected %s, got %s", expected, time); // usec expected = TimeUnit.MICROSECONDS.toNanos(123); time = TimeSerializer.timeStringToLong("00:00:00.000123000"); assert time == expected : String.format("Failed usec conversion. Expected %s, got %s", expected, time); // milli expected = TimeUnit.MILLISECONDS.toNanos(123); time = TimeSerializer.timeStringToLong("00:00:00.123000"); assert time == expected : String.format("Failed milli conversion. Expected %s, got %s", expected, time); // sec expected = TimeUnit.SECONDS.toNanos(15); time = TimeSerializer.timeStringToLong("00:00:15.000"); assert time == expected : String.format("Failed sec conversion. Expected %s, got %s", expected, time); // min expected = TimeUnit.MINUTES.toNanos(13); time = TimeSerializer.timeStringToLong("00:13:00.000"); assert time == expected : String.format("Failed min conversion. Expected %s, got %s", expected, time); // hour expected = TimeUnit.HOURS.toNanos(2); time = TimeSerializer.timeStringToLong("02:0:00.000"); assert time == expected : String.format("Failed min conversion. Expected %s, got %s", expected, time); // complex expected = buildExpected(4, 31, 12, 123, 456, 789); time = TimeSerializer.timeStringToLong("4:31:12.123456789"); assert time == expected : String.format("Failed complex conversion. Expected %s, got %s", expected, time); // upper bound expected = buildExpected(23, 59, 59, 999, 999, 999); time = TimeSerializer.timeStringToLong("23:59:59.999999999"); assert time == expected : String.format("Failed upper bounds conversion. Expected %s, got %s", expected, time); // Test partial nano expected = buildExpected(12, 13, 14, 123, 654, 120); time = TimeSerializer.timeStringToLong("12:13:14.12365412"); assert time == expected : String.format("Failed partial nano timestring. Expected %s, got %s", expected, time); // Test raw long value expected = 10; time = TimeSerializer.timeStringToLong("10"); assert time == expected : String.format("Failed long conversion. Expected %s, got %s", expected, time); // Test 0 long expected = 0; time = TimeSerializer.timeStringToLong("0"); assert time == expected : String.format("Failed long conversion. Expected %s, got %s", expected, time); } private long buildExpected(int hour, int minute, int second, int milli, int micro, int nano) { return TimeUnit.HOURS.toNanos(hour) + TimeUnit.MINUTES.toNanos(minute) + TimeUnit.SECONDS.toNanos(second) + TimeUnit.MILLISECONDS.toNanos(milli) + TimeUnit.MICROSECONDS.toNanos(micro) + nano; } @Test public void testSerializerToString() { String source = "00:00:00.000000011"; Long time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "00:00:00.000012311"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "00:00:00.123000000"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "00:00:12.123450000"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "00:34:12.123450000"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "15:00:12.123450000"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); // boundaries source = "00:00:00.000000000"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); source = "23:59:59.999999999"; time = TimeSerializer.timeStringToLong(source); assert(source.equals(TimeSerializer.instance.toString(time))); // truncated source = "01:14:18.12"; time = TimeSerializer.timeStringToLong(source); String result = TimeSerializer.instance.toString(time); assert(result.equals("01:14:18.120000000")); source = "01:14:18.1201"; time = TimeSerializer.timeStringToLong(source); result = TimeSerializer.instance.toString(time); assert(result.equals("01:14:18.120100000")); source = "01:14:18.1201098"; time = TimeSerializer.timeStringToLong(source); result = TimeSerializer.instance.toString(time); assert(result.equals("01:14:18.120109800")); } @Test public void testSerialization() { String source = "01:01:01.123123123"; Long nt = TimeSerializer.timeStringToLong(source); ByteBuffer buf = TimeSerializer.instance.serialize(nt); TimeSerializer.instance.validate(buf); Long result = TimeSerializer.instance.deserialize(buf); String strResult = TimeSerializer.instance.toString(result); assert(strResult.equals(source)); } @Test (expected=MarshalException.class) public void testBadHourLow() { Long time = TimeSerializer.timeStringToLong("-1:0:0.123456789"); } @Test (expected=MarshalException.class) public void testBadHourHigh() { Long time = TimeSerializer.timeStringToLong("24:0:0.123456789"); } @Test (expected=MarshalException.class) public void testBadMinuteLow() { Long time = TimeSerializer.timeStringToLong("23:-1:0.123456789"); } @Test (expected=MarshalException.class) public void testBadMinuteHigh() { Long time = TimeSerializer.timeStringToLong("23:60:0.123456789"); } @Test (expected=MarshalException.class) public void testEmpty() { Long time = TimeSerializer.timeStringToLong(""); } @Test (expected=MarshalException.class) public void testBadSecondLow() { Long time = TimeSerializer.timeStringToLong("23:59:-1.123456789"); } @Test (expected=MarshalException.class) public void testBadSecondHigh() { Long time = TimeSerializer.timeStringToLong("23:59:60.123456789"); } @Test (expected=MarshalException.class) public void testBadSecondHighNoMilli() { Long time = TimeSerializer.timeStringToLong("23:59:60"); } @Test (expected=MarshalException.class) public void testBadNanoLow() { Long time = TimeSerializer.timeStringToLong("23:59:59.-123456789"); } @Test (expected=MarshalException.class) public void testBadNanoHigh() { Long time = TimeSerializer.timeStringToLong("23:59:59.1234567899"); } @Test (expected=MarshalException.class) public void testBadNanoCharacter() { Long time = TimeSerializer.timeStringToLong("23:59:59.12345A789"); } @Test (expected=MarshalException.class) public void testNegativeLongTime() { Long time = TimeSerializer.timeStringToLong("-10"); } @Test (expected=MarshalException.class) public void testRawLongOverflow() { Long input = TimeUnit.DAYS.toNanos(1) + 1; Long time = TimeSerializer.timeStringToLong(input.toString()); } }