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

turcsanyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 36e0187  NIFI-8347 Set Thread Context ClassLoader for provided 
jetty-server classes
36e0187 is described below

commit 36e01876489dd3832ffdb49758f6b1541bed4cfc
Author: exceptionfactory <exceptionfact...@apache.org>
AuthorDate: Fri Mar 19 16:08:57 2021 -0500

    NIFI-8347 Set Thread Context ClassLoader for provided jetty-server classes
    
    - Updated unit test with WebSocket connect method
    
    NIFI-8347 Replaced init() method with ServletContextHandler.setClassLoader()
    
    This closes #4918.
    
    Signed-off-by: Peter Turcsanyi <turcsa...@apache.org>
---
 .../nifi/websocket/jetty/JettyWebSocketServer.java |   2 +
 .../websocket/jetty/TestJettyWebSocketServer.java  | 119 ++++++++++++++++-----
 2 files changed, 92 insertions(+), 29 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
 
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
index f5a49c5..ecb13be 100644
--- 
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
+++ 
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
@@ -263,6 +263,8 @@ public class JettyWebSocketServer extends 
AbstractJettyWebSocketService implemen
         final ContextHandlerCollection handlerCollection = new 
ContextHandlerCollection();
 
         final ServletContextHandler contextHandler = new 
ServletContextHandler();
+        // Set ClassLoader so that jetty-server classes are available to 
WebSocketServletFactory.Loader
+        contextHandler.setClassLoader(getClass().getClassLoader());
 
         // Add basic auth.
         if (context.getProperty(BASIC_AUTH).asBoolean()) {
diff --git 
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/test/java/org/apache/nifi/websocket/jetty/TestJettyWebSocketServer.java
 
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/test/java/org/apache/nifi/websocket/jetty/TestJettyWebSocketServer.java
index bfd96af..281f88b 100644
--- 
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/test/java/org/apache/nifi/websocket/jetty/TestJettyWebSocketServer.java
+++ 
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/test/java/org/apache/nifi/websocket/jetty/TestJettyWebSocketServer.java
@@ -16,49 +16,110 @@
  */
 package org.apache.nifi.websocket.jetty;
 
-import org.apache.nifi.components.ValidationResult;
+import org.apache.nifi.processor.Processor;
+import org.apache.nifi.remote.io.socket.NetworkUtils;
+import org.apache.nifi.util.TestRunner;
+import org.apache.nifi.util.TestRunners;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collection;
-
-import static org.junit.Assert.assertEquals;
+import java.net.URI;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 public class TestJettyWebSocketServer {
+    private static final long TIMEOUT_SECONDS = 5;
 
-    @Test
-    public void testValidationRequiredProperties() throws Exception {
-        final JettyWebSocketServer service = new JettyWebSocketServer();
-        final ControllerServiceTestContext context = new 
ControllerServiceTestContext(service, "service-id");
-        service.initialize(context.getInitializationContext());
-        final Collection<ValidationResult> results = 
service.validate(context.getValidationContext());
-        assertEquals(1, results.size());
-        final ValidationResult result = results.iterator().next();
-        assertEquals(JettyWebSocketServer.LISTEN_PORT.getDisplayName(), 
result.getSubject());
+    private static final String ROOT_ENDPOINT_ID = "/";
+
+    private static final String IDENTIFIER = 
JettyWebSocketServer.class.getSimpleName();
+
+    private static final int MAX_PORT = 65535;
+
+    private TestRunner runner;
+
+    @Before
+    public void setRunner() {
+        final Processor processor = mock(Processor.class);
+        runner = TestRunners.newTestRunner(processor);
+    }
+
+    @After
+    public void shutdown() {
+        runner.shutdown();
     }
 
     @Test
     public void testValidationHashLoginService() throws Exception {
-        final JettyWebSocketServer service = new JettyWebSocketServer();
-        final ControllerServiceTestContext context = new 
ControllerServiceTestContext(service, "service-id");
-        context.setCustomValue(JettyWebSocketServer.LISTEN_PORT, "9001");
-        context.setCustomValue(JettyWebSocketServer.LOGIN_SERVICE, "hash");
-        context.setCustomValue(JettyWebSocketServer.BASIC_AUTH, "true");
-        service.initialize(context.getInitializationContext());
-        final Collection<ValidationResult> results = 
service.validate(context.getValidationContext());
-        assertEquals(1, results.size());
-        final ValidationResult result = results.iterator().next();
-        
assertEquals(JettyWebSocketServer.USERS_PROPERTIES_FILE.getDisplayName(), 
result.getSubject());
+        final JettyWebSocketServer server = new JettyWebSocketServer();
+        runner.addControllerService(IDENTIFIER, server);
+        runner.setProperty(server, JettyWebSocketServer.LISTEN_PORT, 
Integer.toString(MAX_PORT));
+        runner.setProperty(server, JettyWebSocketServer.LOGIN_SERVICE, 
JettyWebSocketServer.LOGIN_SERVICE_HASH.getValue());
+        runner.setProperty(server, JettyWebSocketServer.BASIC_AUTH, 
Boolean.TRUE.toString());
+        runner.assertNotValid();
     }
 
     @Test
     public void testValidationSuccess() throws Exception {
-        final JettyWebSocketServer service = new JettyWebSocketServer();
-        final ControllerServiceTestContext context = new 
ControllerServiceTestContext(service, "service-id");
-        context.setCustomValue(JettyWebSocketServer.LISTEN_PORT, "9001");
-        service.initialize(context.getInitializationContext());
-        final Collection<ValidationResult> results = 
service.validate(context.getValidationContext());
-        assertEquals(0, results.size());
+        final JettyWebSocketServer server = new JettyWebSocketServer();
+        runner.addControllerService(IDENTIFIER, server);
+        runner.setProperty(server, JettyWebSocketServer.LISTEN_PORT, 
Integer.toString(MAX_PORT));
+        runner.assertValid(server);
+    }
+
+    @Test
+    public void testWebSocketConnect() throws Exception {
+        final int port = NetworkUtils.availablePort();
+
+        final String identifier = JettyWebSocketServer.class.getSimpleName();
+        final JettyWebSocketServer server = new JettyWebSocketServer();
+        runner.addControllerService(identifier, server);
+        runner.setProperty(server, JettyWebSocketServer.LISTEN_PORT, 
Integer.toString(port));
+        runner.enableControllerService(server);
+
+        server.registerProcessor(ROOT_ENDPOINT_ID, runner.getProcessor());
+
+        final String command = String.class.getName();
+        final AtomicBoolean connected = new AtomicBoolean();
+
+        final WebSocketClient client = new WebSocketClient();
+        final WebSocketAdapter adapter = new WebSocketAdapter() {
+            @Override
+            public void onWebSocketConnect(Session session) {
+                super.onWebSocketConnect(session);
+                connected.set(true);
+            }
+
+            @Override
+            public void onWebSocketText(final String message) {
+
+            }
+        };
+        try {
+            client.start();
+
+            final URI uri = getWebSocketUri(port);
+            final Future<Session> connectSession = client.connect(adapter, 
uri);
+            final Session session = connectSession.get(TIMEOUT_SECONDS, 
TimeUnit.SECONDS);
+            session.getRemote().sendString(command);
+            session.close();
+
+            assertTrue("Connection not found", connected.get());
+        } finally {
+            client.stop();
+            runner.disableControllerService(server);
+        }
     }
 
+    private URI getWebSocketUri(final int port) {
+        return URI.create(String.format("ws://localhost:%d", port));
+    }
 }

Reply via email to