Updated Branches: refs/heads/master 776cb63e5 -> 5ae1222e2
WICKET-4832 Websocket broadcast support Add WebSocketTester support for server side broadcasted messages Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5ae1222e Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5ae1222e Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5ae1222e Branch: refs/heads/master Commit: 5ae1222e23621b7e69af4fbe7ca435d9c8f44290 Parents: 776cb63 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Dec 6 16:13:41 2012 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Dec 6 16:13:41 2012 +0100 ---------------------------------------------------------------------- .../protocol/ws/api/WebSocketPushBroadcaster.java | 10 ++- .../ws/util/tester/TestWebSocketProcessor.java | 20 ++--- .../protocol/ws/util/tester/WebSocketTester.java | 23 +---- .../protocol/ws/util/tester/WebSocketTestPage.java | 5 + .../ws/util/tester/WebSocketTesterTest.java | 68 ++++++++++++++- 5 files changed, 87 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/5ae1222e/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java index 1d3d9a9..7a016f0 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java @@ -45,7 +45,7 @@ public class WebSocketPushBroadcaster } /** - * Processes the given message in the page and session identified by the given websocket connection. + * Processes the given message in the page and session identified by the given Web Socket connection. * The message is sent as an event to the Page and components of the session allowing the components * to be updated. * @@ -66,13 +66,15 @@ public class WebSocketPushBroadcaster Args.notNull(connection, "connection"); Args.notNull(message, "message"); - IWebSocketConnection wsConnection = registry.getConnection(connection.getApplication(), - connection.getSessionId(), connection.getPageId()); + Application application = connection.getApplication(); + String sessionId = connection.getSessionId(); + Integer pageId = connection.getPageId(); + IWebSocketConnection wsConnection = registry.getConnection(application, sessionId, pageId); if (wsConnection == null) { return; } - process(connection.getApplication(), singletonList(wsConnection), message); + process(application, singletonList(wsConnection), message); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/5ae1222e/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 b9e0b5c..7afe82f 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 @@ -22,10 +22,10 @@ import javax.servlet.http.HttpSession; import org.apache.wicket.Application; import org.apache.wicket.Page; import org.apache.wicket.protocol.http.mock.MockHttpServletRequest; -import org.apache.wicket.protocol.http.mock.MockHttpSession; import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor; import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; import org.apache.wicket.util.lang.Args; +import org.apache.wicket.util.tester.WicketTester; /** * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor} used by {@link WebSocketTester} @@ -40,9 +40,9 @@ abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor * @param page * the page that may have registered {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior} */ - public TestWebSocketProcessor(final Page page) + public TestWebSocketProcessor(final WicketTester wicketTester, final Page page) { - super(createRequest(page), page.getApplication()); + super(createRequest(wicketTester, page), page.getApplication()); } /** @@ -52,11 +52,11 @@ abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor * the page that may have registered {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior} * @return a mock http request */ - private static HttpServletRequest createRequest(final Page page) + private static HttpServletRequest createRequest(final WicketTester wicketTester, final Page page) { Args.notNull(page, "page"); Application application = page.getApplication(); - HttpSession httpSession = new MockHttpSession(null); + HttpSession httpSession = wicketTester.getHttpSession(); MockHttpServletRequest request = new MockHttpServletRequest(application, httpSession, null); request.addParameter("pageId", page.getId()); return request; @@ -88,20 +88,12 @@ abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor @Override public void sendMessage(IWebSocketPushMessage message) { - TestWebSocketProcessor.this.onPushMessage(message); + TestWebSocketProcessor.this.broadcastMessage(message); } }); } /** - * A callback method that is being called when a test message is broadcasted by WebSocketPushBroadcaster - * - * @param message - * the message sent to the Page and all its children - */ - protected abstract void onPushMessage(IWebSocketPushMessage message); - - /** * A callback method that is being called when a test message is written to the TestWebSocketConnection * * @param message http://git-wip-us.apache.org/repos/asf/wicket/blob/5ae1222e/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 e7be351..2cd6eeb 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 @@ -18,8 +18,8 @@ package org.apache.wicket.protocol.ws.util.tester; import org.apache.wicket.Page; import org.apache.wicket.protocol.ws.api.IWebSocketProcessor; -import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; import org.apache.wicket.util.lang.Args; +import org.apache.wicket.util.tester.WicketTester; /** * A helper class to test WebSocket related operations. @@ -38,17 +38,12 @@ public class WebSocketTester * @param page * the page that may have registered {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior} */ - public WebSocketTester(final Page page) + public WebSocketTester(final WicketTester wicketTester, final Page page) { + Args.notNull(wicketTester, "wicketTester"); Args.notNull(page, "page"); - socketProcessor = new TestWebSocketProcessor(page) { - - @Override - protected void onPushMessage(IWebSocketPushMessage message) - { - WebSocketTester.this.onPushMessage(message); - } + socketProcessor = new TestWebSocketProcessor(wicketTester, page) { @Override protected void onOutMessage(String message) @@ -119,14 +114,4 @@ public class WebSocketTester protected void onOutMessage(byte[] message, int offset, int length) { } - - /** - * A callback method which may be overritten to receive messages pushed by WebSocketPushBroadcaster - * - * @param message - * the pushed message to the page - */ - public void onPushMessage(IWebSocketPushMessage message) - { - } } http://git-wip-us.apache.org/repos/asf/wicket/blob/5ae1222e/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 index 8fe55e7..8dacf9f 100644 --- 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 @@ -35,6 +35,11 @@ import org.junit.Assert; */ class WebSocketTestPage extends WebPage implements IMarkupResourceStreamProvider { + WebSocketTestPage() + { + add(new WebSocketBehavior() {}); + } + WebSocketTestPage(final String expectedMessage) { add(new WebSocketBehavior() http://git-wip-us.apache.org/repos/asf/wicket/blob/5ae1222e/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 index 08af87e..0313db4 100644 --- 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 @@ -17,7 +17,14 @@ 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.util.string.Strings; import org.apache.wicket.util.tester.WicketTester; import org.junit.After; @@ -59,7 +66,7 @@ public class WebSocketTesterTest extends Assert WebSocketTestPage page = new WebSocketTestPage(expectedMessage); tester.startPage(page); - WebSocketTester webSocketTester = new WebSocketTester(page) { + WebSocketTester webSocketTester = new WebSocketTester(tester, page) { @Override protected void onOutMessage(String message) { @@ -86,7 +93,7 @@ public class WebSocketTesterTest extends Assert WebSocketTestPage page = new WebSocketTestPage(expectedMessage, offset, length); tester.startPage(page); - WebSocketTester webSocketTester = new WebSocketTester(page) { + WebSocketTester webSocketTester = new WebSocketTester(tester, page) { @Override protected void onOutMessage(byte[] message, int off, int len) { @@ -109,4 +116,61 @@ public class WebSocketTesterTest extends Assert 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(), 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; + } + } }
