8015765: TEST_BUG: java/nio/channels/ServerSocketChannel/AdaptServerSocket.java failing intermittently
authoralanb
Thu, 15 Aug 2013 13:42:45 +0100
changeset 19410 a74f02e127a4
parent 19409 d7c7b9d56631
child 19411 b8942467963c
8015765: TEST_BUG: java/nio/channels/ServerSocketChannel/AdaptServerSocket.java failing intermittently Reviewed-by: chegar, dholmes, alanb Contributed-by: yiming.wang@oracle.com
jdk/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java
--- a/jdk/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java	Thu Aug 15 11:54:05 2013 +0100
+++ b/jdk/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java	Thu Aug 15 13:42:45 2013 +0100
@@ -35,7 +35,7 @@
 public class AdaptServerSocket {
 
     static java.io.PrintStream out = System.out;
-
+    static volatile boolean clientStarted = false;
     static volatile Exception clientException = null;
     static volatile Thread client = null;
 
@@ -44,15 +44,14 @@
     {
         Thread t = new Thread() {
                 public void run() {
-                    try {
-                        Socket so = new Socket();
+                    try (Socket so = new Socket()) {
                         out.println("client:  " + so);
+                        clientStarted = true;
                         if (dally > 0)
                             Thread.sleep(dally);
                         so.connect(new InetSocketAddress(port));
                         if (Thread.interrupted()) {
                             out.println("client interrupted");
-                            so.close();
                             return;
                         }
                         out.println("client:  " + so);
@@ -61,7 +60,6 @@
                         a += 1;
                         so.getOutputStream().write(a);
                         out.println("client:  wrote " + a);
-                        so.close();
                     } catch (Exception x) {
                         if (x instanceof InterruptedException)
                             return;
@@ -78,43 +76,44 @@
     static void test(int clientDally, int timeout, boolean shouldTimeout)
         throws Exception
     {
+        clientStarted = false;
         out.println();
 
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        ServerSocket sso = ssc.socket();
-        out.println("created: " + ssc);
-        out.println("         " + sso);
-        if (timeout != 0)
-            sso.setSoTimeout(timeout);
-        out.println("timeout: " + sso.getSoTimeout());
-        sso.bind(null);
-        out.println("bound:   " + ssc);
-        out.println("         " + sso);
-        startClient(sso.getLocalPort(), clientDally);
-        Thread.sleep(10);
+        try (ServerSocketChannel ssc = ServerSocketChannel.open();
+             ServerSocket sso = ssc.socket()) {
+            out.println("created: " + ssc);
+            out.println("         " + sso);
+            if (timeout != 0)
+                sso.setSoTimeout(timeout);
+            out.println("timeout: " + sso.getSoTimeout());
+            sso.bind(null);
+            out.println("bound:   " + ssc);
+            out.println("         " + sso);
+            startClient(sso.getLocalPort(), clientDally);
+            while (!clientStarted) {
+                Thread.sleep(20);
+            }
+            Socket so = null;
+            try {
+                so = sso.accept();
+            } catch (SocketTimeoutException x) {
+                if (shouldTimeout)
+                    out.println("Accept timed out, as expected");
+                else
+                    throw x;
+            }
+            if (shouldTimeout && (so != null))
+                throw new Exception("Accept did not time out");
 
-        Socket so = null;
-        try {
-            so = sso.accept();
-        } catch (SocketTimeoutException x) {
-            if (shouldTimeout)
-                out.println("Accept timed out, as expected");
-            else
-                throw x;
+            if (so != null) {
+                int a = 42;
+                so.getOutputStream().write(a);
+                int b = so.getInputStream().read();
+                if (b != a + 1)
+                    throw new Exception("Read incorrect data");
+                out.println("server:  read " + b);
+            }
         }
-        if (shouldTimeout && (so != null))
-            throw new Exception("Accept did not time out");
-
-        if (so != null) {
-            int a = 42;
-            so.getOutputStream().write(a);
-            int b = so.getInputStream().read();
-            if (b != a + 1)
-                throw new Exception("Read incorrect data");
-            out.println("server:  read " + b);
-            sso.close();
-        }
-
         client.interrupt();
         client.join();
         if (clientException != null)