# HG changeset patch # User alanb # Date 1334673964 -3600 # Node ID dc1628ee8f30c7012176c0faa96ddad498003543 # Parent 2689ca179e2232287feb489b7f633d33520c3c11 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 diff -r 2689ca179e22 -r dc1628ee8f30 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"); - } - }