@Override public S writeFinalTextFrame(String text) { return (S) writeFrame(WebSocketFrame.textFrame(text, true)); }
@Test public void testWebsocketFrameFactoryArguments() throws Exception { assertNullPointerException(() -> WebSocketFrame.binaryFrame(null, true)); assertNullPointerException(() -> WebSocketFrame.textFrame(null, true)); assertNullPointerException(() -> WebSocketFrame.continuationFrame(null, true)); }
buff = Buffer.buffer(str); if (j == 0) { frame = WebSocketFrame.textFrame(str, false); } else { frame = WebSocketFrame.continuationFrame(buff, j == frames - 1);
@Override public S writeFinalTextFrame(String text) { return (S) writeFrame(WebSocketFrame.textFrame(text, true)); }
private void testError(String msg, String expectedErr) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg, true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("err", received.getString("type")); assertEquals(expectedErr, received.getString("body")); latch.countDown(); }); }); awaitLatch(latch); }
private void testUnregister(String address) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { // Register JsonObject msg = new JsonObject().put("type", "register").put("address", address); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("rec", received.getString("type")); Object rec = received.getValue("body"); assertEquals("foobar", rec); // Now unregister JsonObject msg2 = new JsonObject().put("type", "unregister").put("address", address); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg2.encode(), true)); // Send again msg2 = new JsonObject().put("type", "send").put("address", address).put("body", "foobar2"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg2.encode(), true)); // We shouldn't receive the second message, give it a little time to come through vertx.setTimer(500, tid -> latch.countDown()); }); msg = new JsonObject().put("type", "send").put("address", address).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); }); awaitLatch(latch); }
@Test public void testTextFrameSockJs() throws InterruptedException { String serverPath = "/text-sockjs"; setupSockJsServer(serverPath, this::echoRequest); List<Buffer> receivedMessages = new ArrayList<>(); WebSocket openedWebSocket = setupSockJsClient(serverPath, receivedMessages); String messageToSend = "[\"testMessage\"]"; openedWebSocket.writeFrame(WebSocketFrame.textFrame(messageToSend, true)); await(5, TimeUnit.SECONDS); assertEquals("Client should have received 2 messages: the reply and the close.", 2, receivedMessages.size()); Buffer expectedReply = Buffer.buffer("a" + messageToSend); assertEquals("Client reply should have matched request", expectedReply, receivedMessages.get(0)); assertEquals("Final message should have been a close", SOCKJS_CLOSE_REPLY, receivedMessages.get(1)); }
@Test public void testTextFrameRawWebSocket() throws InterruptedException { String serverPath = "/textecho"; setupSockJsServer(serverPath, this::echoRequest); String message = "hello"; AtomicReference<String> receivedReply = new AtomicReference<>(); WebSocket ws = setupRawWebsocketClient(serverPath); ws.handler(replyBuffer -> receivedReply.set(replyBuffer.toString())); ws.writeFrame(WebSocketFrame.textFrame(message, true)); await(5, TimeUnit.SECONDS); assertEquals("Client reply should have matched request", message, receivedReply.get()); }
@Test public void testHookCreateSocketRejected() throws Exception { CountDownLatch latch = new CountDownLatch(2); sockJSHandler.bridge(allAccessOptions, be -> { if (be.type() == BridgeEventType.SOCKET_CREATED) { be.complete(false); latch.countDown(); } else { be.complete(true); } }); client.websocket(websocketURI, ws -> { JsonObject msg = new JsonObject().put("type", "send").put("address", addr).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.closeHandler(v -> latch.countDown()); }); awaitLatch(latch); }
@Test public void testMaxAddressLength() throws Exception { CountDownLatch latch = new CountDownLatch(1); sockJSHandler.bridge(new BridgeOptions(allAccessOptions).setMaxAddressLength(10)); client.websocket(websocketURI, ws -> { JsonObject msg = new JsonObject().put("type", "register").put("address", "someaddressyqgyuqwdyudyug"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("err", received.getString("type")); assertEquals("max_address_length_reached", received.getString("body")); latch.countDown(); }); }); awaitLatch(latch); }
private void testReceiveFail(String address, Object body) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { // Register JsonObject msg = new JsonObject().put("type", "register").put("address", address); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> fail("Shouldn't receive anything")); // Wait a bit to allow the handler to be setup on the server, then send message from eventbus vertx.setTimer(200, tid -> { vertx.eventBus().send(address, body); vertx.setTimer(200, tid2 -> latch.countDown()); }); }); awaitLatch(latch); }
private void testSend(String address, Object body, boolean headers) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { MessageConsumer<Object> consumer = vertx.eventBus().consumer(address); consumer.handler(msg -> { Object receivedBody = msg.body(); assertEquals(body, receivedBody); if (headers) { checkHeaders(msg); } consumer.unregister(v -> latch.countDown()); }); JsonObject msg = new JsonObject().put("type", "send").put("address", address).put("body", body); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); }); awaitLatch(latch); }
@Test public void testSplitLargeReplySockJs() throws InterruptedException { String serverPath = "/large-reply-sockjs"; String largeMessage = TestUtils.randomAlphaString(65536 * 2); Buffer largeReplyBuffer = Buffer.buffer(largeMessage); setupSockJsServer(serverPath, (sock, requestBuffer) -> { sock.write(largeReplyBuffer); sock.close(); }); List<Buffer> receivedMessages = new ArrayList<>(); WebSocket openedWebSocket = setupSockJsClient(serverPath, receivedMessages); String messageToSend = "[\"hello\"]"; openedWebSocket.writeFrame(WebSocketFrame.textFrame(messageToSend, true)); await(5, TimeUnit.SECONDS); int receivedReplyCount = receivedMessages.size(); assertTrue("Should have received > 2 reply frame, actually received " + receivedReplyCount, receivedReplyCount > 2); Buffer expectedReplyBuffer = Buffer.buffer("a[\"").appendBuffer(largeReplyBuffer).appendBuffer(Buffer.buffer("\"]")); Buffer clientReplyBuffer = combineReplies(receivedMessages.subList(0, receivedMessages.size() - 1)); assertEquals(String.format("Combined reply on client (length %s) should equal message from server (%s)", clientReplyBuffer.length(), expectedReplyBuffer.length()), expectedReplyBuffer, clientReplyBuffer); Buffer finalMessage = receivedMessages.get(receivedMessages.size() - 1); assertEquals("Final message should have been a close", SOCKJS_CLOSE_REPLY, finalMessage); }
private void testReceive(String address, Object body) throws Exception { CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { // Register JsonObject msg = new JsonObject().put("type", "register").put("address", address); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); assertEquals("rec", received.getString("type")); Object rec = received.getValue("body"); assertEquals(body, rec); ws.closeHandler(v -> latch.countDown()); ws.close(); }); // Wait a bit to allow the handler to be setup on the server, then send message from eventbus vertx.setTimer(200, tid -> vertx.eventBus().send(address, body)); }); awaitLatch(latch); }
private void testPublish(String address, Object body, boolean headers) throws Exception { CountDownLatch latch = new CountDownLatch(2); client.websocket(websocketURI, ws -> { vertx.eventBus().consumer(address, msg -> { Object receivedBody = msg.body(); assertEquals(body, receivedBody); if (headers) { checkHeaders(msg); } latch.countDown(); }); vertx.eventBus().consumer(address, msg -> { Object receivedBody = msg.body(); assertEquals(body, receivedBody); if (headers) { checkHeaders(msg); } latch.countDown(); }); JsonObject msg = new JsonObject().put("type", "publish").put("address", address).put("body", body); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); }); awaitLatch(latch); }
@Test public void testWebsocketFrameFactoryArguments() throws Exception { assertNullPointerException(() -> WebSocketFrame.binaryFrame(null, true)); assertNullPointerException(() -> WebSocketFrame.textFrame(null, true)); assertNullPointerException(() -> WebSocketFrame.continuationFrame(null, true)); }
@Test public void testReplyToClientTimeout() throws Exception { sockJSHandler.bridge(allAccessOptions.setReplyTimeout(200)); CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { MessageConsumer<Object> consumer = vertx.eventBus().consumer(addr); consumer.handler(msg -> { Object receivedBody = msg.body(); assertEquals("foobar", receivedBody); vertx.setTimer(500, tid -> { msg.reply("barfoo"); consumer.unregister(); }); }); String replyAddress = UUID.randomUUID().toString(); JsonObject msg = new JsonObject().put("type", "send").put("address", addr).put("replyAddress", replyAddress).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); Object rec = received.getValue("failureType"); assertEquals("TIMEOUT", rec); ws.closeHandler(v -> latch.countDown()); ws.close(); }); }); awaitLatch(latch); }
@Test public void testReplyMessagesInbound() throws Exception { // Only allow inbound address, reply message should still get through though sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr))); CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { MessageConsumer<Object> consumer = vertx.eventBus().consumer(addr); consumer.handler(msg -> { Object receivedBody = msg.body(); assertEquals("foobar", receivedBody); msg.reply("barfoo"); consumer.unregister(); }); String replyAddress = UUID.randomUUID().toString(); JsonObject msg = new JsonObject().put("type", "send").put("address", addr).put("replyAddress", replyAddress).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); Object rec = received.getValue("body"); assertEquals("barfoo", rec); ws.closeHandler(v -> latch.countDown()); ws.close(); }); }); awaitLatch(latch); }
@Test public void testCombineMultipleFramesIntoASingleMessage() throws Exception { socketHandler = () -> { return socket -> socket.handler(buf -> { assertEquals("Hello World", buf.toString()); testComplete(); }); }; startServers(); client.websocket("/test/400/8ne8e94a/websocket", ws -> { ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame("[\"Hello", false)); ws.writeFrame(io.vertx.core.http.WebSocketFrame.continuationFrame(Buffer.buffer(" World\"]"), true)); ws.close(); }); await(); } }
@Test public void testCookiesRemoved() throws Exception { router.route("/cookiesremoved/*").handler(SockJSHandler.create(vertx) .socketHandler(sock -> { MultiMap headers = sock.headers(); String cookieHeader = headers.get("cookie"); assertNotNull(cookieHeader); assertEquals("JSESSIONID=wibble", cookieHeader); testComplete(); })); MultiMap headers = new CaseInsensitiveHeaders(); headers.add("cookie", "JSESSIONID=wibble"); headers.add("cookie", "flibble=floob"); client.websocket("/cookiesremoved/websocket", headers, ws -> { String frame = "foo"; ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(frame, true)); }); await(); }