7116200: (cs) test/java/nio/charset/coders/StreamTimeout.java fails with "Address already in use"
authoralanb
Tue, 17 Apr 2012 15:46:04 +0100
changeset 12441 dc1628ee8f30
parent 12440 2689ca179e22
child 12444 487c6b61f6a6
7116200: (cs) test/java/nio/charset/coders/StreamTimeout.java fails with "Address already in use" Reviewed-by: alanb, chegar Contributed-by: jim.gish@oracle.com, forax@univ-mlv.fr
jdk/test/java/nio/charset/coders/StreamTimeout.java
--- a/jdk/test/java/nio/charset/coders/StreamTimeout.java	Tue Apr 17 07:14:14 2012 -0700
+++ b/jdk/test/java/nio/charset/coders/StreamTimeout.java	Tue Apr 17 15:46:04 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,51 +27,56 @@
  *          when the underlying byte stream times out
  */
 
-import java.net.*;
-import java.io.*;
-
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.ServerSocket;
+import java.net.Socket;
 
 public class StreamTimeout {
+    static final PrintStream log = System.err;
+    static String charset = "US-ASCII";
 
-    private static PrintStream log = System.err;
-
-    private static String charset = "US-ASCII";
+    private static class Client extends Thread implements Closeable {
+        private final Socket so;
 
-    private static Object lock = new Object();
-    private static synchronized void waitABit(int millisec) {
-        synchronized(lock) {
-            try {
-                lock.wait(millisec);
-            } catch (InterruptedException e) {
-                //ignore
-            }
+        Client(int port) throws IOException {
+            so = new Socket("127.0.0.1", port);
         }
-    }
 
-    private static class Client extends Thread {
+        @Override
         public void run() {
             try {
-                Socket so = new Socket("127.0.0.1", 22222);
                 Writer wr = new OutputStreamWriter(so.getOutputStream(),
-                                                   charset);
+                        charset);
                 wr.write("ab");
                 wr.flush();
             } catch (IOException x) {
                 log.print("Unexpected exception in writer: ");
                 x.printStackTrace();
-                System.exit(1);
             }
         }
+
+        @Override
+        public void close() throws IOException {
+            so.close();
+        }
     }
 
     private static void gobble(InputStream is, Reader rd,
-                               int ec, boolean force)
-        throws Exception
-    {
+            int ec, boolean force)
+                    throws Exception
+                    {
         int a = is.available();
         boolean r = rd.ready();
         log.print("" + a + " bytes available, "
-                  + "reader " + (r ? "" : "not ") + "ready");
+                + "reader " + (r ? "" : "not ") + "ready");
         if (!r && !force) {
             log.println();
             return;
@@ -84,10 +89,10 @@
             throw x;
         }
         log.println(", read() ==> "
-                    + (c >= 0 ? ("'" + (char)c + "'" ): "EOF"));
+                + (c >= 0 ? ("'" + (char)c + "'" ): "EOF"));
         if (c != ec)
             throw new Exception("Incorrect value read: Expected "
-                                + ec + ", read " + (char)c);
+                    + ec + ", read " + (char)c);
     }
 
     public static void main(String[] args) throws Exception {
@@ -95,43 +100,49 @@
         if (args.length > 0)
             charset = args[0];
 
-        ServerSocket ss = new ServerSocket(22222);
-        Thread cl = new Client();
-        cl.start();
-        Socket s = ss.accept();
-        s.setSoTimeout(150);
-        InputStream is = s.getInputStream();
-        Reader rd = new InputStreamReader(is, charset);
+        try(ServerSocket ss = new ServerSocket(0);
+            Client cl = new Client(ss.getLocalPort())) {
+
+            cl.start();
+
+            try(Socket s = ss.accept()) {
+                s.setSoTimeout(150);
 
-        while (is.available() <= 0)
-            Thread.yield();
+                try(InputStream is = s.getInputStream();
+                    Reader rd = new InputStreamReader(is, charset)) {
 
-        gobble(is, rd, 'a', false);
-        gobble(is, rd, 'b', false);
-        gobble(is, rd, -1, false);
+                    while (is.available() <= 0)
+                        Thread.yield();
+
+                    gobble(is, rd, 'a', false);
+                    gobble(is, rd, 'b', false);
+                    gobble(is, rd, -1, false);
 
-        boolean caught = false;
-        try {
-            gobble(is, rd, -1, true);
-        } catch (InterruptedIOException e) {
-            log.println("Read timed out, as expected");
-            caught = true;
-        }
-        if (!caught) {
-            log.println("Read did not time out, test inapplicable");
-            return;
-        }
+                    boolean caught = false;
+                    try {
+                        gobble(is, rd, -1, true);
+                    } catch (InterruptedIOException e) {
+                        log.println("Read timed out, as expected");
+                        caught = true;
+                    }
+                    if (!caught) {
+                        log.println("Read did not time out, test inapplicable");
+                        return;
+                    }
 
-        caught = false;
-        try {
-            gobble(is, rd, -1, true);
-        } catch (InterruptedIOException x) {
-            log.println("Second read timed out, as expected");
-            caught = true;
+                    caught = false;
+                    try {
+                        gobble(is, rd, -1, true);
+                    } catch (InterruptedIOException x) {
+                        log.println("Second read timed out, as expected");
+                        caught = true;
+                    }
+                    if (!caught)
+                        throw new Exception("Second read completed");
+                }
+            }
+
+            cl.join();
         }
-        if (!caught)
-            throw new Exception("Second read completed");
-
     }
-
 }