package tv.dyndns.kishibe.qmaclone.server.websocket; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.net.InetSocketAddress; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import tv.dyndns.kishibe.qmaclone.client.constant.Constant; import tv.dyndns.kishibe.qmaclone.client.packet.PacketMatchingStatus; import tv.dyndns.kishibe.qmaclone.server.Game; import tv.dyndns.kishibe.qmaclone.server.GameManager; import tv.dyndns.kishibe.qmaclone.server.exception.GameNotFoundException; import tv.dyndns.kishibe.qmaclone.server.websocket.MatchingStatusWebSocketServlet.MatchingStatusWebSocket; @RunWith(MockitoJUnitRunner.class) public class MatchingStatusWebSocketServletTest { @Mock private GameManager mockGameManager; @Mock private Session mockSession; @Mock private MessageSender<PacketMatchingStatus> mockMessageSender; @Mock private WebSocketServletFactory mockWebSocketServletFactory; @Mock private Game mockGame; private FakeUpgradeRequest fakeUpgradeRequest; private MatchingStatusWebSocketServlet servlet; private MatchingStatusWebSocket webSocket; @Before public void setUp() throws Exception { servlet = new MatchingStatusWebSocketServlet(mockGameManager); webSocket = new MatchingStatusWebSocket(); fakeUpgradeRequest = new FakeUpgradeRequest(); } @Test public void onConnectJoinsSessionToMatchingStatusMessageSender() throws Exception { fakeUpgradeRequest .setParameterMap(ImmutableMap.of(Constant.KEY_GAME_SESSION_ID, ImmutableList.of("121"))); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenReturn(mockGame); when(mockGame.getMatchingStatusMessageSender()).thenReturn(mockMessageSender); webSocket.onConnect(mockSession); verify(mockMessageSender).join(mockSession); } @Test public void onConnectClosesSessionIfFailedToParseGameSessionId() throws Exception { fakeUpgradeRequest.setParameterMap(ImmutableMap.of()); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenReturn(mockGame); when(mockGame.getMatchingStatusMessageSender()).thenReturn(mockMessageSender); webSocket.onConnect(mockSession); verify(mockSession).close(); } @Test public void onConnectClosesSessionIfGameSessionNotFound() throws Exception { fakeUpgradeRequest.setParameterMap(ImmutableMap.of()); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenThrow(new GameNotFoundException()); webSocket.onConnect(mockSession); verify(mockSession).close(); } @Test public void onCloseByesSessionFromMatchingStatusMessageSender() throws Exception { fakeUpgradeRequest .setParameterMap(ImmutableMap.of(Constant.KEY_GAME_SESSION_ID, ImmutableList.of("121"))); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenReturn(mockGame); when(mockGame.getMatchingStatusMessageSender()).thenReturn(mockMessageSender); webSocket.onConnect(mockSession); webSocket.onClose(0, ""); verify(mockMessageSender).bye(mockSession); } @Test public void onCloseClosesSessionIfGameSessionNotFound() throws Exception { fakeUpgradeRequest .setParameterMap(ImmutableMap.of(Constant.KEY_GAME_SESSION_ID, ImmutableList.of("121"))); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenThrow(new GameNotFoundException()); webSocket.onConnect(mockSession); webSocket.onClose(0, ""); verify(mockSession, times(2)).close(); } @Test public void onErrorByesSessionFromMatchingStatusMessageSender() throws Exception { fakeUpgradeRequest .setParameterMap(ImmutableMap.of(Constant.KEY_GAME_SESSION_ID, ImmutableList.of("121"))); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockSession.getRemoteAddress()).thenReturn(new InetSocketAddress(0)); when(mockGameManager.getSession(121)).thenReturn(mockGame); when(mockGame.getMatchingStatusMessageSender()).thenReturn(mockMessageSender); webSocket.onConnect(mockSession); webSocket.onError(new Exception()); verify(mockMessageSender).bye(mockSession); } @Test public void onErrorClosesSessionIfGameSessionNotFound() throws Exception { fakeUpgradeRequest .setParameterMap(ImmutableMap.of(Constant.KEY_GAME_SESSION_ID, ImmutableList.of("121"))); when(mockSession.getUpgradeRequest()).thenReturn(fakeUpgradeRequest); when(mockGameManager.getSession(121)).thenThrow(new GameNotFoundException()); when(mockSession.getRemoteAddress()).thenReturn(new InetSocketAddress(0)); webSocket.onConnect(mockSession); webSocket.onError(new Exception()); verify(mockSession, times(2)).close(); } @Test public void configureRegistersMatchingStatusWebSocket() { servlet.configure(mockWebSocketServletFactory); verify(mockWebSocketServletFactory).register(MatchingStatusWebSocket.class); } }