Author: rgodfrey
Date: Tue Jun 12 17:01:14 2012
New Revision: 1349443

URL: http://svn.apache.org/viewvc?rev=1349443&view=rev
Log:
QPID-4062 : [Java Tests] Java system tests sometimes fail due to JMX port 
already initialised (Applied patch from Philip Harvey

Modified:
    
qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java

Modified: 
qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java?rev=1349443&r1=1349442&r2=1349443&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
 (original)
+++ 
qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
 Tue Jun 12 17:01:14 2012
@@ -29,8 +29,6 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.ServerSocket;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -166,9 +164,10 @@ public class QpidTestCase extends TestCa
             throw new IllegalArgumentException("Invalid start port: " + 
fromPort);
         }
 
+        PortHelper portHelper = new PortHelper();
         for (int i = fromPort; i <= MAX_PORT_NUMBER; i++)
         {
-            if (available(i)) {
+            if (portHelper.isPortAvailable(i)) {
                 return i;
             }
         }
@@ -176,54 +175,6 @@ public class QpidTestCase extends TestCa
         throw new NoSuchElementException("Could not find an available port 
above " + fromPort);
     }
 
-    /**
-     * Checks to see if a specific port is available.
-     *
-     * @param port the port to check for availability
-     */
-    private boolean available(int port)
-    {
-        if ((port < MIN_PORT_NUMBER) || (port > MAX_PORT_NUMBER))
-        {
-            throw new IllegalArgumentException("Invalid start port: " + port);
-        }
-
-        ServerSocket ss = null;
-        DatagramSocket ds = null;
-        try
-        {
-            ss = new ServerSocket(port);
-            ss.setReuseAddress(true);
-            ds = new DatagramSocket(port);
-            ds.setReuseAddress(true);
-            return true;
-        }
-        catch (IOException e)
-        {
-        }
-        finally
-        {
-            if (ds != null)
-            {
-                ds.close();
-            }
-
-            if (ss != null)
-            {
-                try
-                {
-                    ss.close();
-                }
-                catch (IOException e)
-                {
-                    /* should not be thrown */
-                }
-            }
-        }
-
-        return false;
-    }
-
     public int findFreePort()
     {
         return getNextAvailable(10000);

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java?rev=1349443&r1=1349442&r2=1349443&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
 Tue Jun 12 17:01:14 2012
@@ -20,6 +20,8 @@
  */
 package org.apache.qpid.test.utils;
 
+import java.util.Set;
+
 import org.apache.log4j.Logger;
 
 import org.apache.qpid.server.Broker;
@@ -31,7 +33,9 @@ public class InternalBrokerHolder implem
     private final Broker _broker;
     private final String _workingDirectory;
 
-    public InternalBrokerHolder(final Broker broker, String workingDirectory)
+    private Set<Integer> _portsUsedByBroker;
+
+    public InternalBrokerHolder(final Broker broker, String workingDirectory, 
Set<Integer> portsUsedByBroker)
     {
         if(broker == null)
         {
@@ -40,6 +44,7 @@ public class InternalBrokerHolder implem
 
         _broker = broker;
         _workingDirectory = workingDirectory;
+        _portsUsedByBroker = portsUsedByBroker;
     }
 
     @Override
@@ -53,7 +58,9 @@ public class InternalBrokerHolder implem
         LOGGER.info("Shutting down Broker instance");
 
         _broker.shutdown();
-        
+
+        waitUntilPortsAreFree();
+
         LOGGER.info("Broker instance shutdown");
     }
 
@@ -62,7 +69,12 @@ public class InternalBrokerHolder implem
     {
         // Can't kill a internal broker as we would also kill ourselves as we 
share the same JVM.
         shutdown();
-    }
 
+        waitUntilPortsAreFree();
+    }
 
+    private void waitUntilPortsAreFree()
+    {
+        new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker);
+    }
 }

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java?rev=1349443&r1=1349442&r2=1349443&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 Tue Jun 12 17:01:14 2012
@@ -30,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+
 import javax.jms.BytesMessage;
 import javax.jms.Connection;
 import javax.jms.Destination;
@@ -46,6 +47,7 @@ import javax.jms.TextMessage;
 import javax.jms.Topic;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
+
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.lang.StringUtils;
@@ -163,13 +165,13 @@ public class QpidBrokerTestCase extends 
     protected List<Connection> _connections = new ArrayList<Connection>();
     public static final String QUEUE = "queue";
     public static final String TOPIC = "topic";
-    
+
     /** Map to hold test defined environment properties */
     private Map<String, String> _env;
 
     /** Ensure our messages have some sort of size */
     protected static final int DEFAULT_MESSAGE_SIZE = 1024;
-    
+
     /** Size to create our message*/
     private int _messageSize = DEFAULT_MESSAGE_SIZE;
     /** Type of message*/
