diff options
author | Paul Hawke <paul.hawke@gmail.com> | 2014-04-24 23:21:55 -0500 |
---|---|---|
committer | Paul Hawke <paul.hawke@gmail.com> | 2014-04-24 23:21:55 -0500 |
commit | 84a1ab453aafe41149fab0e663b49d85cf0896cb (patch) | |
tree | 0e858c7fa82ea5b6971781e73329945018a15de7 /websocket/src/test | |
parent | 44f52c7b241f235d887ab57bf0ffd97a8ce0f5c4 (diff) | |
download | nanohttpd-84a1ab453aafe41149fab0e663b49d85cf0896cb.tar.gz |
Simplified the test using Mockito, and expanded what was being tested along with some other minor cleanup
Diffstat (limited to 'websocket/src/test')
6 files changed, 136 insertions, 236 deletions
diff --git a/websocket/src/test/java/fi/iki/elonen/DebugWebSocket.java b/websocket/src/test/java/fi/iki/elonen/DebugWebSocket.java deleted file mode 100644 index e6c66ad..0000000 --- a/websocket/src/test/java/fi/iki/elonen/DebugWebSocket.java +++ /dev/null @@ -1,61 +0,0 @@ -package fi.iki.elonen; - -import java.io.IOException; - -/** -* @author Paul S. Hawke (paul.hawke@gmail.com) -* On: 4/23/14 at 10:34 PM -*/ -class DebugWebSocket extends WebSocket { - private final boolean DEBUG; - - public DebugWebSocket(NanoHTTPD.IHTTPSession handshake, boolean debug) { - super(handshake); - DEBUG = debug; - } - - @Override - protected void onPong(WebSocketFrame pongFrame) { - if (DEBUG) { - System.out.println("P " + pongFrame); - } - } - - @Override - protected void onMessage(WebSocketFrame messageFrame) { - try { - messageFrame.setUnmasked(); - sendFrame(messageFrame); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - protected void onClose(WebSocketFrame.CloseCode code, String reason, boolean initiatedByRemote) { - if (DEBUG) { - System.out.println("C [" + (initiatedByRemote ? "Remote" : "Self") + "] " + (code != null ? code : "UnknownCloseCode[" + code + "]") + (reason != null && !reason.isEmpty() ? ": " + reason : "")); - } - } - - @Override - protected void onException(IOException e) { - e.printStackTrace(); - } - - @Override - protected void handleWebsocketFrame(WebSocketFrame frame) throws IOException { - if (DEBUG) { - System.out.println("R " + frame); - } - super.handleWebsocketFrame(frame); - } - - @Override - public synchronized void sendFrame(WebSocketFrame frame) throws IOException { - if (DEBUG) { - System.out.println("S " + frame); - } - super.sendFrame(frame); - } -} diff --git a/websocket/src/test/java/fi/iki/elonen/DebugWebSocketServer.java b/websocket/src/test/java/fi/iki/elonen/DebugWebSocketServer.java deleted file mode 100644 index 1f39be1..0000000 --- a/websocket/src/test/java/fi/iki/elonen/DebugWebSocketServer.java +++ /dev/null @@ -1,19 +0,0 @@ -package fi.iki.elonen; - -/** -* @author Paul S. Hawke (paul.hawke@gmail.com) -* On: 4/23/14 at 10:31 PM -*/ -class DebugWebSocketServer extends NanoWebSocketServer { - private final boolean debug; - - public DebugWebSocketServer(int port, boolean debug) { - super(port); - this.debug = debug; - } - - @Override - public WebSocket openWebSocket(IHTTPSession handshake) { - return new DebugWebSocket(handshake, debug); - } -} diff --git a/websocket/src/test/java/fi/iki/elonen/EchoSocketSample.java b/websocket/src/test/java/fi/iki/elonen/EchoSocketSample.java deleted file mode 100644 index 091dfc0..0000000 --- a/websocket/src/test/java/fi/iki/elonen/EchoSocketSample.java +++ /dev/null @@ -1,20 +0,0 @@ -package fi.iki.elonen; - -import java.io.IOException; - -public class EchoSocketSample { - public static void main(String[] args) throws IOException { - final boolean debugMode = args.length >= 2 && args[1].toLowerCase().equals("-d"); - NanoWebSocketServer ws = new DebugWebSocketServer(Integer.parseInt(args[0]), debugMode); - ws.start(); - System.out.println("Server started, hit Enter to stop.\n"); - try { - System.in.read(); - } catch (IOException ignored) { - } - ws.stop(); - System.out.println("Server stopped.\n"); - } - -} - diff --git a/websocket/src/test/java/fi/iki/elonen/NanoWebSocketServerTest.java b/websocket/src/test/java/fi/iki/elonen/NanoWebSocketServerTest.java new file mode 100644 index 0000000..7cd06b7 --- /dev/null +++ b/websocket/src/test/java/fi/iki/elonen/NanoWebSocketServerTest.java @@ -0,0 +1,41 @@ +package fi.iki.elonen; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class NanoWebSocketServerTest { + @Mock + private NanoHTTPD.IHTTPSession session; + + private NanoWebSocketServer server; + + @Before + public void setUp() { + server = new NanoWebSocketServer(9090); + } + + @Test(expected = Error.class) + public void testMissingResponseFactoryThrowsErrorOnServe() { + server.openWebSocket(session); + } + + @Test + public void testMissingResponseFactoryThrowsErrorWithCorrectMessageOnServe() { + NanoWebSocketServer server = new NanoWebSocketServer(9090); + try { + server.openWebSocket(session); + } catch (Error e) { + assertEquals(NanoWebSocketServer.MISSING_FACTORY_MESSAGE, e.getMessage()); + } + } +}
\ No newline at end of file diff --git a/websocket/src/test/java/fi/iki/elonen/WebSocketResponseHandlerTest.java b/websocket/src/test/java/fi/iki/elonen/WebSocketResponseHandlerTest.java index c007fde..04a497b 100644 --- a/websocket/src/test/java/fi/iki/elonen/WebSocketResponseHandlerTest.java +++ b/websocket/src/test/java/fi/iki/elonen/WebSocketResponseHandlerTest.java @@ -1,97 +1,120 @@ package fi.iki.elonen; -import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; import org.junit.Test; import fi.iki.elonen.NanoHTTPD.IHTTPSession; import fi.iki.elonen.NanoHTTPD.Response; -import fi.iki.elonen.WebSocketFrame.CloseCode; -import fi.iki.elonen.testutil.MockHttpSession; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + import static junit.framework.Assert.*; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +@RunWith(MockitoJUnitRunner.class) public class WebSocketResponseHandlerTest { - private WebSocketResponseHandler responseHandler = new WebSocketResponseHandler(new DummyWebSocketFactory( - new WebSocketAdapter(new MockHttpSession()))); - + + @Mock + private IHTTPSession session; + @Mock + private WebSocket webSocket; + @Mock + private IWebSocketFactory webSocketFactory; + @Mock + private Response response; + @Captor + private ArgumentCaptor<String> headerNameCaptor; + @Captor + private ArgumentCaptor<String> headerCaptor; + + private Map<String, String> headers; + + private WebSocketResponseHandler responseHandler; + + @Before + public void setUp() { + headers = new HashMap<String, String>(); + headers.put("upgrade", "websocket"); + headers.put("connection", "Upgrade"); + headers.put("sec-websocket-key", "x3JJHMbDL1EzLkh9GBhXDw=="); + headers.put("sec-websocket-protocol", "chat, superchat"); + headers.put("sec-websocket-version", "13"); + + when(session.getHeaders()).thenReturn(headers); + when(webSocketFactory.openWebSocket(any(IHTTPSession.class))).thenReturn(webSocket); + when(webSocket.getHandshakeResponse()).thenReturn(response); + + responseHandler = new WebSocketResponseHandler(webSocketFactory); + } + + @Test + public void testHandshakeReturnsResponseWithExpectedHeaders() { + Response handshakeResponse = responseHandler.serve(session); + + verify(webSocket).getHandshakeResponse(); + assertNotNull(handshakeResponse); + assertSame(response, handshakeResponse); + + verify(response, atLeast(1)).addHeader(headerNameCaptor.capture(), headerCaptor.capture()); + assertHeader(0, "sec-websocket-accept", "HSmrc0sMlYUkAGmm5OPpG2HaGWk="); + assertHeader(1, "sec-websocket-protocol", "chat"); + } + @Test - public void testHandshake_returnsExpectedHeaders() { - MockHttpSession session = createWebSocketHandshakeRequest(); + public void testWrongWebsocketVersionReturnsErrorResponse() { + headers.put("sec-websocket-version", "12"); Response handshakeResponse = responseHandler.serve(session); - + assertNotNull(handshakeResponse); - assertEquals(101, handshakeResponse.getStatus().getRequestStatus()); - assertEquals("101 Switching Protocols", handshakeResponse.getStatus().getDescription()); - assertEquals("websocket", handshakeResponse.getHeader("upgrade")); - assertEquals("Upgrade", handshakeResponse.getHeader("connection")); - assertEquals("HSmrc0sMlYUkAGmm5OPpG2HaGWk=", handshakeResponse.getHeader("sec-websocket-accept")); - assertEquals("chat", handshakeResponse.getHeader("sec-websocket-protocol")); + assertEquals(Response.Status.BAD_REQUEST, handshakeResponse.getStatus()); } - + @Test - public void testWrongWebsocketVersion_returnsErrorResponse() { - MockHttpSession session = createWebSocketHandshakeRequest(); - session.getHeaders().put("sec-websocket-version", "12"); + public void testMissingKeyReturnsErrorResponse() { + headers.remove("sec-websocket-key"); Response handshakeResponse = responseHandler.serve(session); - + assertNotNull(handshakeResponse); - assertEquals(400, handshakeResponse.getStatus().getRequestStatus()); - assertEquals("400 Bad Request", handshakeResponse.getStatus().getDescription()); + assertEquals(Response.Status.BAD_REQUEST, handshakeResponse.getStatus()); } - private MockHttpSession createWebSocketHandshakeRequest() { - // Example headers copied from Wikipedia - MockHttpSession session = new MockHttpSession(); - session.getHeaders().put("upgrade", "websocket"); - session.getHeaders().put("connection", "Upgrade"); - session.getHeaders().put("sec-websocket-key", "x3JJHMbDL1EzLkh9GBhXDw=="); - session.getHeaders().put("sec-websocket-protocol", "chat, superchat"); - session.getHeaders().put("sec-websocket-version", "13"); - return session; + @Test + public void testWrongUpgradeHeaderReturnsNullResponse() { + headers.put("upgrade", "not a websocket"); + Response handshakeResponse = responseHandler.serve(session); + assertNull(handshakeResponse); } - - private static class DummyWebSocketFactory implements WebSocketFactory { - private final WebSocket webSocket; - - private DummyWebSocketFactory(WebSocket webSocket) { - super(); - this.webSocket = webSocket; - } - - @Override - public WebSocket openWebSocket(IHTTPSession handshake) { - return webSocket; - } + + @Test + public void testWrongConnectionHeaderReturnsNullResponse() { + headers.put("connection", "Junk"); + Response handshakeResponse = responseHandler.serve(session); + assertNull(handshakeResponse); } - - private static class WebSocketAdapter extends WebSocket { - - public WebSocketAdapter(IHTTPSession handshakeRequest) { - super(handshakeRequest); - } - - @Override - protected void onPong(WebSocketFrame pongFrame) { - throw new Error("this method should not have been called"); - } - - @Override - protected void onMessage(WebSocketFrame messageFrame) { - throw new Error("this method should not have been called"); - } - - @Override - protected void onClose(CloseCode code, String reason, - boolean initiatedByRemote) { - throw new Error("this method should not have been called"); - } - - @Override - protected void onException(IOException e) { - throw new Error("this method should not have been called"); - } - + + @Test + public void testConnectionHeaderHandlesKeepAlive_FixingFirefoxConnectIssue() { + headers.put("connection", "keep-alive, Upgrade"); + Response handshakeResponse = responseHandler.serve(session); + + verify(webSocket).getHandshakeResponse(); + assertNotNull(handshakeResponse); + assertSame(response, handshakeResponse); + } + + private void assertHeader(int index, String name, String value) { + assertEquals(name, headerNameCaptor.getAllValues().get(index)); + assertEquals(value, headerCaptor.getAllValues().get(index)); } } diff --git a/websocket/src/test/java/fi/iki/elonen/testutil/MockHttpSession.java b/websocket/src/test/java/fi/iki/elonen/testutil/MockHttpSession.java deleted file mode 100644 index 8d82218..0000000 --- a/websocket/src/test/java/fi/iki/elonen/testutil/MockHttpSession.java +++ /dev/null @@ -1,64 +0,0 @@ -package fi.iki.elonen.testutil; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import fi.iki.elonen.NanoHTTPD.CookieHandler; -import fi.iki.elonen.NanoHTTPD.IHTTPSession; -import fi.iki.elonen.NanoHTTPD.Method; -import fi.iki.elonen.NanoHTTPD.ResponseException; - -public class MockHttpSession implements IHTTPSession { - - private Map<String, String> params = new HashMap<String, String>(); - private Map<String, String> headers = new HashMap<String, String>(); - - @Override - public void execute() throws IOException { - - } - - @Override - public Map<String, String> getParms() { - return params; - } - - @Override - public Map<String, String> getHeaders() { - return headers; - } - - @Override - public String getUri() { - return null; - } - - @Override - public String getQueryParameterString() { - return null; - } - - @Override - public Method getMethod() { - return null; - } - - @Override - public InputStream getInputStream() { - return null; - } - - @Override - public CookieHandler getCookies() { - return null; - } - - @Override - public void parseBody(Map<String, String> files) throws IOException, - ResponseException { - - } - -} |