Author: peter_firmstone Date: Tue Apr 9 11:05:32 2013 New Revision: 1465969
URL: http://svn.apache.org/r1465969 Log: Be more thorough when checking for port availability on localhost during testing, don't assume port free if current test isn't using it. Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java?rev=1465969&r1=1465968&r2=1465969&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/share/LookupServices.java Tue Apr 9 11:05:32 2013 @@ -27,7 +27,15 @@ import com.sun.jini.test.spec.discoverys import com.sun.jini.test.spec.discoveryservice.AbstractBaseTest; import com.sun.jini.test.spec.discoveryservice.AbstractBaseTest.DiscoveryStruct; import com.sun.jini.test.spec.discoveryservice.AbstractBaseTest.RegGroupsPair; +import java.io.IOException; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.net.SocketOptions; +import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.rmi.RemoteException; import java.util.ArrayList; @@ -660,12 +668,47 @@ public class LookupServices { * @return true if port in use. */ private boolean portInUse(int port) { + if (port == 0) return false; // Ephemeral for(int i=0;i<lookupsStarted.size();i++) { LocatorGroupsPair pair = lookupsStarted.get(i); int curPort = (pair.getLocator()).getPort(); if(port == curPort) return true; }//end loop - return false; + // Open a client ephemeral socket and attempt to connect to + // port on localhost to see if someone's listening. + Socket sock = null; + try { + sock = new Socket(); + if (sock instanceof SocketOptions){ + // Socket terminates with a RST rather than a FIN, so there's no TIME_WAIT + try { + ((SocketOptions) sock).setOption(SocketOptions.SO_LINGER, Integer.valueOf(0)); + } catch (SocketException se) { + // Ignore, not supported. + logger.log( Level.FINEST, "SocketOptions set SO_LINGER threw an Exception", se); + } + } + SocketAddress add = new InetSocketAddress(port); + sock.connect(add, 3000); // Try to connect for up to three seconds + // We were able to connect to a socket listening on localhost + return true; + } catch (SocketTimeoutException e){ + // There might be a stale process assume in use. + logger.log( Level.FINEST, "Socket timed out while trying to connect", e); + return true; + } catch (IOException e){ + // There was nothing listening on the socket so it's probably free. + // or it timed out. + return false; + } finally { + if (sock != null){ + try { + sock.close(); + } catch (IOException ex){ + logger.log( Level.FINEST, "Socket threw exception while attempting to close", ex); + }// Ignore + } + } }//end portInUse private void refreshLookupLocatorListsAt(int index){