@@ -308,6 +310,24 @@ public class QpidBrokerTestCase extends 
     }
 
     /**
+     * The returned set of port numbers is only a guess because it assumes no 
ports have been overridden
+     * using system properties.
+     */
+    protected Set<Integer> guessAllPortsUsedByBroker(int mainPort)
+    {
+        Set<Integer> ports = new HashSet<Integer>();
+        int managementPort = getManagementPort(mainPort);
+        int connectorServerPort = managementPort + 
ServerConfiguration.JMXPORT_CONNECTORSERVER_OFFSET;
+
+        ports.add(mainPort);
+        ports.add(managementPort);
+        ports.add(connectorServerPort);
+        ports.add(DEFAULT_SSL_PORT);
+
+        return ports;
+    }
+
+    /**
      * Get the Port that is use by the current broker
      *
      * @return the current port
@@ -367,6 +387,8 @@ public class QpidBrokerTestCase extends 
             throw new IllegalStateException("There is already an existing 
broker running on port " + port);
         }
 
+        Set<Integer> portsUsedByBroker = guessAllPortsUsedByBroker(port);
+
         if (_brokerType.equals(BrokerType.INTERNAL) && 
!existingInternalBroker())
         {
             
setConfigurationProperty(ServerConfiguration.MGMT_CUSTOM_REGISTRY_SOCKET, 
String.valueOf(false));
@@ -393,7 +415,7 @@ public class QpidBrokerTestCase extends 
             _logger.info("starting internal broker (same JVM)");
             broker.startup(options);
 
-            _brokers.put(port, new InternalBrokerHolder(broker, 
System.getProperty("QPID_WORK")));
+            _brokers.put(port, new InternalBrokerHolder(broker, 
System.getProperty("QPID_WORK"), portsUsedByBroker));
         }
         else if (!_brokerType.equals(BrokerType.EXTERNAL))
         {
@@ -500,14 +522,14 @@ public class QpidBrokerTestCase extends 
                 // this is expect if the broker started successfully
             }
 
-            _brokers.put(port, new SpawnedBrokerHolder(process, qpidWork));
+            _brokers.put(port, new SpawnedBrokerHolder(process, qpidWork, 
portsUsedByBroker));
         }
     }
 
     private void addExcludedPorts(int port, int sslPort, BrokerOptions options)
     {
         final String protocolExcludesList = getProtocolExcludesList(port, 
sslPort);
-        
+
         if (protocolExcludesList.equals(""))
         {
             return;
@@ -1026,7 +1048,7 @@ public class QpidBrokerTestCase extends 
     {
         return (AMQConnectionFactory) getInitialContext().lookup(factoryName);
     }
-    
+
     public Connection getConnection() throws JMSException, NamingException
     {
         return getConnection("guest", "guest");
@@ -1320,14 +1342,14 @@ public class QpidBrokerTestCase extends 
 
     /**
      * Reloads the broker security configuration using the ApplicationRegistry 
(InVM brokers) or the
-     * ConfigurationManagementMBean via the JMX interface (Standalone brokers, 
management must be 
+     * ConfigurationManagementMBean via the JMX interface (Standalone brokers, 
management must be
      * enabled before calling the method).
      */
     public void reloadBrokerSecurityConfig() throws Exception
     {
         JMXTestUtils jmxu = new JMXTestUtils(this);
         jmxu.open();
-        
+
         try
         {
             ConfigurationManagement configMBean = 
jmxu.getConfigurationManagement();
@@ -1337,7 +1359,7 @@ public class QpidBrokerTestCase extends 
         {
             jmxu.close();
         }
-        
+
         LogMonitor _monitor = new LogMonitor(_outputFile);
         assertTrue("The expected server security configuration reload did not 
occur",
                 
_monitor.waitForMessage(ServerConfiguration.SECURITY_CONFIG_RELOADED, 
LOGMONITOR_TIMEOUT));

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java?rev=1349443&r1=1349442&r2=1349443&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
 Tue Jun 12 17:01:14 2012
@@ -21,6 +21,7 @@
 package org.apache.qpid.test.utils;
 
 import java.io.IOException;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 
@@ -32,8 +33,9 @@ public class SpawnedBrokerHolder impleme
     private final Process _process;
     private final Integer _pid;
     private final String _workingDirectory;
+    private Set<Integer> _portsUsedByBroker;
 
-    public SpawnedBrokerHolder(final Process process, final String 
workingDirectory)
+    public SpawnedBrokerHolder(final Process process, final String 
workingDirectory, Set<Integer> portsUsedByBroker)
     {
         if(process == null)
         {
@@ -43,6 +45,7 @@ public class SpawnedBrokerHolder impleme
         _process = process;
         _pid = retrieveUnixPidIfPossible();
         _workingDirectory = workingDirectory;
+        _portsUsedByBroker = portsUsedByBroker;
     }
 
     @Override
@@ -57,6 +60,8 @@ public class SpawnedBrokerHolder impleme
         _process.destroy();
 
         reapChildProcess();
+
+        waitUntilPortsAreFree();
     }
 
     @Override
@@ -74,6 +79,8 @@ public class SpawnedBrokerHolder impleme
         }
 
         reapChildProcess();
+
+        waitUntilPortsAreFree();
     }
 
     private void sendSigkillForImmediateShutdown(Integer pid)
@@ -146,4 +153,9 @@ public class SpawnedBrokerHolder impleme
         }
     }
 
+    private void waitUntilPortsAreFree()
+    {
+        new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to