--- /dev/null 2013-02-26 17:16:58.251395135 +0400 +++ new/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/InterruptedIO.java 2013-02-27 17:23:51.311012695 +0400 @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2001, 2013, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4393337 + * @summary [TEST RUNS ON SOLARIS ONLY] Throw an InterruptedIOException + * when read on SSLSocket is * interrupted. + */ + +import java.io.InputStream; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.Socket; +import javax.net.ssl.*; + +/** + * Interrupts an SSL socket that is blocked on a read. An + * InterruptedIOException will be thrown and handled within the test if the + * test completes correctly. + */ + +public class InterruptedIO { + + /** + * Starts a client and a server thread. Gives the client enough time to + * block in a read, then interrupts it. + */ + public static void main(String[] args) throws Exception { + + String reason = + "Test valid only on SunOS.\n" + + "=========================\n" + + "It was determined that Thread.interrupt() could \n" + + "not be reliably return InterruptedIOException \n" + + "on non-Solaris implementations. Thread.interrupt() \n" + + "API was updated in merlin (JDK 1.4) to reflect this.\n"; + System.out.println(reason); + + String osName = System.getProperty("os.name", ""); + if (!osName.equalsIgnoreCase("SunOS")) { + System.out.println("Ignoring test on '" + osName + "'"); + return; + } + + String testRoot = System.getProperty("test.src", "."); + System.setProperty("javax.net.ssl.keyStore", + testRoot + + "/../../../../../../../etc/keystore"); + System.setProperty("javax.net.ssl.keyStorePassword", + "passphrase"); + System.setProperty("javax.net.ssl.trustStore", + testRoot + + "/../../../../../../../etc/truststore"); + + Server server = new Server(); + server.start(); + + Client client = new Client(server.getPort()); // Will do handshake + client.start(); // Will block in read + + // sleep for 5 seconds + System.out.println("Main - Pausing for 5 seconds..."); + Thread.sleep(5 * 1000); + + System.out.println("Main - Interrupting client reader thread"); + client.interrupt(); + client.join(); // Wait for client thread to complete + + if (client.failed()) + throw new Exception("Main - Test InterruptedIO failed " + + "on client side."); + else + System.out.println("Main - Test InterruptedIO successful!"); + } + + /** + * Accepts an incoming SSL Connection. Then blocks in a read. + */ + static class Server extends Thread { + + private SSLServerSocket ss; + + public Server() throws Exception { + ss = (SSLServerSocket) SSLServerSocketFactory.getDefault(). + createServerSocket(0); + } + + public int getPort() { + return ss.getLocalPort(); + } + + public void run() { + try { + System.out.println("Server - Will accept connections on port " + + getPort()); + Socket s = ss.accept(); + InputStream is = s.getInputStream(); + // We want the client to block so deadlock + is.read(); + } catch (IOException e) { + // Happens when client closese connection. + // If an error occurs, Client will detect problem + } + } + } + + /** + * Initiates an SSL connection to a server. Then blocks in a read. It + * should be interrupted by another thread. An InterruptedIOException + * is expected to be thrown. + */ + static class Client extends Thread { + + private SSLSocket socket; + private InputStream inStream; + private boolean failed = false; + + public Client(int port) throws Exception { + socket = (SSLSocket) SSLSocketFactory.getDefault(). + createSocket("localhost", port); + inStream = socket.getInputStream(); + System.out.println("Client - " + + "Connected to: localhost" + ":" + port); + System.out.println("Client - " + + "Doing SSL Handshake..."); + socket.startHandshake(); // Asynchronous call + System.out.println("Client - Done with SSL Handshake"); + } + + public void run() { + + try { + System.out.println("Client - Reading from input stream ..."); + if (inStream.read() == -1) { + System.out.println("Client - End-of-stream detected"); + failed = true; + } + } catch (InterruptedIOException e) { + System.out.println("Client - " + + "As expected, InterruptedIOException " + + "was thrown. Message: " + + e.getMessage()); + } catch (Exception e) { + System.out.println("Client - Unexpected exception:"); + e.printStackTrace(); + failed = true; + } finally { + try { + socket.close(); + } catch (IOException e) { + // Squelch it + } + } + } + + public boolean failed() { + return failed; + } + + } + +}