提交 d86e4cf2 编写于 作者: R Rossen Stoyanchev

Re-obtain port on every WebSocket integration test

This change adds a WebSocketTestServer setup method that initializes
the server and obtains a new port.

In turn AbstractWebSocketIntegrationTests invokes the new method from
its setup method thus ensuring a new port is used on every test.
上级 ea7ae894
...@@ -83,6 +83,7 @@ public abstract class AbstractWebSocketIntegrationTests { ...@@ -83,6 +83,7 @@ public abstract class AbstractWebSocketIntegrationTests {
((Lifecycle) this.webSocketClient).start(); ((Lifecycle) this.webSocketClient).start();
} }
this.server.setup();
this.server.deployConfig(this.wac); this.server.deployConfig(this.wac);
this.server.start(); this.server.start();
} }
...@@ -99,14 +100,12 @@ public abstract class AbstractWebSocketIntegrationTests { ...@@ -99,14 +100,12 @@ public abstract class AbstractWebSocketIntegrationTests {
catch (Throwable t) { catch (Throwable t) {
logger.error("Failed to stop WebSocket client", t); logger.error("Failed to stop WebSocket client", t);
} }
try { try {
this.server.undeployConfig(); this.server.undeployConfig();
} }
catch (Throwable t) { catch (Throwable t) {
logger.error("Failed to undeploy application config", t); logger.error("Failed to undeploy application config", t);
} }
try { try {
this.server.stop(); this.server.stop();
} }
......
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -20,6 +20,7 @@ import org.eclipse.jetty.server.Server; ...@@ -20,6 +20,7 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.springframework.util.Assert;
import org.springframework.util.SocketUtils; import org.springframework.util.SocketUtils;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.DispatcherServlet;
...@@ -35,12 +36,13 @@ import java.util.EnumSet; ...@@ -35,12 +36,13 @@ import java.util.EnumSet;
*/ */
public class JettyWebSocketTestServer implements WebSocketTestServer { public class JettyWebSocketTestServer implements WebSocketTestServer {
private final Server jettyServer; private Server jettyServer;
private final int port; private int port = -1;
public JettyWebSocketTestServer() { @Override
public void setup() {
this.port = SocketUtils.findAvailableTcpPort(); this.port = SocketUtils.findAvailableTcpPort();
this.jettyServer = new Server(this.port); this.jettyServer = new Server(this.port);
} }
...@@ -52,6 +54,7 @@ public class JettyWebSocketTestServer implements WebSocketTestServer { ...@@ -52,6 +54,7 @@ public class JettyWebSocketTestServer implements WebSocketTestServer {
@Override @Override
public void deployConfig(WebApplicationContext cxt, Filter... filters) { public void deployConfig(WebApplicationContext cxt, Filter... filters) {
Assert.state(this.port != -1, "setup() was never called.");
ServletContextHandler contextHandler = new ServletContextHandler(); ServletContextHandler contextHandler = new ServletContextHandler();
ServletHolder servletHolder = new ServletHolder(new DispatcherServlet(cxt)); ServletHolder servletHolder = new ServletHolder(new DispatcherServlet(cxt));
contextHandler.addServlet(servletHolder, "/"); contextHandler.addServlet(servletHolder, "/");
......
...@@ -30,6 +30,7 @@ import org.apache.tomcat.util.descriptor.web.FilterDef; ...@@ -30,6 +30,7 @@ import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap; import org.apache.tomcat.util.descriptor.web.FilterMap;
import org.apache.tomcat.websocket.server.WsContextListener; import org.apache.tomcat.websocket.server.WsContextListener;
import org.springframework.util.Assert;
import org.springframework.util.SocketUtils; import org.springframework.util.SocketUtils;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.DispatcherServlet;
...@@ -41,27 +42,28 @@ import org.springframework.web.servlet.DispatcherServlet; ...@@ -41,27 +42,28 @@ import org.springframework.web.servlet.DispatcherServlet;
*/ */
public class TomcatWebSocketTestServer implements WebSocketTestServer { public class TomcatWebSocketTestServer implements WebSocketTestServer {
private final Tomcat tomcatServer; private Tomcat tomcatServer;
private final int port; private int port = -1;
private Context context; private Context context;
public TomcatWebSocketTestServer() { @Override
public void setup() {
this.port = SocketUtils.findAvailableTcpPort(); this.port = SocketUtils.findAvailableTcpPort();
Connector connector = new Connector(Http11NioProtocol.class.getName()); Connector connector = new Connector(Http11NioProtocol.class.getName());
connector.setPort(this.port); connector.setPort(this.port);
File baseDir = createTempDir("tomcat"); File baseDir = createTempDir("tomcat");
String baseDirPath = baseDir.getAbsolutePath(); String baseDirPath = baseDir.getAbsolutePath();
this.tomcatServer = new Tomcat(); this.tomcatServer = new Tomcat();
this.tomcatServer.setBaseDir(baseDirPath); this.tomcatServer.setBaseDir(baseDirPath);
this.tomcatServer.setPort(this.port); this.tomcatServer.setPort(this.port);
this.tomcatServer.getService().addConnector(connector); this.tomcatServer.getService().addConnector(connector);
this.tomcatServer.setConnector(connector); this.tomcatServer.setConnector(connector);
} }
private File createTempDir(String prefix) { private File createTempDir(String prefix) {
...@@ -84,7 +86,8 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer { ...@@ -84,7 +86,8 @@ public class TomcatWebSocketTestServer implements WebSocketTestServer {
@Override @Override
public void deployConfig(WebApplicationContext wac, Filter... filters) { public void deployConfig(WebApplicationContext wac, Filter... filters) {
this.context = this.tomcatServer.addContext("", System.getProperty("java.io.tmpdir")); Assert.state(this.port != -1, "setup() was never called.");
this.context = this.tomcatServer.addContext("", System.getProperty("java.io.tmpdir"));
this.context.addApplicationListener(WsContextListener.class.getName()); this.context.addApplicationListener(WsContextListener.class.getName());
Tomcat.addServlet(this.context, "dispatcherServlet", new DispatcherServlet(wac)).setAsyncSupported(true); Tomcat.addServlet(this.context, "dispatcherServlet", new DispatcherServlet(wac)).setAsyncSupported(true);
this.context.addServletMapping("/", "dispatcherServlet"); this.context.addServletMapping("/", "dispatcherServlet");
......
...@@ -22,6 +22,7 @@ import javax.servlet.Servlet; ...@@ -22,6 +22,7 @@ import javax.servlet.Servlet;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import io.undertow.Undertow; import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager; import io.undertow.servlet.api.DeploymentManager;
import io.undertow.servlet.api.FilterInfo; import io.undertow.servlet.api.FilterInfo;
...@@ -29,6 +30,7 @@ import io.undertow.servlet.api.InstanceFactory; ...@@ -29,6 +30,7 @@ import io.undertow.servlet.api.InstanceFactory;
import io.undertow.servlet.api.InstanceHandle; import io.undertow.servlet.api.InstanceHandle;
import io.undertow.websockets.jsr.WebSocketDeploymentInfo; import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
import org.springframework.util.Assert;
import org.springframework.util.SocketUtils; import org.springframework.util.SocketUtils;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.DispatcherServlet;
...@@ -42,14 +44,15 @@ import static io.undertow.servlet.Servlets.*; ...@@ -42,14 +44,15 @@ import static io.undertow.servlet.Servlets.*;
*/ */
public class UndertowTestServer implements WebSocketTestServer { public class UndertowTestServer implements WebSocketTestServer {
private int port = -1;
private Undertow server; private Undertow server;
private DeploymentManager manager; private DeploymentManager manager;
private final int port;
public UndertowTestServer() { @Override
public void setup() {
this.port = SocketUtils.findAvailableTcpPort(); this.port = SocketUtils.findAvailableTcpPort();
} }
...@@ -60,15 +63,14 @@ public class UndertowTestServer implements WebSocketTestServer { ...@@ -60,15 +63,14 @@ public class UndertowTestServer implements WebSocketTestServer {
@Override @Override
public void deployConfig(WebApplicationContext cxt, Filter... filters) { public void deployConfig(WebApplicationContext cxt, Filter... filters) {
Assert.state(this.port != -1, "setup() was never called");
DispatcherServletInstanceFactory servletFactory = new DispatcherServletInstanceFactory(cxt); DispatcherServletInstanceFactory servletFactory = new DispatcherServletInstanceFactory(cxt);
DeploymentInfo servletBuilder = deployment() DeploymentInfo servletBuilder = deployment()
.setClassLoader(UndertowTestServer.class.getClassLoader()) .setClassLoader(UndertowTestServer.class.getClassLoader())
.setDeploymentName("undertow-websocket-test") .setDeploymentName("undertow-websocket-test")
.setContextPath("/") .setContextPath("/")
.addServlet(servlet("DispatcherServlet", DispatcherServlet.class, servletFactory).addMapping("/")) .addServlet(servlet("DispatcherServlet", DispatcherServlet.class, servletFactory).addMapping("/"))
.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, new WebSocketDeploymentInfo()); .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, new WebSocketDeploymentInfo());
for (final Filter filter : filters) { for (final Filter filter : filters) {
String filterName = filter.getClass().getName(); String filterName = filter.getClass().getName();
servletBuilder.addFilter(new FilterInfo(filterName, filter.getClass(), new FilterInstanceFactory(filter))); servletBuilder.addFilter(new FilterInfo(filterName, filter.getClass(), new FilterInstanceFactory(filter)));
...@@ -76,13 +78,11 @@ public class UndertowTestServer implements WebSocketTestServer { ...@@ -76,13 +78,11 @@ public class UndertowTestServer implements WebSocketTestServer {
servletBuilder.addFilterUrlMapping(filterName, "/*", type); servletBuilder.addFilterUrlMapping(filterName, "/*", type);
} }
} }
this.manager = defaultContainer().addDeployment(servletBuilder);
this.manager.deploy();
try { try {
this.server = Undertow.builder() this.manager = defaultContainer().addDeployment(servletBuilder);
.addHttpListener(this.port, "localhost") this.manager.deploy();
.setHandler(this.manager.start()).build(); HttpHandler httpHandler = this.manager.start();
this.server = Undertow.builder().addHttpListener(this.port, "localhost").setHandler(httpHandler).build();
} }
catch (ServletException ex) { catch (ServletException ex) {
throw new IllegalStateException(ex); throw new IllegalStateException(ex);
......
...@@ -29,6 +29,8 @@ public interface WebSocketTestServer { ...@@ -29,6 +29,8 @@ public interface WebSocketTestServer {
int getPort(); int getPort();
void setup();
void deployConfig(WebApplicationContext cxt, Filter... filters); void deployConfig(WebApplicationContext cxt, Filter... filters);
void undeployConfig(); void undeployConfig();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册