Create REST web server on an unoccupied port
Use port 0 to create the Server for the REST web server and
extract the port number for the client later.
Change-Id: I845c5a9fb693e1f39ea2100c677fb63315148e04
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRest.java b/src/test/java/net/onrc/onos/api/rest/TestRest.java
index d6b64c4..b03b7c4 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRest.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRest.java
@@ -13,7 +13,6 @@
import java.util.LinkedList;
import java.util.List;
-import java.util.Random;
/**
* Base class for REST API tests. This class exposes common code for setting
@@ -29,7 +28,6 @@
private final List<RestletRoutable> restlets = new LinkedList<>();
private TestRestApiServer restApiServer;
- private int restPort;
/**
* Add a restlet to the web server. Tests call this to add the specific
@@ -43,15 +41,6 @@
}
/**
- * Assign the TCP port for the web server.
- *
- * @param newPort port number the web server will use
- */
- void setRestPort(int newPort) {
- restPort = newPort;
- }
-
- /**
* Fetch the REST API Web Server object.
*
* @return REST API web server
@@ -65,8 +54,7 @@
*/
@Before
public void setUp() {
- setRestPort(generateRandomPort());
- restApiServer = new TestRestApiServer(restPort);
+ restApiServer = new TestRestApiServer();
restApiServer.startServer(restlets);
}
@@ -86,22 +74,7 @@
* @return base URL
*/
String getBaseRestUrl() {
- return "http://localhost:" + Integer.toString(restPort) + "/wm/onos";
- }
-
- /**
- * Generate a random port number for the REST API web server to use. For
- * now, a random port between 50000 and 55000 is selected
- *
- * @return a port number that the web server can use
- */
- int generateRandomPort() {
- final int portStartRange = 50000;
- final int portEndRange = 55000;
-
- final Random random = new Random();
-
- return portStartRange + (random.nextInt(portEndRange - portStartRange));
+ return "http://localhost:" + Integer.toString(restApiServer.getRestPort()) + "/wm/onos";
}
/**
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestApiServer.java b/src/test/java/net/onrc/onos/api/rest/TestRestApiServer.java
index 77ea670..385415f 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestApiServer.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestApiServer.java
@@ -34,23 +34,6 @@
private RestApplication restApplication;
private Server server;
private Component component;
- private int port;
-
- /**
- * Hide the default constructor.
- */
- @SuppressWarnings("unused")
- private TestRestApiServer() { }
-
- /**
- * Public constructor. Given a port number, create a REST API server on
- * that port. The server is not running, it can be started using the
- * startServer() method.
- * @param serverPort port for the server to listen on.
- */
- public TestRestApiServer(final int serverPort) {
- port = serverPort;
- }
/**
* The restlet engine requires an Application as a container.
@@ -115,29 +98,31 @@
return slashFilter;
}
- /**
- * Run the Application on a given port.
- *
- * @param restPort port to listen on for inbounde requests
- */
- public void run(final int restPort) {
- setStatusService(new StatusService() {
- @Override
- public Representation getRepresentation(Status status,
- Request request,
- Response response) {
- return new JacksonRepresentation<>(status);
- }
- });
- // Start listening for REST requests
+ /**
+ * Run the Application on an open port.
+ *
+ */
+ public void run() {
+
try {
+ setStatusService(new StatusService() {
+ @Override
+ public Representation getRepresentation(Status status,
+ Request request,
+ Response response) {
+ return new JacksonRepresentation<>(status);
+ }
+ });
+
+ // Start listening for REST requests
component = new Component();
- server = component.getServers().add(Protocol.HTTP, restPort);
+ server = component.getServers().add(Protocol.HTTP, 0);
component.getDefaultHost().attach(this);
component.start();
} catch (Exception e) {
- throw new RuntimeException(e);
+ // Web server did not start.
+ throw new IllegalStateException(e);
}
}
}
@@ -153,7 +138,7 @@
restlets = restletsUnderTest;
restApplication = new RestApplication();
- restApplication.run(port);
+ restApplication.run();
}
@@ -186,4 +171,13 @@
public void addAttribute(final String name, final Object value) {
restApplication.addAttribute(name, value);
}
+
+ /**
+ * Gets the port number being used by the REST web server.
+ *
+ * @return port number
+ */
+ public int getRestPort() {
+ return server.getActualPort();
+ }
}