From 23a954009f2051abbfa38c5695f2a181af1cea2f Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Mon, 18 Sep 2006 22:07:39 +0000
Subject: [PATCH] Added the ability to run unit tests in parallel on the same machine by randomly choosing the ports the test server uses. The startServer() method picks 3 unused ports and writes them out to config-changes.ldif. It replaces the tokens "#ldapport#", "#jmxport#", and "#ldapsport#" with the port numbers. The getServerLdapPort etc. methods will return the ports assigned to those listeners.

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java |   89 +++++++++++++++++++++++++++++++++++++++-----
 opends/tests/unit-tests-testng/resource/config-changes.ldif                    |    4 +-
 2 files changed, 80 insertions(+), 13 deletions(-)

diff --git a/opends/tests/unit-tests-testng/resource/config-changes.ldif b/opends/tests/unit-tests-testng/resource/config-changes.ldif
index 9695bc4..2982515 100644
--- a/opends/tests/unit-tests-testng/resource/config-changes.ldif
+++ b/opends/tests/unit-tests-testng/resource/config-changes.ldif
@@ -1,12 +1,12 @@
 dn: cn=LDAP Connection Handler,cn=Connection Handlers,cn=config
 changeType: modify
 replace: ds-cfg-listen-port
-ds-cfg-listen-port: 32389
+ds-cfg-listen-port: #ldapport#
 
 dn: cn=JMX Connection Handler,cn=Connection Handlers,cn=config
 changeType: modify
 replace: ds-cfg-listen-port
-ds-cfg-listen-port: 33689
+ds-cfg-listen-port: #jmxport#
 
 dn: cn=File-Based Access Logger,cn=Loggers,cn=config
 changetype: modify
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index 45733f5..d14c47f 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -30,15 +30,11 @@
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.util.LDIFReader;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringReader;
+import java.io.*;
 import java.util.List;
 import java.util.ArrayList;
+import java.net.ServerSocket;
+import java.net.InetSocketAddress;
 
 import org.opends.server.backends.MemoryBackend;
 import org.opends.server.config.ConfigException;
@@ -83,6 +79,21 @@
   private static MemoryBackend memoryBackend = null;
 
   /**
+   * The LDAP port the server is bound to on start.
+   */
+  private static int serverLdapPort;
+
+  /**
+   * The JMX port the server is bound to on start.
+   */
+  private static int serverJmxPort;
+
+  /**
+   * The LDAPS port the server is bound to on start.
+   */
+  private static int serverLdapsPort;
+
+  /**
    * Starts the Directory Server so that it will be available for use while
    * running the unit tests.  This will only actually start the server once, so
    * subsequent attempts to start it will be ignored because it will already be
@@ -138,9 +149,54 @@
                   new File(testConfigDir, "schema"));
     copyDirectory(new File(resourceDir, "MakeLDIF"),
                   new File(testConfigDir, "MakeLDIF"));
-    copyFile     (new File(testResourceDir, "config-changes.ldif"),
-                  new File(testConfigDir, "config-changes.ldif"));
 
+    // Find some free ports for the listeners and write them to the
+    // config-chamges.ldif file.
+    ServerSocket serverLdapSocket  = null;
+    ServerSocket serverJmxSocket   = null;
+    ServerSocket serverLdapsSocket = null;
+
+    serverLdapSocket = new ServerSocket();
+    serverLdapSocket.setReuseAddress(true);
+    serverLdapSocket.bind(new InetSocketAddress("127.0.0.1", 0));
+    serverLdapPort = serverLdapSocket.getLocalPort();
+
+    serverJmxSocket = new ServerSocket();
+    serverJmxSocket.setReuseAddress(true);
+    serverJmxSocket.bind(new InetSocketAddress("127.0.0.1", 0));
+    serverJmxPort = serverJmxSocket.getLocalPort();
+
+    serverLdapsSocket = new ServerSocket();
+    serverLdapsSocket.setReuseAddress(true);
+    serverLdapsSocket.bind(new InetSocketAddress("127.0.0.1", 0));
+    serverLdapsPort = serverLdapsSocket.getLocalPort();
+
+    BufferedReader reader = new BufferedReader(new FileReader(
+                                               new File(testResourceDir,
+                                                        "config-changes.ldif")
+                                              ));
+    FileOutputStream outFile = new FileOutputStream(
+        new File(testConfigDir, "config-changes.ldif"));
+    PrintStream writer = new PrintStream(outFile);
+
+    String line = reader.readLine();
+
+    while(line != null)
+    {
+      line = line.replaceAll("#ldapport#", String.valueOf(serverLdapPort));
+      line = line.replaceAll("#jmxport#", String.valueOf(serverJmxPort));
+      line = line.replaceAll("#ldapsport#", String.valueOf(serverLdapsPort));
+
+      writer.println(line);
+      line = reader.readLine();
+    }
+
+    writer.close();
+    outFile.close();
+
+    serverLdapSocket.close();
+    serverJmxSocket.close();
+    serverLdapsSocket.close();
 
     // Actually start the server and set a variable that will prevent us from
     // needing to do it again.
@@ -312,7 +368,7 @@
    */
   public static long getServerLdapPort()
   {
-    return 32389;
+    return serverLdapPort;
   }
 
   /**
@@ -323,7 +379,18 @@
    */
   public static long getServerJmxPort()
   {
-    return 33689;
+    return serverJmxPort;
+  }
+
+  /**
+   * Get teh LDAPS port the test environment Directory Server instance is
+   * running on
+   *
+   * @return The port number.
+   */
+  public static long getServerLdapsPort()
+  {
+    return serverLdapsPort;
   }
 
   /**

--
Gitblit v1.10.0