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)); + } }