/** * Copyright 2016, Xiaomi. * All rights reserved. * Author: xiajun@xiaomi.com */ package com.xiaomi.infra.galaxy.lcs.log.core.appender; import java.util.ArrayList; import java.util.List; import java.util.NavigableMap; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mockito; import com.xiaomi.infra.galaxy.lcs.log.core.ILogger; import com.xiaomi.infra.galaxy.lcs.log.core.dummy.DummyLogger; import com.xiaomi.infra.galaxy.talos.client.serialization.MessageSerialization; import com.xiaomi.infra.galaxy.talos.client.serialization.MessageSerializationFactory; import com.xiaomi.infra.galaxy.talos.thrift.Message; import com.xiaomi.infra.galaxy.talos.thrift.MessageType; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.times; public class LCSAppenderTest { private interface TestHandler { public void doStart(); public void doFlushMessage(List<Message> messageList) throws Exception; public void doPeriodCheck(); public void doClose(); } private class LCSAppenderImpl extends LCSAppender { private TestHandler testHandler; private LCSAppenderImpl(ILogger logger, TestHandler testHandler) { super(logger); this.testHandler = testHandler; } @Override protected void doStart() { testHandler.doStart(); } @Override protected void doFlushMessage(List<Message> messageList) throws Exception { testHandler.doFlushMessage(messageList); } @Override protected void doPeriodCheck() { testHandler.doPeriodCheck(); } @Override protected void doClose() { testHandler.doClose(); } } private static String topicName; private static Message message; private static List<Message> messageList; private TestHandler testHandler; private LCSAppenderImpl lcsAppender; @BeforeClass public static void setUpTestCase() throws Exception { topicName = "LCSAppenderTestTopic"; message = new Message(); message.setCreateTimestamp(System.currentTimeMillis()); message.setMessageType(MessageType.BINARY); message.setSequenceNumber("sequenceNumber"); message.setMessage("message".getBytes()); messageList = new ArrayList<Message>(1); messageList.add(message); } @Before public void setUp() throws Exception { testHandler = Mockito.mock(TestHandler.class); lcsAppender = new LCSAppenderImpl(new DummyLogger(), testHandler); lcsAppender.setTopicName(topicName); } @Test public void testFlushByMessageNumber() throws Exception { InOrder inOrder = inOrder(testHandler); lcsAppender.setFlushIntervalMillis(10000000); lcsAppender.setFlushMessageNumber(1); doNothing().when(testHandler).doStart(); lcsAppender.start(); inOrder.verify(testHandler, times(1)).doStart(); doNothing().when(testHandler).doFlushMessage(anyList()); lcsAppender.addMessage(message); // wait Thread.sleep(100); inOrder.verify(testHandler, times(1)).doFlushMessage(anyList()); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doClose(); lcsAppender.close(); inOrder.verify(testHandler, times(1)).doClose(); inOrder.verifyNoMoreInteractions(); } @Test public void testFlushByMessageBytes() throws Exception { InOrder inOrder = inOrder(testHandler); lcsAppender.setFlushIntervalMillis(10000000); lcsAppender.setFlushMessageBytes(MessageSerialization.getMessageSize(message, MessageSerializationFactory.getDefaultMessageVersion())); doNothing().when(testHandler).doStart(); lcsAppender.start(); inOrder.verify(testHandler, times(1)).doStart(); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doClose(); lcsAppender.close(); inOrder.verify(testHandler, times(1)).doClose(); inOrder.verifyNoMoreInteractions(); } @Test public void testFlushMessageByTime() throws Exception { InOrder inOrder = inOrder(testHandler); lcsAppender.setFlushIntervalMillis(100); doNothing().when(testHandler).doStart(); lcsAppender.start(); inOrder.verify(testHandler, times(1)).doStart(); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100 * 2); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100 * 2); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doClose(); lcsAppender.close(); inOrder.verify(testHandler, times(1)).doClose(); inOrder.verifyNoMoreInteractions(); } @Test public void testFlushMessageFailed() throws Exception { InOrder inOrder = inOrder(testHandler); lcsAppender.setFlushMessageNumber(1); lcsAppender.setFlushIntervalMillis(10000000); doNothing().when(testHandler).doStart(); lcsAppender.start(); inOrder.verify(testHandler, times(1)).doStart(); doThrow(new Exception()).doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100); inOrder.verify(testHandler, times(2)).doFlushMessage(messageList); doNothing().when(testHandler).doFlushMessage(messageList); lcsAppender.addMessage(message); Thread.sleep(100); inOrder.verify(testHandler, times(1)).doFlushMessage(messageList); doNothing().when(testHandler).doClose(); lcsAppender.close(); inOrder.verify(testHandler, times(1)).doClose(); inOrder.verifyNoMoreInteractions(); } @Test public void testPeriodCheck() throws Exception { InOrder inOrder = inOrder(testHandler); lcsAppender.setFlushIntervalMillis(10000000); lcsAppender.setPeriodCheckIntervalMillis(200); doNothing().when(testHandler).doStart(); lcsAppender.start(); inOrder.verify(testHandler, times(1)).doStart(); doNothing().when(testHandler).doPeriodCheck(); Thread.sleep(200 + 50); inOrder.verify(testHandler).doPeriodCheck(); doNothing().when(testHandler).doClose(); lcsAppender.close(); inOrder.verify(testHandler, times(1)).doClose(); inOrder.verifyNoMoreInteractions(); } }