Updated Branches: refs/heads/master ff6a79e51 -> 6e655dacb
WICKET-5423 Create IResource based implementation of Native Web Sockets Add support for testing WebSocketResource and unit tests Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6e655dac Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6e655dac Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6e655dac Branch: refs/heads/master Commit: 6e655dacbd1663d6629e9c5d97749c45636680f1 Parents: ff6a79e Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Nov 21 17:20:04 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Nov 21 17:20:04 2013 +0200 ---------------------------------------------------------------------- .../ws/util/tester/TestWebSocketProcessor.java | 42 ++++- .../ws/util/tester/WebSocketTester.java | 36 +++- .../ws/util/tester/TestWebSocketResource.java | 104 +++++++++++ .../util/tester/WebSocketBehaviorTestPage.java | 83 +++++++++ .../ws/util/tester/WebSocketTestPage.java | 83 --------- .../tester/WebSocketTesterBehaviorTest.java | 178 +++++++++++++++++++ .../tester/WebSocketTesterResourceTest.java | 142 +++++++++++++++ .../ws/util/tester/WebSocketTesterTest.java | 177 ------------------ 8 files changed, 582 insertions(+), 263 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java index 0d79e9e..80642a8 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java @@ -48,6 +48,17 @@ abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor } /** + * Constructor. + * + * @param resourceName + * the name of the shared resource that will handle the web socket messages + */ + public TestWebSocketProcessor(final WicketTester wicketTester, final String resourceName) + { + super(createRequest(wicketTester, resourceName), wicketTester.getApplication()); + } + + /** * Creates an HttpServletRequest that is needed by AbstractWebSocketProcessor * * @param page @@ -57,14 +68,41 @@ abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor private static HttpServletRequest createRequest(final WicketTester wicketTester, final Page page) { Args.notNull(page, "page"); - Application application = page.getApplication(); + MockHttpServletRequest request = createRequest(wicketTester); + request.addParameter("pageId", page.getId()); + return request; + } + + /** + * Creates an HttpServletRequest that is needed by AbstractWebSocketProcessor + * + * @param resourceName + * the page that may have registered {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior} + * @return a mock http request + */ + private static HttpServletRequest createRequest(final WicketTester wicketTester, final String resourceName) + { + Args.notNull(resourceName, "resourceName"); + MockHttpServletRequest request = createRequest(wicketTester); + request.addParameter("resourceName", resourceName); + return request; + } + + /** + * Creates an HttpServletRequest that is needed by AbstractWebSocketProcessor + * + * @return a mock http request + */ + private static MockHttpServletRequest createRequest(final WicketTester wicketTester) + { + Application application = wicketTester.getApplication(); HttpSession httpSession = wicketTester.getHttpSession(); MockHttpServletRequest request = new MockHttpServletRequest(application, httpSession, null); - request.addParameter("pageId", page.getId()); request.addParameter(WebRequest.PARAM_AJAX_BASE_URL, "."); return request; } + /** * Setups TestWebSocketConnection. * http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTester.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTester.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTester.java index 761690b..4f8a9b5 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTester.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTester.java @@ -47,8 +47,42 @@ public class WebSocketTester WebApplication webApplication = wicketTester.getApplication(); webApplication.getWicketFilter().setFilterPath(""); - socketProcessor = new TestWebSocketProcessor(wicketTester, page) { + socketProcessor = new TestWebSocketProcessor(wicketTester, page) + { + @Override + protected void onOutMessage(String message) + { + WebSocketTester.this.onOutMessage(message); + } + + @Override + protected void onOutMessage(byte[] message, int offset, int length) + { + WebSocketTester.this.onOutMessage(message, offset, length); + } + }; + socketProcessor.onOpen(null); + } + + /** + * Constructor. + * + * Prepares a WebSockConnection that will be used to send messages from the client (the test case) + * to the server. + * + * @param resourceName + * the name of the shared WebSocketResource that will handle the web socket messages + */ + public WebSocketTester(final WicketTester wicketTester, final String resourceName) + { + Args.notNull(wicketTester, "wicketTester"); + Args.notNull(resourceName, "resourceName"); + + WebApplication webApplication = wicketTester.getApplication(); + webApplication.getWicketFilter().setFilterPath(""); + socketProcessor = new TestWebSocketProcessor(wicketTester, resourceName) + { @Override protected void onOutMessage(String message) { http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java new file mode 100644 index 0000000..2bee3f1 --- /dev/null +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.util.tester; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.util.string.Strings; +import org.junit.Assert; +import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler; +import org.apache.wicket.protocol.ws.api.WebSocketResource; +import org.apache.wicket.protocol.ws.api.message.BinaryMessage; +import org.apache.wicket.protocol.ws.api.message.ClosedMessage; +import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; +import org.apache.wicket.protocol.ws.api.message.TextMessage; + +/** + * + */ +public class TestWebSocketResource extends WebSocketResource +{ + static final String TEXT = "TestWebSocketResource-text"; + static final String BINARY = "TestWebSocketResource-binary"; + + static final AtomicBoolean ON_CONNECT_CALLED = new AtomicBoolean(false); + static final AtomicBoolean ON_CLOSE_CALLED = new AtomicBoolean(false); + + private final String expectedMessage; + + private final byte[] expectedBinaryMessage; + private final int expectedOffset; + private final int expectedLength; + + TestWebSocketResource(String expected) + { + this.expectedMessage = expected; + + this.expectedBinaryMessage = null; + this.expectedOffset = -1; + this.expectedLength = -1; + } + + TestWebSocketResource(byte[] message, int offset, int length) + { + this.expectedBinaryMessage = message; + this.expectedOffset = offset; + this.expectedLength = length; + + this.expectedMessage = null; + } + + @Override + protected void onConnect(ConnectedMessage message) + { + super.onConnect(message); + ON_CONNECT_CALLED.set(true); + } + + @Override + protected void onClose(ClosedMessage message) + { + ON_CLOSE_CALLED.set(true); + super.onClose(message); + } + + @Override + protected void onMessage(WebSocketRequestHandler handler, TextMessage message) + { + super.onMessage(handler, message); + + String text = message.getText(); + Assert.assertEquals(expectedMessage, text); + handler.push(Strings.capitalize(text)); + } + + @Override + protected void onMessage(WebSocketRequestHandler handler, BinaryMessage binaryMessage) + { + super.onMessage(handler, binaryMessage); + + byte[] data = binaryMessage.getData(); + int offset = binaryMessage.getOffset(); + int length = binaryMessage.getLength(); + + Assert.assertEquals(expectedBinaryMessage, data); + Assert.assertEquals(expectedOffset, offset); + Assert.assertEquals(expectedLength, length); + + handler.push(data, offset, length); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketBehaviorTestPage.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketBehaviorTestPage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketBehaviorTestPage.java new file mode 100644 index 0000000..affe977 --- /dev/null +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketBehaviorTestPage.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.util.tester; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.protocol.ws.api.WebSocketBehavior; +import org.apache.wicket.protocol.ws.api.message.BinaryMessage; +import org.apache.wicket.protocol.ws.api.message.TextMessage; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.apache.wicket.util.string.Strings; +import org.junit.Assert; + +/** + * A page used for {@link WebSocketTesterBehaviorTest} + * + * @since 6.0 + */ +class WebSocketBehaviorTestPage extends WebPage implements IMarkupResourceStreamProvider +{ + WebSocketBehaviorTestPage() + { + add(new WebSocketBehavior() {}); + } + + WebSocketBehaviorTestPage(final String expectedMessage) + { + add(new WebSocketBehavior() + { + @Override + protected void onMessage(WebSocketRequestHandler handler, TextMessage message) + { + // assert the inbould message + Assert.assertEquals(expectedMessage, message.getText()); + + // now send an outbound message + handler.push(Strings.capitalize(expectedMessage)); + } + }); + } + + WebSocketBehaviorTestPage(final byte[] message, final int offset, final int length) + { + add(new WebSocketBehavior() + { + @Override + protected void onMessage(WebSocketRequestHandler handler, BinaryMessage binaryMessage) + { + Assert.assertArrayEquals(message, binaryMessage.getData()); + Assert.assertEquals(offset, binaryMessage.getOffset()); + Assert.assertEquals(length, binaryMessage.getLength()); + + String msg = new String(message); + byte[] pushedMessage = Strings.capitalize(msg).getBytes(); + + handler.push(pushedMessage, offset + 1, length - 1); + } + }); + } + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html/>"); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java deleted file mode 100644 index 39eef88..0000000 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.wicket.protocol.ws.util.tester; - -import org.apache.wicket.MarkupContainer; -import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler; -import org.apache.wicket.markup.IMarkupResourceStreamProvider; -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.protocol.ws.api.WebSocketBehavior; -import org.apache.wicket.protocol.ws.api.message.BinaryMessage; -import org.apache.wicket.protocol.ws.api.message.TextMessage; -import org.apache.wicket.util.resource.IResourceStream; -import org.apache.wicket.util.resource.StringResourceStream; -import org.apache.wicket.util.string.Strings; -import org.junit.Assert; - -/** - * A page used for {@link WebSocketTesterTest} - * - * @since 6.0 - */ -class WebSocketTestPage extends WebPage implements IMarkupResourceStreamProvider -{ - WebSocketTestPage() - { - add(new WebSocketBehavior() {}); - } - - WebSocketTestPage(final String expectedMessage) - { - add(new WebSocketBehavior() - { - @Override - protected void onMessage(WebSocketRequestHandler handler, TextMessage message) - { - // assert the inbould message - Assert.assertEquals(expectedMessage, message.getText()); - - // now send an outbound message - handler.push(Strings.capitalize(expectedMessage)); - } - }); - } - - WebSocketTestPage(final byte[] message, final int offset, final int length) - { - add(new WebSocketBehavior() - { - @Override - protected void onMessage(WebSocketRequestHandler handler, BinaryMessage binaryMessage) - { - Assert.assertArrayEquals(message, binaryMessage.getData()); - Assert.assertEquals(offset, binaryMessage.getOffset()); - Assert.assertEquals(length, binaryMessage.getLength()); - - String msg = new String(message); - byte[] pushedMessage = Strings.capitalize(msg).getBytes(); - - handler.push(pushedMessage, offset + 1, length - 1); - } - }); - } - - @Override - public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) - { - return new StringResourceStream("<html/>"); - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java new file mode 100644 index 0000000..ce123cb --- /dev/null +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.util.tester; + +import java.io.UnsupportedEncodingException; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.event.IEvent; +import org.apache.wicket.protocol.ws.IWebSocketSettings; +import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster; +import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; +import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; +import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; +import org.apache.wicket.protocol.ws.api.registry.PageIdKey; +import org.apache.wicket.util.string.Strings; +import org.apache.wicket.util.tester.WicketTester; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Tests for WebSocketTester. + * Uses WebSocketBehavior. + * + * @since 6.0 + */ +public class WebSocketTesterBehaviorTest extends Assert +{ + WicketTester tester; + + @Before + public void before() + { + tester = new WicketTester(); + } + + @After + public void after() + { + tester.destroy(); + } + + /** + * A simple test that sends and receives a text message. + * The page asserts that it received the correct message and then + * pushed back the same message but capitalized. + */ + @Test + public void sendTextMessageBehavior() + { + final String expectedMessage = "some message"; + + WebSocketBehaviorTestPage page = new WebSocketBehaviorTestPage(expectedMessage); + tester.startPage(page); + + WebSocketTester webSocketTester = new WebSocketTester(tester, page) { + @Override + protected void onOutMessage(String message) + { + assertEquals(Strings.capitalize(expectedMessage), message); + } + }; + + webSocketTester.sendMessage(expectedMessage); + webSocketTester.destroy(); + } + + /** + * A simple test that sends and receives a binary message. + * The page asserts that it received the correct message, offset and lenght and then + * pushes back the same message but capitalized, offset plus 1 and length minus 1. + */ + @Test + public void sendBinaryMessageBehavior() throws UnsupportedEncodingException + { + final byte[] expectedMessage = "some message".getBytes("UTF-8"); + final int offset = 1; + final int length = 2; + + WebSocketBehaviorTestPage page = new WebSocketBehaviorTestPage(expectedMessage, offset, length); + tester.startPage(page); + + WebSocketTester webSocketTester = new WebSocketTester(tester, page) { + @Override + protected void onOutMessage(byte[] message, int off, int len) + { + try + { + String msg = new String(expectedMessage); + byte[] pushedMessage = Strings.capitalize(msg).getBytes("UTF-8"); + + assertArrayEquals(pushedMessage, message); + assertEquals(offset + 1, off); + assertEquals(length - 1, len); + + } catch (UnsupportedEncodingException uex) + { + throw new RuntimeException(uex); + } + } + }; + + webSocketTester.sendMessage(expectedMessage, offset, length); + webSocketTester.destroy(); + } + + @Test + public void serverSideBroadcast() + { + final String message = "Broadcasted Message"; + + final AtomicBoolean messageReceived = new AtomicBoolean(false); + + WebSocketBehaviorTestPage page = new WebSocketBehaviorTestPage() + { + @Override + public void onEvent(IEvent<?> event) + { + super.onEvent(event); + + if (event.getPayload() instanceof WebSocketPushPayload) + { + WebSocketPushPayload payload = (WebSocketPushPayload) event.getPayload(); + + if (payload.getMessage() instanceof BroadcastMessage) + { + BroadcastMessage broadcastMessage = (BroadcastMessage) payload.getMessage(); + if (message.equals(broadcastMessage.getText())) + { + messageReceived.set(true); + } + } + } + } + }; + tester.startPage(page); + tester.getSession().bind(); + + new WebSocketTester(tester, page); + IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(tester.getApplication()); + WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry()); + ConnectedMessage wsMessage = new ConnectedMessage(tester.getApplication(), + tester.getHttpSession().getId(), new PageIdKey(page.getPageId())); + broadcaster.broadcast(wsMessage, new BroadcastMessage(message)); + + assertEquals(true, messageReceived.get()); + } + + private static class BroadcastMessage implements IWebSocketPushMessage + { + private final String message; + + private BroadcastMessage(String message) + { + this.message = message; + } + + public String getText() + { + return message; + } + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterResourceTest.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterResourceTest.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterResourceTest.java new file mode 100644 index 0000000..d64c35d --- /dev/null +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterResourceTest.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.util.tester; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.mock.MockApplication; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.util.string.Strings; +import org.apache.wicket.util.tester.WicketTester; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Tests for WebSocketTester. + * Uses WebSocketBehavior. + * + * @since 6.0 + */ +public class WebSocketTesterResourceTest extends Assert +{ + private static final String EXPECTED_TEXT = "expected text"; + private static final byte[] EXPECTED_BINARY = new byte[] {1, 2, 3}; + private static final int EXPECTED_OFFSET = 1; + private static final int EXPECTED_LENGTH = 1; + + private static final AtomicBoolean ON_OUT_TEXT_CALLED = new AtomicBoolean(false); + private static final AtomicBoolean ON_OUT_BINARY_CALLED = new AtomicBoolean(false); + + WicketTester tester; + + @Before + public void before() + { + TestWebSocketResource.ON_CONNECT_CALLED.set(false); + TestWebSocketResource.ON_CLOSE_CALLED.set(false); + ON_OUT_BINARY_CALLED.set(false); + ON_OUT_TEXT_CALLED.set(false); + + WebApplication application = new MockApplication() + { + @Override + protected void init() + { + super.init(); + + getSharedResources().add(TestWebSocketResource.TEXT, + new TestWebSocketResource(EXPECTED_TEXT)); + + getSharedResources().add(TestWebSocketResource.BINARY, + new TestWebSocketResource(EXPECTED_BINARY, EXPECTED_OFFSET, EXPECTED_LENGTH)); + } + }; + tester = new WicketTester(application); + } + + @After + public void after() + { + tester.destroy(); + } + + /** + * A simple test that sends and receives a text message. + * The page asserts that it received the correct message and then + * pushed back the same message but capitalized. + */ + @Test + public void sendTextMessage() + { + assertFalse(TestWebSocketResource.ON_CONNECT_CALLED.get()); + + WebSocketTester webSocketTester = new WebSocketTester(tester, TestWebSocketResource.TEXT) + { + @Override + protected void onOutMessage(String message) + { + ON_OUT_TEXT_CALLED.set(true); + assertEquals(Strings.capitalize(EXPECTED_TEXT), message); + } + }; + + assertTrue(TestWebSocketResource.ON_CONNECT_CALLED.get()); + assertFalse(ON_OUT_TEXT_CALLED.get()); + + webSocketTester.sendMessage(EXPECTED_TEXT); + assertTrue(ON_OUT_TEXT_CALLED.get()); + + assertFalse(TestWebSocketResource.ON_CLOSE_CALLED.get()); + webSocketTester.destroy(); + assertTrue(TestWebSocketResource.ON_CLOSE_CALLED.get()); + } + + /** + * A simple test that sends and receives a text message. + * The page asserts that it received the correct message and then + * pushed back the same message but capitalized. + */ + @Test + public void sendBinaryMessage() + { + assertFalse(TestWebSocketResource.ON_CONNECT_CALLED.get()); + + WebSocketTester webSocketTester = new WebSocketTester(tester, TestWebSocketResource.BINARY) + { + @Override + protected void onOutMessage(byte[] message, int offset, int length) + { + ON_OUT_BINARY_CALLED.set(true); + Assert.assertArrayEquals(EXPECTED_BINARY, message); + Assert.assertEquals(offset, offset); + Assert.assertEquals(length, length); + } + }; + + assertTrue(TestWebSocketResource.ON_CONNECT_CALLED.get()); + assertFalse(ON_OUT_BINARY_CALLED.get()); + + webSocketTester.sendMessage(EXPECTED_BINARY, EXPECTED_OFFSET, EXPECTED_LENGTH); + assertTrue(ON_OUT_BINARY_CALLED.get()); + + assertFalse(TestWebSocketResource.ON_CLOSE_CALLED.get()); + webSocketTester.destroy(); + assertTrue(TestWebSocketResource.ON_CLOSE_CALLED.get()); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/6e655dac/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java deleted file mode 100644 index cb66c0d..0000000 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.wicket.protocol.ws.util.tester; - -import java.io.UnsupportedEncodingException; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.apache.wicket.event.IEvent; -import org.apache.wicket.protocol.ws.IWebSocketSettings; -import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster; -import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; -import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; -import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; -import org.apache.wicket.protocol.ws.api.registry.PageIdKey; -import org.apache.wicket.util.string.Strings; -import org.apache.wicket.util.tester.WicketTester; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Tests for WebSocketTester. - * - * @since 6.0 - */ -public class WebSocketTesterTest extends Assert -{ - WicketTester tester; - - @Before - public void before() - { - tester = new WicketTester(); - } - - @After - public void after() - { - tester.destroy(); - } - - /** - * A simple test that sends and receives a text message. - * The page asserts that it received the correct message and then - * pushed back the same message but capitalized. - */ - @Test - public void sendTextMessage() - { - final String expectedMessage = "some message"; - - WebSocketTestPage page = new WebSocketTestPage(expectedMessage); - tester.startPage(page); - - WebSocketTester webSocketTester = new WebSocketTester(tester, page) { - @Override - protected void onOutMessage(String message) - { - assertEquals(Strings.capitalize(expectedMessage), message); - } - }; - - webSocketTester.sendMessage(expectedMessage); - webSocketTester.destroy(); - } - - /** - * A simple test that sends and receives a binary message. - * The page asserts that it received the correct message, offset and lenght and then - * pushes back the same message but capitalized, offset plus 1 and length minus 1. - */ - @Test - public void sendBinaryMessage() throws UnsupportedEncodingException - { - final byte[] expectedMessage = "some message".getBytes("UTF-8"); - final int offset = 1; - final int length = 2; - - WebSocketTestPage page = new WebSocketTestPage(expectedMessage, offset, length); - tester.startPage(page); - - WebSocketTester webSocketTester = new WebSocketTester(tester, page) { - @Override - protected void onOutMessage(byte[] message, int off, int len) - { - try - { - String msg = new String(expectedMessage); - byte[] pushedMessage = Strings.capitalize(msg).getBytes("UTF-8"); - - assertArrayEquals(pushedMessage, message); - assertEquals(offset + 1, off); - assertEquals(length - 1, len); - - } catch (UnsupportedEncodingException uex) - { - throw new RuntimeException(uex); - } - } - }; - - webSocketTester.sendMessage(expectedMessage, offset, length); - webSocketTester.destroy(); - } - - @Test - public void serverSideBroadcast() - { - final String message = "Broadcasted Message"; - - final AtomicBoolean messageReceived = new AtomicBoolean(false); - - WebSocketTestPage page = new WebSocketTestPage() - { - @Override - public void onEvent(IEvent<?> event) - { - super.onEvent(event); - - if (event.getPayload() instanceof WebSocketPushPayload) - { - WebSocketPushPayload payload = (WebSocketPushPayload) event.getPayload(); - - if (payload.getMessage() instanceof BroadcastMessage) - { - BroadcastMessage broadcastMessage = (BroadcastMessage) payload.getMessage(); - if (message.equals(broadcastMessage.getText())) - { - messageReceived.set(true); - } - } - } - } - }; - tester.startPage(page); - tester.getSession().bind(); - - new WebSocketTester(tester, page); - IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(tester.getApplication()); - WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry()); - ConnectedMessage wsMessage = new ConnectedMessage(tester.getApplication(), - tester.getHttpSession().getId(), new PageIdKey(page.getPageId())); - broadcaster.broadcast(wsMessage, new BroadcastMessage(message)); - - assertEquals(true, messageReceived.get()); - } - - private static class BroadcastMessage implements IWebSocketPushMessage - { - private final String message; - - private BroadcastMessage(String message) - { - this.message = message; - } - - public String getText() - { - return message; - } - } -}
