This is an automated email from the ASF dual-hosted git repository.

paulrutter pushed a commit to branch 
maintenance/FELIX-6746-websocketservlet-init-NPE
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit f23094ca7dd4772b9425b57a267efa23db992f0e
Author: Paul Rütter <[email protected]>
AuthorDate: Mon Dec 30 10:44:18 2024 +0100

    FELIX-6746 JettyWebSocketServlet: Error during calling init()
    - Add reproducer in integration test
---
 .../http/jetty/it/JettySpecificWebsocketIT.java    | 46 ++++++++++++++++++++--
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git 
a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java
 
b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java
index 63503f6e2b..097dc83fe3 100644
--- 
a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java
+++ 
b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java
@@ -20,10 +20,12 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
+import static 
org.osgi.service.servlet.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN;
 
 import java.io.IOException;
 import java.net.URI;
 import java.time.Duration;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -39,6 +41,8 @@ import org.awaitility.Awaitility;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP;
 import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer;
+import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet;
+import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory;
 import org.eclipse.jetty.websocket.api.Callback;
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
@@ -54,7 +58,6 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.http.HttpService;
-import org.osgi.service.servlet.whiteboard.HttpWhiteboardConstants;
 
 /**
  *
@@ -100,12 +103,11 @@ public class JettySpecificWebsocketIT extends 
AbstractJettyTestSupport {
                 .asOption();
     }
 
-
     @Test
     public void testWebSocketConversation() throws Exception {
         assertNotNull(bundleContext);
         bundleContext.registerService(Servlet.class, new 
MyWebSocketInitServlet(), new Hashtable<>(Map.of(
-                HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, 
"/mywebsocket1"
+                HTTP_WHITEBOARD_SERVLET_PATTERN, "/mywebsocket1"
         )));
 
         HttpClientTransportOverHTTP transport = new 
HttpClientTransportOverHTTP();
@@ -134,6 +136,44 @@ public class JettySpecificWebsocketIT extends 
AbstractJettyTestSupport {
         assertEquals("Hello WebSocket", clientWebSocket.getLastMessage());
     }
 
+    @Test
+    public void testWebSocketServletWhiteboard() throws Exception {
+        final JettyWebSocketServlet webSocketServlet2 = new 
JettyWebSocketServlet() {
+            @Override
+            protected void configure(JettyWebSocketServletFactory 
jettyWebSocketServletFactory) {
+                jettyWebSocketServletFactory.register(MyServerWebSocket.class);
+            }
+        };
+        final Dictionary<String, Object> webSocketServletProps2 = new 
Hashtable<>();
+        webSocketServletProps2.put(HTTP_WHITEBOARD_SERVLET_PATTERN, 
"/websocketservlet/*");
+        bundleContext.registerService(Servlet.class, webSocketServlet2, 
webSocketServletProps2);
+
+        HttpClientTransportOverHTTP transport = new 
HttpClientTransportOverHTTP();
+        HttpClient httpClient = new 
org.eclipse.jetty.client.HttpClient(transport);
+        WebSocketClient webSocketClient = new WebSocketClient(httpClient);
+        webSocketClient.start();
+
+        Object value = 
bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port");
+        int httpPort = Integer.parseInt((String)value);
+        URI destUri = new 
URI(String.format("ws://localhost:%d/websocketservlet/test", httpPort));
+
+        MyClientWebSocket clientWebSocket = new MyClientWebSocket();
+        ClientUpgradeRequest request = new ClientUpgradeRequest();
+        CompletableFuture<Session> future = 
webSocketClient.connect(clientWebSocket, destUri, request);
+        Session session = future.get();
+        assertNotNull(session);
+
+        // send a message from the client to the server
+        clientWebSocket.sendMessage("Hello WebSocket");
+
+        // wait for the async response from the server
+        Awaitility.await("waitForResponse")
+                .atMost(Duration.ofSeconds(30))
+                .pollDelay(Duration.ofMillis(200))
+                .until(() -> clientWebSocket.getLastMessage() != null);
+        assertEquals("Hello WebSocket", clientWebSocket.getLastMessage());
+    }
+
     /**
      * A servlet that declares the websocket during init
      */

Reply via email to