From 949bb55ef5cacc85a44f8d58b81c499228258cfb Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 31 Jan 2017 16:49:57 -0500 Subject: [PATCH] Refactor random port in spring-websocket Remove the use of SocketUtils#findAvailableTcpPort in favor of letting servers pick a dynamic port by specifying port 0. --- .../web/socket/JettyWebSocketTestServer.java | 2 +- .../web/socket/TomcatWebSocketTestServer.java | 22 +++++++------------ .../web/socket/UndertowTestServer.java | 22 +++++++++++-------- .../jetty/JettyWebSocketClientTests.java | 15 +++++++------ 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/JettyWebSocketTestServer.java b/spring-websocket/src/test/java/org/springframework/web/socket/JettyWebSocketTestServer.java index a8588aa246..8f2da20392 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/JettyWebSocketTestServer.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/JettyWebSocketTestServer.java @@ -41,7 +41,7 @@ public class JettyWebSocketTestServer implements WebSocketTestServer { private Server jettyServer; - private int port = -1; + private int port; private ServletContextHandler contextHandler; diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/TomcatWebSocketTestServer.java b/spring-websocket/src/test/java/org/springframework/web/socket/TomcatWebSocketTestServer.java index 51668311c2..8d4d0c6c78 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/TomcatWebSocketTestServer.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/TomcatWebSocketTestServer.java @@ -22,8 +22,6 @@ import javax.servlet.Filter; import javax.servlet.ServletContext; import org.apache.catalina.Context; -import org.apache.catalina.LifecycleEvent; -import org.apache.catalina.LifecycleListener; import org.apache.catalina.connector.Connector; import org.apache.catalina.startup.Tomcat; import org.apache.commons.logging.Log; @@ -34,7 +32,6 @@ import org.apache.tomcat.util.descriptor.web.FilterMap; import org.apache.tomcat.websocket.server.WsContextListener; import org.springframework.util.Assert; -import org.springframework.util.SocketUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; @@ -50,24 +47,22 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer { private Tomcat tomcatServer; - private int port = -1; + private int port; private Context context; @Override public void setup() { - this.port = SocketUtils.findAvailableTcpPort(); - Connector connector = new Connector(Http11NioProtocol.class.getName()); - connector.setPort(this.port); + connector.setPort(0); File baseDir = createTempDir("tomcat"); String baseDirPath = baseDir.getAbsolutePath(); this.tomcatServer = new Tomcat(); this.tomcatServer.setBaseDir(baseDirPath); - this.tomcatServer.setPort(this.port); + this.tomcatServer.setPort(0); this.tomcatServer.getService().addConnector(connector); this.tomcatServer.setConnector(connector); } @@ -117,12 +112,10 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer { @Override public void start() throws Exception { this.tomcatServer.start(); - this.context.addLifecycleListener(new LifecycleListener() { - @Override - public void lifecycleEvent(LifecycleEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("Event: " + event.getType()); - } + this.port = this.tomcatServer.getConnector().getLocalPort(); + this.context.addLifecycleListener(event -> { + if (logger.isDebugEnabled()) { + logger.debug("Event: " + event.getType()); } }); } @@ -130,6 +123,7 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer { @Override public void stop() throws Exception { this.tomcatServer.stop(); + this.port = 0; } @Override diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java b/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java index 93baffb3b1..888d359136 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.web.socket; import java.io.IOException; +import java.net.InetSocketAddress; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.Servlet; @@ -34,12 +35,12 @@ import io.undertow.websockets.jsr.WebSocketDeploymentInfo; import org.xnio.OptionMap; import org.xnio.Xnio; -import org.springframework.util.Assert; -import org.springframework.util.SocketUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; -import static io.undertow.servlet.Servlets.*; +import static io.undertow.servlet.Servlets.defaultContainer; +import static io.undertow.servlet.Servlets.deployment; +import static io.undertow.servlet.Servlets.servlet; /** * Undertow-based {@link WebSocketTestServer}. @@ -49,7 +50,7 @@ import static io.undertow.servlet.Servlets.*; */ public class UndertowTestServer implements WebSocketTestServer { - private int port = -1; + private int port; private Undertow server; @@ -58,13 +59,11 @@ public class UndertowTestServer implements WebSocketTestServer { @Override public void setup() { - this.port = SocketUtils.findAvailableTcpPort(); } @Override @SuppressWarnings("deprecation") public void deployConfig(WebApplicationContext wac, Filter... filters) { - Assert.state(this.port != -1, "setup() was never called"); DispatcherServletInstanceFactory servletFactory = new DispatcherServletInstanceFactory(wac); // manually building WebSocketDeploymentInfo in order to avoid class cast exceptions // with tomcat's implementation when using undertow 1.1.0+ @@ -85,7 +84,9 @@ public class UndertowTestServer implements WebSocketTestServer { .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, info); for (final Filter filter : filters) { String filterName = filter.getClass().getName(); - servletBuilder.addFilter(new FilterInfo(filterName, filter.getClass(), new FilterInstanceFactory(filter)).setAsyncSupported(true)); + FilterInstanceFactory filterFactory = new FilterInstanceFactory(filter); + FilterInfo filterInfo = new FilterInfo(filterName, filter.getClass(), filterFactory); + servletBuilder.addFilter(filterInfo.setAsyncSupported(true)); for (DispatcherType type : DispatcherType.values()) { servletBuilder.addFilterUrlMapping(filterName, "/*", type); } @@ -94,7 +95,7 @@ public class UndertowTestServer implements WebSocketTestServer { this.manager = defaultContainer().addDeployment(servletBuilder); this.manager.deploy(); HttpHandler httpHandler = this.manager.start(); - this.server = Undertow.builder().addHttpListener(this.port, "localhost").setHandler(httpHandler).build(); + this.server = Undertow.builder().addHttpListener(0, "localhost").setHandler(httpHandler).build(); } catch (ServletException ex) { throw new IllegalStateException(ex); @@ -109,11 +110,14 @@ public class UndertowTestServer implements WebSocketTestServer { @Override public void start() throws Exception { this.server.start(); + Undertow.ListenerInfo info = this.server.getListenerInfo().get(0); + this.port = ((InetSocketAddress) info.getAddress()).getPort(); } @Override public void stop() throws Exception { this.server.stop(); + this.port = 0; } @Override diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/client/jetty/JettyWebSocketClientTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/client/jetty/JettyWebSocketClientTests.java index ae62beafb1..97e6934f56 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/client/jetty/JettyWebSocketClientTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/client/jetty/JettyWebSocketClientTests.java @@ -31,7 +31,6 @@ import org.junit.Test; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.util.CollectionUtils; -import org.springframework.util.SocketUtils; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.WebSocketSession; @@ -59,15 +58,13 @@ public class JettyWebSocketClientTests { @Before public void setup() throws Exception { - int port = SocketUtils.findAvailableTcpPort(); - - this.server = new TestJettyWebSocketServer(port, new TextWebSocketHandler()); + this.server = new TestJettyWebSocketServer(new TextWebSocketHandler()); this.server.start(); this.client = new JettyWebSocketClient(); this.client.start(); - this.wsUrl = "ws://localhost:" + port + "/test"; + this.wsUrl = "ws://localhost:" + this.server.getPort() + "/test"; } @After @@ -109,11 +106,11 @@ public class JettyWebSocketClientTests { private final Server server; - public TestJettyWebSocketServer(int port, final WebSocketHandler webSocketHandler) { + public TestJettyWebSocketServer(final WebSocketHandler webSocketHandler) { this.server = new Server(); ServerConnector connector = new ServerConnector(this.server); - connector.setPort(port); + connector.setPort(0); this.server.addConnector(connector); this.server.setHandler(new org.eclipse.jetty.websocket.server.WebSocketHandler() { @@ -140,6 +137,10 @@ public class JettyWebSocketClientTests { public void stop() throws Exception { this.server.stop(); } + + public int getPort() { + return ((ServerConnector) this.server.getConnectors()[0]).getLocalPort(); + } } }