blob: 25f8589858398d31b9ecde2f3c7e12d491f76290 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
Kelly O'Hairfe008ae2010-05-25 15:58:33 -07002 * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
J. Duke319a3b92007-12-01 00:00:00 +00003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
Kelly O'Hairfe008ae2010-05-25 15:58:33 -070019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
J. Duke319a3b92007-12-01 00:00:00 +000022 */
23
24/*
25 * Tests that a thread blocked in Socket.getInputStream().read()
26 * throws a SocketException if the socket is asynchronously closed.
27 */
28import java.net.*;
29import java.io.*;
Chris Hegarty804d26e2014-03-31 11:33:40 +010030import java.util.concurrent.CountDownLatch;
J. Duke319a3b92007-12-01 00:00:00 +000031
32public class Socket_getInputStream_read extends AsyncCloseTest implements Runnable {
Chris Hegarty804d26e2014-03-31 11:33:40 +010033 private final Socket s;
34 private final int timeout;
35 private final CountDownLatch latch;
J. Duke319a3b92007-12-01 00:00:00 +000036
37 public Socket_getInputStream_read() {
Chris Hegarty804d26e2014-03-31 11:33:40 +010038 this(0);
J. Duke319a3b92007-12-01 00:00:00 +000039 }
40
41 public Socket_getInputStream_read(int timeout) {
42 this.timeout = timeout;
Chris Hegarty804d26e2014-03-31 11:33:40 +010043 latch = new CountDownLatch(1);
44 s = new Socket();
J. Duke319a3b92007-12-01 00:00:00 +000045 }
46
47 public String description() {
48 String s = "Socket.getInputStream().read()";
49 if (timeout > 0) {
50 s += " (with timeout)";
51 }
52 return s;
53 }
54
55 public void run() {
J. Duke319a3b92007-12-01 00:00:00 +000056 try {
Chris Hegarty804d26e2014-03-31 11:33:40 +010057 InputStream in = s.getInputStream();
J. Duke319a3b92007-12-01 00:00:00 +000058 if (timeout > 0) {
59 s.setSoTimeout(timeout);
60 }
Chris Hegarty804d26e2014-03-31 11:33:40 +010061 latch.countDown();
J. Duke319a3b92007-12-01 00:00:00 +000062 int n = in.read();
Chris Hegarty804d26e2014-03-31 11:33:40 +010063 failed("Socket.getInputStream().read() returned unexpectly!!");
J. Duke319a3b92007-12-01 00:00:00 +000064 } catch (SocketException se) {
Chris Hegarty804d26e2014-03-31 11:33:40 +010065 if (latch.getCount() != 1) {
66 closed();
67 }
J. Duke319a3b92007-12-01 00:00:00 +000068 } catch (Exception e) {
69 failed(e.getMessage());
Chris Hegarty804d26e2014-03-31 11:33:40 +010070 } finally {
71 if (latch.getCount() == 1) {
72 latch.countDown();
73 }
J. Duke319a3b92007-12-01 00:00:00 +000074 }
75 }
76
Chris Hegarty804d26e2014-03-31 11:33:40 +010077 public AsyncCloseTest go() {
78 try {
79 ServerSocket ss = new ServerSocket(0);
80 InetAddress lh = InetAddress.getLocalHost();
81 s.connect( new InetSocketAddress(lh, ss.getLocalPort()) );
82 Socket s2 = ss.accept();
83 Thread thr = new Thread(this);
84 thr.start();
85 latch.await();
86 Thread.sleep(5000); //sleep, so Socket.getInputStream().read() can block
87 s.close();
88 thr.join();
J. Duke319a3b92007-12-01 00:00:00 +000089
Chris Hegarty804d26e2014-03-31 11:33:40 +010090 if (isClosed()) {
91 return passed();
92 } else {
93 return failed("Socket.getInputStream().read() wasn't preempted");
94 }
95 } catch (Exception x) {
96 failed(x.getMessage());
97 throw new RuntimeException(x);
J. Duke319a3b92007-12-01 00:00:00 +000098 }
J. Duke319a3b92007-12-01 00:00:00 +000099 }
100}