package tv.dyndns.kishibe.qmaclone.server.websocket; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.eclipse.jetty.websocket.api.RemoteEndpoint; import org.eclipse.jetty.websocket.api.Session; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import tv.dyndns.kishibe.qmaclone.server.ThreadPool; @RunWith(MockitoJUnitRunner.class) public class MessageSenderTest { public static class FakeMessage { } private static final String MESSAGE = "message"; @Mock private ThreadPool mockThreadPool; @Mock private Session mockSession; @Mock private RemoteEndpoint mockRemoteEndpoint; @SuppressWarnings("rawtypes") @Mock private ScheduledFuture mockScheduledFuture; private MessageSender<FakeMessage> sender; @SuppressWarnings("unchecked") @Before public void setUp() throws Exception { when(mockThreadPool.scheduleAtFixedRate(any(Runnable.class), eq(25L), eq(25L), eq(TimeUnit.SECONDS))).thenReturn(mockScheduledFuture); sender = new MessageSender<MessageSenderTest.FakeMessage>(mockThreadPool) { @Override protected String encode(FakeMessage data) { return MESSAGE; } }; } @Test public void sendSendsMessage() { when(mockSession.getRemote()).thenReturn(mockRemoteEndpoint); sender.join(mockSession); sender.send(new FakeMessage()); verify(mockRemoteEndpoint).sendString(eq(MESSAGE), any()); } @Test public void closeClosesSession() { sender.join(mockSession); sender.close(); verify(mockSession).close(); verify(mockScheduledFuture).cancel(false); } @Test public void byeRemovesSession() { sender.join(mockSession); sender.close(); sender.send(new FakeMessage()); verify(mockRemoteEndpoint, times(0)).sendString(eq(MESSAGE), any()); } }