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.PacketReadyForGame;
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.ReadyForGameWebSocketServlet.ReadyForGameWebSocket;
@RunWith(MockitoJUnitRunner.class)
public class ReadyForGameWebSocketServletTest {
@Mock
private GameManager mockGameManager;
@Mock
private Session mockSession;
@Mock
private MessageSender<PacketReadyForGame> mockMessageSender;
@Mock
private WebSocketServletFactory mockWebSocketServletFactory;
@Mock
private Game mockGame;
private FakeUpgradeRequest fakeUpgradeRequest;
private ReadyForGameWebSocketServlet servlet;
private ReadyForGameWebSocket webSocket;
@Before
public void setUp() throws Exception {
servlet = new ReadyForGameWebSocketServlet(mockGameManager);
webSocket = new ReadyForGameWebSocket();
fakeUpgradeRequest = new FakeUpgradeRequest();
}
@Test
public void onConnectJoinsSessionToReadyForGameMessageSender() 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.getReadyForGameMessageSender()).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.getReadyForGameMessageSender()).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 onCloseByesSessionFromReadyForGameMessageSender() 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.getReadyForGameMessageSender()).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 onErrorByesSessionFromReadyForGameMessageSender() 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.getReadyForGameMessageSender()).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 configureRegistersReadyForGameWebSocket() {
servlet.configure(mockWebSocketServletFactory);
verify(mockWebSocketServletFactory).register(ReadyForGameWebSocket.class);
}
}