From b9e54c18493b9f6d528528ec6a352ce295370a70 Mon Sep 17 00:00:00 2001 From: Dejan Kovacevic Date: Tue, 4 Oct 2022 10:17:01 +0200 Subject: [PATCH] Jetty Websocket update for Dropwizard (#100) * org.eclipse.jetty.websocket version bump * added exclusions --- .gitignore | 1 + backend/pom.xml | 18 ++- .../java/com/wire/bots/roman/WebSocket.java | 2 +- .../roman/integrations/WebSocketTest.java | 126 ++++++++++++++++++ 4 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 backend/src/test/java/com/wire/bots/roman/integrations/WebSocketTest.java diff --git a/.gitignore b/.gitignore index 67606fa8..ee834397 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .env.prod target/ data/ +libs/ .idea/ *.iml *.log diff --git a/backend/pom.xml b/backend/pom.xml index 9bd4ab4e..eafa9010 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -29,7 +29,7 @@ true 3.4.2 - 2.1.1 + 2.1.2 0.11.5 @@ -83,12 +83,26 @@ dropwizard-redirect-bundle 1.3.5 + + org.eclipse.jetty.websocket + javax-websocket-server-impl + 9.4.49.v20220914 + com.liveperson dropwizard-websockets 1.3.14 + + + io.dropwizard + dropwizard-core + + + org.eclipse.jetty.websocket + javax-websocket-server-impl + + - io.dropwizard dropwizard-servlets diff --git a/backend/src/main/java/com/wire/bots/roman/WebSocket.java b/backend/src/main/java/com/wire/bots/roman/WebSocket.java index 01a13c0c..f9780c34 100644 --- a/backend/src/main/java/com/wire/bots/roman/WebSocket.java +++ b/backend/src/main/java/com/wire/bots/roman/WebSocket.java @@ -47,6 +47,6 @@ public void onClose(Session session) throws IOException { @OnError public void onError(Session session, Throwable throwable) { - Logger.exception("%s error: %s", throwable, session.getId(), throwable.getMessage()); + Logger.exception(throwable,"%s error: %s", session.getId(), throwable.getMessage()); } } diff --git a/backend/src/test/java/com/wire/bots/roman/integrations/WebSocketTest.java b/backend/src/test/java/com/wire/bots/roman/integrations/WebSocketTest.java new file mode 100644 index 00000000..ef1cb0b1 --- /dev/null +++ b/backend/src/test/java/com/wire/bots/roman/integrations/WebSocketTest.java @@ -0,0 +1,126 @@ +package com.wire.bots.roman.integrations; + +import com.wire.bots.roman.Application; +import com.wire.bots.roman.DAO.ProvidersDAO; +import com.wire.bots.roman.Tools; +import com.wire.bots.roman.model.*; +import io.dropwizard.testing.ConfigOverride; +import io.dropwizard.testing.DropwizardTestSupport; +import org.jdbi.v3.core.Jdbi; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.websocket.ClientEndpoint; + +import javax.websocket.*; +import javax.ws.rs.client.Client; +import java.net.URI; +import java.util.UUID; + +public class WebSocketTest { + URI wss = null; + + @ClientEndpoint(decoders = WebSocketTest._Decoder.class) + public class WebsocketClientEndpoint { + Session session; + + public WebsocketClientEndpoint() { + try { + WebSocketContainer container = ContainerProvider.getWebSocketContainer(); + session = container.connectToServer(this, wss); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @OnOpen + public void onOpen(Session session) { + System.out.printf("Websocket open: %s\n", session.getId()); + } + + @OnMessage + public void onMessage(Object payload) { + } + + @OnClose + public void onClose(Session closed, CloseReason reason) { + System.out.printf("Websocket closed: %s: reason: %s\n", closed.getId(), reason.getCloseCode()); + } + } + + private static final DropwizardTestSupport SUPPORT = new DropwizardTestSupport<>( + Application.class, "roman.yaml", + ConfigOverride.config("key", "TcZA2Kq4GaOcIbQuOvasrw34321cZAfLW4Ga54fsds43hUuOdcdm42"), + ConfigOverride.config("romanPubKeyBase64", "pubkey.PEM")); + private Client client; + private Jdbi jdbi; + + @Before + public void beforeClass() throws Exception { + SUPPORT.before(); + Application app = SUPPORT.getApplication(); + client = app.getClient(); + jdbi = app.getJdbi(); + } + + @After + public void afterClass() { + SUPPORT.after(); + } + + @Test + public void connectTest() throws Exception { + final UUID botId = UUID.randomUUID(); + final UUID providerId = UUID.randomUUID(); + final String serviceAuth = Tools.generateToken(botId); + final UUID serviceId = UUID.randomUUID(); + + final String email = String.format("%s@email.com", serviceAuth); + + // Create some fake provider and service + ProvidersDAO providersDAO = jdbi.onDemand(ProvidersDAO.class); + providersDAO.insert("Test Provider", providerId, email, "hash", "password"); + providersDAO.update(providerId, null, serviceAuth, serviceId, "Test Service", null); + + Provider provider = providersDAO.get(providerId); + + final String wssUrl = "ws://localhost:8080"; + String appKey = provider.serviceAuth; + + wss = client.target(wssUrl) + .path("await") + .path(appKey) + .getUri(); + + final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(); + + Thread.sleep(2000); + + clientEndPoint.session.close(); + + Thread.sleep(2000); + } + + public static class _Decoder implements Decoder.Text { + @Override + public Object decode(String s) { + return new Object(); + } + + @Override + public boolean willDecode(String s) { + return s.startsWith("{") && s.endsWith("}"); + } + + @Override + public void init(EndpointConfig config) { + + } + + @Override + public void destroy() { + + } + } +}