/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * Licensed 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 com.linkedin.pinot.common.utils; import java.util.Arrays; import org.testng.Assert; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; /** * Tests for the realtime segment name builder. */ public class SegmentNameBuilderTest { @Test public void testSegmentNameBuilder() { final String oldV1Name = "myTable_REALTIME__Server_1.2.3.4_1234__myTable_REALTIME_1234567_0__0__23456789"; final String groupId = "myTable_REALTIME_1234567_0"; final String partitionRange = "ALL"; final String sequenceNumber = "1234567"; HLCSegmentName shortNameSegment = new HLCSegmentName(groupId, partitionRange, sequenceNumber); HLCSegmentName longNameSegment = new HLCSegmentName(oldV1Name); final String shortV1Name = shortNameSegment.getSegmentName(); LLCSegmentName llcSegment = new LLCSegmentName("myTable", 0, 1, 1465508537069L); final String v2Name = llcSegment.getSegmentName(); assertEquals(shortV1Name, "myTable_REALTIME_1234567_0__ALL__1234567"); assertEquals(v2Name, "myTable__0__1__20160609T2142Z"); // Check v1/v2 format detection assertEquals(SegmentName.getSegmentType(oldV1Name), SegmentName.RealtimeSegmentType.HLC_LONG); assertEquals(SegmentName.getSegmentType(shortV1Name), SegmentName.RealtimeSegmentType.HLC_SHORT); assertEquals(SegmentName.getSegmentType(v2Name), SegmentName.RealtimeSegmentType.LLC); // assertEquals(isRealtimeV2Name(oldV1Name), false); // assertEquals(isRealtimeV2Name(shortV1Name), false); // assertEquals(isRealtimeV2Name(v2Name), true); // Check table name assertEquals(longNameSegment.getTableName(), "myTable_REALTIME"); assertEquals(shortNameSegment.getTableName(), "myTable_REALTIME"); assertEquals(llcSegment.getTableName(), "myTable"); // Check partition range assertEquals(longNameSegment.getPartitionRange(), "0"); assertEquals(shortNameSegment.getPartitionRange(), "ALL"); assertEquals(llcSegment.getPartitionId(), 0); // Check groupId assertEquals(longNameSegment.getGroupId(), "myTable_REALTIME_1234567_0"); assertEquals(shortNameSegment.getGroupId(), "myTable_REALTIME_1234567_0"); try { llcSegment.getGroupId(); fail("extractGroupIdName with a v2 name did not throw an exception"); } catch (Exception e) { // Expected } // Check sequence number assertEquals(longNameSegment.getSequenceNumber(), 23456789); assertEquals(longNameSegment.getSequenceNumberStr(), "23456789"); assertEquals(shortNameSegment.getSequenceNumberStr(), "1234567"); assertEquals(shortNameSegment.getSequenceNumber(), 1234567); assertEquals(llcSegment.getSequenceNumber(), 1); assertEquals(llcSegment.getSegmentType(), SegmentName.RealtimeSegmentType.LLC); assertEquals(longNameSegment.getSegmentType(), SegmentName.RealtimeSegmentType.HLC_LONG); assertEquals(shortNameSegment.getSegmentType(), SegmentName.RealtimeSegmentType.HLC_SHORT); assertEquals(SegmentName.getSegmentType(llcSegment.getSegmentName()), SegmentName.RealtimeSegmentType.LLC); assertEquals(SegmentName.getSegmentType(longNameSegment.getSegmentName()), SegmentName.RealtimeSegmentType.HLC_LONG); assertEquals(SegmentName.getSegmentType(shortNameSegment.getSegmentName()), SegmentName.RealtimeSegmentType.HLC_SHORT); // Invalid segment names assertEquals(SegmentName.getSegmentType(shortNameSegment.getSegmentName() + "__"), SegmentName.RealtimeSegmentType.UNSUPPORTED); assertEquals(SegmentName.getSegmentType("__" + shortNameSegment.getSegmentName()), SegmentName.RealtimeSegmentType.UNSUPPORTED); assertEquals(SegmentName.getSegmentType("__abc__"), SegmentName.RealtimeSegmentType.UNSUPPORTED); assertEquals(SegmentName.getSegmentType("a__abc__1__3__4__54__g__gg___h"), SegmentName.RealtimeSegmentType.UNSUPPORTED); } @Test public void testExceptions() { // Nulls should not work /* try { SegmentNameBuilder.Realtime.buildHighLevelConsumerSegmentName(null, null, null); fail("Exception not thrown"); } catch (Exception e) { // Expected } */ // Double underscores should not work try { HLCSegmentName segName = new HLCSegmentName("__", "a", "b"); // SegmentNameBuilder.Realtime.buildHighLevelConsumerSegmentName("__", "a", "b"); fail("Exception not thrown"); } catch (Exception e) { // Expected } } @Test public void LLCSegNameTest() { final String tableName = "myTable"; final int partitionId = 4; final int sequenceNumber = 27; final long msSinceEpoch = 1466200248000L; final String creationTime = "20160617T2150Z"; final String segmentName = "myTable__4__27__" + creationTime; LLCSegmentName segName1 = new LLCSegmentName(tableName, partitionId, sequenceNumber, msSinceEpoch); Assert.assertEquals(segName1.getSegmentName(), segmentName); Assert.assertEquals(segName1.getPartitionId(), partitionId); Assert.assertEquals(segName1.getCreationTime(), creationTime); Assert.assertEquals(segName1.getSequenceNumber(), sequenceNumber); Assert.assertEquals(segName1.getTableName(), tableName); LLCSegmentName segName2 = new LLCSegmentName(segmentName); Assert.assertEquals(segName2.getSegmentName(), segmentName); Assert.assertEquals(segName2.getPartitionId(), partitionId); Assert.assertEquals(segName2.getCreationTime(), creationTime); Assert.assertEquals(segName2.getSequenceNumber(), sequenceNumber); Assert.assertEquals(segName2.getTableName(), tableName); Assert.assertEquals(segName1, segName2); LLCSegmentName segName3 = new LLCSegmentName(tableName, partitionId+1, sequenceNumber-1, msSinceEpoch); Assert.assertTrue(segName1.compareTo(segName3) < 0); LLCSegmentName segName4 = new LLCSegmentName(tableName, partitionId+1, sequenceNumber+1, msSinceEpoch); Assert.assertTrue(segName1.compareTo(segName4) < 0); LLCSegmentName segName5 = new LLCSegmentName(tableName, partitionId-1, sequenceNumber+1, msSinceEpoch); Assert.assertTrue(segName1.compareTo(segName5) > 0); LLCSegmentName segName6 = new LLCSegmentName(tableName, partitionId, sequenceNumber+1, msSinceEpoch); Assert.assertTrue(segName1.compareTo(segName6) < 0); LLCSegmentName segName7 = new LLCSegmentName(tableName+"NotGood", partitionId, sequenceNumber+1, msSinceEpoch); try { segName1.compareTo(segName7); Assert.fail("Not failing when comparing " + segName1.getSegmentName() + " and " + segName7.getSegmentName()); } catch (Exception e) { // expected } LLCSegmentName[] testSorted = new LLCSegmentName[] {segName3, segName1, segName4, segName5, segName6}; Arrays.sort(testSorted); Assert.assertTrue(testSorted[0] == segName5); Assert.assertTrue(testSorted[1] == segName1); Assert.assertTrue(testSorted[2] == segName6); Assert.assertTrue(testSorted[3] == segName3); Assert.assertTrue(testSorted[4] == segName4); } }