aboutsummaryrefslogtreecommitdiff
path: root/websocket/src/test
diff options
context:
space:
mode:
authorPaul Hawke <paul.hawke@gmail.com>2014-04-24 23:21:55 -0500
committerPaul Hawke <paul.hawke@gmail.com>2014-04-24 23:21:55 -0500
commit84a1ab453aafe41149fab0e663b49d85cf0896cb (patch)
tree0e858c7fa82ea5b6971781e73329945018a15de7 /websocket/src/test
parent44f52c7b241f235d887ab57bf0ffd97a8ce0f5c4 (diff)
downloadnanohttpd-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')
-rw-r--r--websocket/src/test/java/fi/iki/elonen/DebugWebSocket.java61
-rw-r--r--websocket/src/test/java/fi/iki/elonen/DebugWebSocketServer.java19
-rw-r--r--websocket/src/test/java/fi/iki/elonen/EchoSocketSample.java20
-rw-r--r--websocket/src/test/java/fi/iki/elonen/NanoWebSocketServerTest.java41
-rw-r--r--websocket/src/test/java/fi/iki/elonen/WebSocketResponseHandlerTest.java167
-rw-r--r--websocket/src/test/java/fi/iki/elonen/testutil/MockHttpSession.java64
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 {
-
- }
-
-}