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