diff --git a/test/com/sun/jdi/BadHandshakeTest.java b/test/com/sun/jdi/BadHandshakeTest.java index 73f13fe253eeea1909bf7a1cfa620b0221c32194..8e35442ebb3615c340f2f4f303924b2b0f30b01c 100644 --- a/test/com/sun/jdi/BadHandshakeTest.java +++ b/test/com/sun/jdi/BadHandshakeTest.java @@ -24,16 +24,12 @@ /* @test * @bug 6306165 6432567 * @summary Check that a bad handshake doesn't cause a debuggee to abort + * @library /lib/testlibrary * * @build VMConnection BadHandshakeTest Exit0 * @run main BadHandshakeTest * */ -import java.io.InputStream; -import java.io.IOException; -import java.io.File; -import java.io.BufferedInputStream; -import java.net.ServerSocket; import java.net.Socket; import java.net.InetAddress; import com.sun.jdi.Bootstrap; @@ -44,50 +40,13 @@ import com.sun.jdi.connect.AttachingConnector; import java.util.Map; import java.util.List; import java.util.Iterator; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; -public class BadHandshakeTest { - - static volatile boolean ready = false; - - /* - * Helper class to redirect process output/error - */ - static class IOHandler implements Runnable { - InputStream in; - - IOHandler(InputStream in) { - this.in = in; - } - - static void handle(InputStream in) { - IOHandler handler = new IOHandler(in); - Thread thr = new Thread(handler); - thr.setDaemon(true); - thr.start(); - } - - public void run() { - try { - byte b[] = new byte[100]; - for (;;) { - int n = in.read(b, 0, 100); - // The first thing that will get read is - // Listening for transport dt_socket at address: xxxxx - // which shows the debuggee is ready to accept connections. - ready = true; - if (n < 0) { - break; - } - String s = new String(b, 0, n, "UTF-8"); - System.out.print(s); - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } - } - - } +import jdk.testlibrary.Utils; +import jdk.testlibrary.ProcessTools; +public class BadHandshakeTest { /* * Find a connector by name */ @@ -106,22 +65,31 @@ public class BadHandshakeTest { /* * Launch a server debuggee with the given address */ - private static Process launch(String address, String class_name) throws IOException { - String exe = System.getProperty("java.home") - + File.separator + "bin" + File.separator + "java"; - String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() + - " -agentlib:jdwp=transport=dt_socket" + - ",server=y" + ",suspend=y" + ",address=" + address + - " " + class_name; - - System.out.println("Starting: " + cmd); - - Process p = Runtime.getRuntime().exec(cmd); - - IOHandler.handle(p.getInputStream()); - IOHandler.handle(p.getErrorStream()); - - return p; + private static Process launch(String address, String class_name) throws Exception { + String[] args = VMConnection.insertDebuggeeVMOptions(new String[] { + "-agentlib:jdwp=transport=dt_socket" + + ",server=y" + ",suspend=y" + ",address=" + address, + class_name + }); + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args); + + final AtomicBoolean success = new AtomicBoolean(); + Process p = ProcessTools.startProcess( + class_name, + pb, + (line) -> { + // The first thing that will get read is + // Listening for transport dt_socket at address: xxxxx + // which shows the debuggee is ready to accept connections. + success.set(line.contains("Listening for transport dt_socket at address:")); + return true; + }, + 1500, + TimeUnit.MILLISECONDS + ); + + return success.get() ? p : null; } /* @@ -131,23 +99,14 @@ public class BadHandshakeTest { * - verify we saw no error */ public static void main(String args[]) throws Exception { - // find a free port - ServerSocket ss = new ServerSocket(0); - int port = ss.getLocalPort(); - ss.close(); + int port = Utils.getFreePort(); String address = String.valueOf(port); // launch the server debuggee Process process = launch(address, "Exit0"); - - // wait for the debugge to be ready - while (!ready) { - try { - Thread.sleep(1000); - } catch(Exception ee) { - throw ee; - } + if (process == null) { + throw new RuntimeException("Unable to start debugee"); } // Connect to the debuggee and handshake with garbage