Browse Source

Refactor random port in reactive module tests

This commit removes the use of SocketUtils#findAvailableTcpPort in
favor of letting servers pick a dynamic port by specifying port 0.

This should make integration tests more stable because the port is
chosen at the place where it needs to be used. It gives servers a
chance to try to open a socket on some port and start using the socket
if successful.
pull/1313/head
Rossen Stoyanchev 9 years ago
parent
commit
c79092f0f9
  1. 2
      spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java
  2. 6
      spring-web-reactive/src/test/java/org/springframework/web/reactive/socket/AbstractWebSocketIntegrationTests.java
  3. 11
      spring-web/src/test/java/org/springframework/http/server/reactive/AbstractHttpHandlerIntegrationTests.java
  4. 15
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/AbstractHttpServer.java
  5. 2
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/HttpServer.java
  6. 4
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/JettyHttpServer.java
  7. 5
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/ReactorHttpServer.java
  8. 7
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/RxNettyHttpServer.java
  9. 3
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/TomcatHttpServer.java
  10. 7
      spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/UndertowHttpServer.java

2
spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java

@ -25,7 +25,6 @@ import org.springframework.context.annotation.Configuration; @@ -25,7 +25,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.bootstrap.ReactorHttpServer;
import org.springframework.util.SocketUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@ -61,7 +60,6 @@ public class ContextPathIntegrationTests { @@ -61,7 +60,6 @@ public class ContextPathIntegrationTests {
HttpHandler webApp2Handler = DispatcherHandler.toHttpHandler(context2);
this.server = new ReactorHttpServer();
this.server.setPort(SocketUtils.findAvailableTcpPort());
this.server.registerHttpHandler("/webApp1", webApp1Handler);
this.server.registerHttpHandler("/webApp2", webApp2Handler);

6
spring-web-reactive/src/test/java/org/springframework/web/reactive/socket/AbstractWebSocketIntegrationTests.java

@ -44,7 +44,6 @@ import org.springframework.http.server.reactive.bootstrap.ReactorHttpServer; @@ -44,7 +44,6 @@ import org.springframework.http.server.reactive.bootstrap.ReactorHttpServer;
import org.springframework.http.server.reactive.bootstrap.RxNettyHttpServer;
import org.springframework.http.server.reactive.bootstrap.TomcatHttpServer;
import org.springframework.http.server.reactive.bootstrap.UndertowHttpServer;
import org.springframework.util.SocketUtils;
import org.springframework.web.reactive.DispatcherHandler;
import org.springframework.web.reactive.socket.client.JettyWebSocketClient;
import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
@ -135,12 +134,13 @@ public abstract class AbstractWebSocketIntegrationTests { @@ -135,12 +134,13 @@ public abstract class AbstractWebSocketIntegrationTests {
assumeFalse(this.client instanceof UndertowWebSocketClient && this.server instanceof RxNettyHttpServer);
this.port = SocketUtils.findAvailableTcpPort();
this.server.setPort(this.port);
this.server.setHandler(createHttpHandler());
this.server.afterPropertiesSet();
this.server.start();
// Set dynamically chosen port
this.port = this.server.getPort();
if (this.client instanceof Lifecycle) {
((Lifecycle) this.client).start();
}

11
spring-web/src/test/java/org/springframework/http/server/reactive/AbstractHttpHandlerIntegrationTests.java

@ -18,6 +18,8 @@ package org.springframework.http.server.reactive; @@ -18,6 +18,8 @@ package org.springframework.http.server.reactive;
import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
@ -29,11 +31,12 @@ import org.springframework.http.server.reactive.bootstrap.ReactorHttpServer; @@ -29,11 +31,12 @@ import org.springframework.http.server.reactive.bootstrap.ReactorHttpServer;
import org.springframework.http.server.reactive.bootstrap.RxNettyHttpServer;
import org.springframework.http.server.reactive.bootstrap.TomcatHttpServer;
import org.springframework.http.server.reactive.bootstrap.UndertowHttpServer;
import org.springframework.util.SocketUtils;
@RunWith(Parameterized.class)
public abstract class AbstractHttpHandlerIntegrationTests {
protected Log logger = LogFactory.getLog(getClass());
protected int port;
@Parameterized.Parameter(0)
@ -55,16 +58,18 @@ public abstract class AbstractHttpHandlerIntegrationTests { @@ -55,16 +58,18 @@ public abstract class AbstractHttpHandlerIntegrationTests {
@Before
public void setup() throws Exception {
this.port = SocketUtils.findAvailableTcpPort();
this.server.setPort(this.port);
this.server.setHandler(createHttpHandler());
this.server.afterPropertiesSet();
this.server.start();
// Set dynamically chosen port
this.port = this.server.getPort();
}
@After
public void tearDown() throws Exception {
this.server.stop();
this.port = 0;
}

15
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/AbstractHttpServer.java

@ -29,7 +29,7 @@ public abstract class AbstractHttpServer implements HttpServer { @@ -29,7 +29,7 @@ public abstract class AbstractHttpServer implements HttpServer {
private String host = "0.0.0.0";
private int port = -1;
private int port = 0;
private HttpHandler httpHandler;
@ -40,6 +40,7 @@ public abstract class AbstractHttpServer implements HttpServer { @@ -40,6 +40,7 @@ public abstract class AbstractHttpServer implements HttpServer {
private final Object lifecycleMonitor = new Object();
@Override
public void setHost(String host) {
this.host = host;
}
@ -48,14 +49,17 @@ public abstract class AbstractHttpServer implements HttpServer { @@ -48,14 +49,17 @@ public abstract class AbstractHttpServer implements HttpServer {
return host;
}
@Override
public void setPort(int port) {
this.port = port;
}
@Override
public int getPort() {
return this.port;
}
@Override
public void setHandler(HttpHandler handler) {
this.httpHandler = handler;
}
@ -138,13 +142,16 @@ public abstract class AbstractHttpServer implements HttpServer { @@ -138,13 +142,16 @@ public abstract class AbstractHttpServer implements HttpServer {
}
}
protected void reset() {
protected abstract void stopInternal() throws Exception;
private void reset() {
this.host = "0.0.0.0";
this.port = -1;
this.port = 0;
this.httpHandler = null;
this.handlerMap = null;
resetInternal();
}
protected abstract void stopInternal() throws Exception;
protected abstract void resetInternal();
}

2
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/HttpServer.java

@ -29,6 +29,8 @@ public interface HttpServer extends InitializingBean, Lifecycle { @@ -29,6 +29,8 @@ public interface HttpServer extends InitializingBean, Lifecycle {
void setPort(int port);
int getPort();
void setHandler(HttpHandler handler);
}

4
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/JettyHttpServer.java

@ -60,6 +60,7 @@ public class JettyHttpServer extends AbstractHttpServer { @@ -60,6 +60,7 @@ public class JettyHttpServer extends AbstractHttpServer {
@Override
protected void startInternal() throws Exception {
this.jettyServer.start();
setPort(((ServerConnector) this.jettyServer.getConnectors()[0]).getLocalPort());
}
@Override
@ -84,8 +85,7 @@ public class JettyHttpServer extends AbstractHttpServer { @@ -84,8 +85,7 @@ public class JettyHttpServer extends AbstractHttpServer {
}
@Override
protected void reset() {
super.reset();
protected void resetInternal() {
try {
if (this.jettyServer.isRunning()) {
this.jettyServer.setStopTimeout(5000);

5
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/ReactorHttpServer.java

@ -49,7 +49,6 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback { @@ -49,7 +49,6 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback {
new ReactorHttpHandlerAdapter(getHttpHandler());
}
@Override
public Object connectedInput() {
return this.reactorServer;
@ -63,6 +62,7 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback { @@ -63,6 +62,7 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback {
@Override
protected void startInternal() {
NettyContext nettyContext = this.reactorServer.newHandler(this.reactorHandler).block();
setPort(nettyContext.address().getPort());
this.nettyContext.set(nettyContext);
}
@ -72,8 +72,7 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback { @@ -72,8 +72,7 @@ public class ReactorHttpServer extends AbstractHttpServer implements Loopback {
}
@Override
protected void reset() {
super.reset();
protected void resetInternal() {
this.reactorServer = null;
this.reactorHandler = null;
this.nettyContext.set(null);

7
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/RxNettyHttpServer.java

@ -37,8 +37,7 @@ public class RxNettyHttpServer extends AbstractHttpServer { @@ -37,8 +37,7 @@ public class RxNettyHttpServer extends AbstractHttpServer {
@Override
protected void initServer() throws Exception {
this.rxNettyHandler = createHttpHandlerAdapter();
this.rxNettyServer = io.reactivex.netty.protocol.http.server.HttpServer
.newServer(new InetSocketAddress(getHost(), getPort()));
this.rxNettyServer = io.reactivex.netty.protocol.http.server.HttpServer.newServer(getPort());
}
@NotNull
@ -52,6 +51,7 @@ public class RxNettyHttpServer extends AbstractHttpServer { @@ -52,6 +51,7 @@ public class RxNettyHttpServer extends AbstractHttpServer {
@Override
protected void startInternal() {
this.rxNettyServer.start(this.rxNettyHandler);
setPort(this.rxNettyServer.getServerPort());
}
@Override
@ -60,8 +60,7 @@ public class RxNettyHttpServer extends AbstractHttpServer { @@ -60,8 +60,7 @@ public class RxNettyHttpServer extends AbstractHttpServer {
}
@Override
protected void reset() {
super.reset();
protected void resetInternal() {
this.rxNettyServer = null;
this.rxNettyHandler = null;
}

3
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/TomcatHttpServer.java

@ -77,6 +77,7 @@ public class TomcatHttpServer extends AbstractHttpServer { @@ -77,6 +77,7 @@ public class TomcatHttpServer extends AbstractHttpServer {
@Override
protected void startInternal() throws LifecycleException {
this.tomcatServer.start();
setPort(this.tomcatServer.getConnector().getLocalPort());
}
@Override
@ -86,7 +87,7 @@ public class TomcatHttpServer extends AbstractHttpServer { @@ -86,7 +87,7 @@ public class TomcatHttpServer extends AbstractHttpServer {
}
@Override
protected void reset() {
protected void resetInternal() {
this.tomcatServer = null;
}

7
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/UndertowHttpServer.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.http.server.reactive.bootstrap;
import java.net.InetSocketAddress;
import io.undertow.Undertow;
import org.springframework.http.server.reactive.UndertowHttpHandlerAdapter;
@ -44,6 +46,8 @@ public class UndertowHttpServer extends AbstractHttpServer { @@ -44,6 +46,8 @@ public class UndertowHttpServer extends AbstractHttpServer {
@Override
protected void startInternal() {
this.server.start();
Undertow.ListenerInfo info = this.server.getListenerInfo().get(0);
setPort(((InetSocketAddress) info.getAddress()).getPort());
}
@Override
@ -52,8 +56,7 @@ public class UndertowHttpServer extends AbstractHttpServer { @@ -52,8 +56,7 @@ public class UndertowHttpServer extends AbstractHttpServer {
}
@Override
protected void reset() {
super.reset();
protected void resetInternal() {
this.server = null;
}

Loading…
Cancel
Save