--- old/test/jdk/sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java 2018-05-11 15:08:19.935216800 -0700 +++ new/test/jdk/sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java 2018-05-11 15:08:19.440215900 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, 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 @@ -25,10 +25,6 @@ // SunJSSE does not support dynamic system properties, no way to re-use // system properties in samevm/agentvm mode. // -// The test may timeout occasionally on heavy loaded system because -// there are lot of TLS transactions involved. Frequent timeout(s) should -// be analyzed further. -// /* * @test @@ -40,19 +36,23 @@ import javax.net.ssl.*; import java.io.*; +import java.util.concurrent.locks.*; +import java.util.concurrent.TimeUnit; -public class AsyncSSLSocketClose implements Runnable -{ +public class AsyncSSLSocketClose implements Runnable { SSLSocket socket; SSLServerSocket ss; + final Lock lock = new ReentrantLock(); + final Condition isRunning = lock.newCondition(); + // Where do we find the keystores? static String pathToStores = "../../../../javax/net/ssl/etc"; static String keyStoreFile = "keystore"; static String trustStoreFile = "truststore"; static String passwd = "passphrase"; - public static void main(String[] args) { + public static void main(String[] args) throws Exception { String keyFilename = System.getProperty("test.src", "./") + "/" + pathToStores + "/" + keyStoreFile; @@ -68,58 +68,83 @@ new AsyncSSLSocketClose(); } - public AsyncSSLSocketClose() { - try { - SSLServerSocketFactory sslssf = + public AsyncSSLSocketClose() throws Exception { + SSLServerSocketFactory sslssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); - ss = (SSLServerSocket) sslssf.createServerSocket(0); - - SSLSocketFactory sslsf = - (SSLSocketFactory)SSLSocketFactory.getDefault(); - socket = (SSLSocket)sslsf.createSocket("localhost", - ss.getLocalPort()); - SSLSocket serverSoc = (SSLSocket) ss.accept(); - ss.close(); - - (new Thread(this)).start(); - serverSoc.startHandshake(); + ss = (SSLServerSocket) sslssf.createServerSocket(0); + SSLSocketFactory sslsf = + (SSLSocketFactory)SSLSocketFactory.getDefault(); + socket = (SSLSocket)sslsf.createSocket("localhost", ss.getLocalPort()); + SSLSocket serverSoc = (SSLSocket)ss.accept(); + ss.close(); + + (new Thread(this)).start(); + serverSoc.startHandshake(); + if (lock.tryLock() || lock.tryLock(5000, TimeUnit.MILLISECONDS)) { + boolean started = false; try { - Thread.sleep(5000); - } catch (Exception e) { - e.printStackTrace(); + started = isRunning.await(5000, TimeUnit.MILLISECONDS); + } finally { + lock.unlock(); } - - socket.setSoLinger(true, 10); - System.out.println("Calling Socket.close"); - socket.close(); - System.out.println("ssl socket get closed"); - System.out.flush(); - - } catch (IOException e) { - e.printStackTrace(); + if (started) { + socket.setSoLinger(true, 10); + System.out.println("Calling Socket.close"); + socket.close(); + System.out.println("ssl socket get closed"); + System.out.flush(); + } else { + throw new Exception("Did not get the signal in main thread"); + } + } else { + throw new Exception("Unable get the lock in main thread"); } - } // block in write public void run() { - try { - byte[] ba = new byte[1024]; - for (int i=0; i