package com.pinterest.secor.parser; import com.pinterest.secor.common.SecorConfig; import com.pinterest.secor.message.Message; import junit.framework.TestCase; import org.apache.thrift.TSerializer; import org.apache.thrift.protocol.TBinaryProtocol; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.modules.junit4.PowerMockRunner; import com.pinterest.secor.thrift.UnitTestMessage; @RunWith(PowerMockRunner.class) public class ThriftMessageParserTest extends TestCase { private SecorConfig mConfig; @Override public void setUp() throws Exception { mConfig = Mockito.mock(SecorConfig.class); Mockito.when(TimestampedMessageParser.usingDateFormat(mConfig)).thenReturn("yyyy-MM-dd"); Mockito.when(TimestampedMessageParser.usingHourFormat(mConfig)).thenReturn("HH"); Mockito.when(TimestampedMessageParser.usingMinuteFormat(mConfig)).thenReturn("mm"); Mockito.when(TimestampedMessageParser.usingDatePrefix(mConfig)).thenReturn("dt="); Mockito.when(TimestampedMessageParser.usingHourPrefix(mConfig)).thenReturn("hr="); Mockito.when(TimestampedMessageParser.usingMinutePrefix(mConfig)).thenReturn("min="); } private Message buildMessage(long timestamp, int timestampTwo, long timestampThree) throws Exception { UnitTestMessage thriftMessage = new UnitTestMessage(timestamp, "notimportant", timestampTwo, timestampThree); TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory()); byte[] data = serializer.serialize(thriftMessage); return new Message("test", 0, 0, null, data); } @Test public void testExtractTimestamp() throws Exception { Mockito.when(mConfig.getMessageTimestampName()).thenReturn("blasdjlkjasdkl"); Mockito.when(mConfig.getMessageTimestampId()).thenReturn(1); Mockito.when(mConfig.getMessageTimestampType()).thenReturn("i64"); Mockito.when(mConfig.getThriftProtocolClass()).thenReturn("org.apache.thrift.protocol.TBinaryProtocol"); ThriftMessageParser parser = new ThriftMessageParser(mConfig); assertEquals(1405970352000L, parser.extractTimestampMillis(buildMessage(1405970352L, 1, 2L))); assertEquals(1405970352123L, parser.extractTimestampMillis(buildMessage(1405970352123L, 1, 2L))); } @Test public void testExtractTimestampTwo() throws Exception { Mockito.when(mConfig.getMessageTimestampName()).thenReturn("timestampTwo"); Mockito.when(mConfig.getMessageTimestampId()).thenReturn(3); Mockito.when(mConfig.getMessageTimestampType()).thenReturn("i32"); Mockito.when(mConfig.getThriftProtocolClass()).thenReturn("org.apache.thrift.protocol.TBinaryProtocol"); ThriftMessageParser parser = new ThriftMessageParser(mConfig); assertEquals(1405970352000L, parser.extractTimestampMillis(buildMessage(1L, 1405970352, 2L))); assertEquals(145028289000L, parser.extractTimestampMillis(buildMessage(1L, 145028289, 2L))); } @Test public void testExtractTimestampThree() throws Exception { Mockito.when(mConfig.getMessageTimestampName()).thenReturn("timestampThree"); Mockito.when(mConfig.getMessageTimestampId()).thenReturn(6); Mockito.when(mConfig.getMessageTimestampType()).thenReturn("i64"); Mockito.when(mConfig.getThriftProtocolClass()).thenReturn("org.apache.thrift.protocol.TBinaryProtocol"); ThriftMessageParser parser = new ThriftMessageParser(mConfig); assertEquals(1405970352000L, parser.extractTimestampMillis(buildMessage(1L, 2, 1405970352L))); assertEquals(1405970352123L, parser.extractTimestampMillis(buildMessage(1L, 2, 1405970352123L))); } @Test(expected = NullPointerException.class) public void testAttemptExtractInvalidField() throws Exception { Mockito.when(mConfig.getMessageTimestampName()).thenReturn("requiredField"); Mockito.when(mConfig.getMessageTimestampId()).thenReturn(2); Mockito.when(mConfig.getMessageTimestampType()).thenReturn("i64"); ThriftMessageParser parser = new ThriftMessageParser(mConfig); parser.extractTimestampMillis(buildMessage(1L, 2, 3L)); } }