提交 090aaac3 编写于 作者: J jbachorik

8004126: TEST_BUG: com/sun/jdi/BadHandshakeTest.java fails intermittently

Reviewed-by: dholmes, ykantser
上级 257253a0
...@@ -24,16 +24,12 @@ ...@@ -24,16 +24,12 @@
/* @test /* @test
* @bug 6306165 6432567 * @bug 6306165 6432567
* @summary Check that a bad handshake doesn't cause a debuggee to abort * @summary Check that a bad handshake doesn't cause a debuggee to abort
* @library /lib/testlibrary
* *
* @build VMConnection BadHandshakeTest Exit0 * @build VMConnection BadHandshakeTest Exit0
* @run main BadHandshakeTest * @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.Socket;
import java.net.InetAddress; import java.net.InetAddress;
import com.sun.jdi.Bootstrap; import com.sun.jdi.Bootstrap;
...@@ -44,50 +40,13 @@ import com.sun.jdi.connect.AttachingConnector; ...@@ -44,50 +40,13 @@ import com.sun.jdi.connect.AttachingConnector;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
public class BadHandshakeTest { import jdk.testlibrary.Utils;
import jdk.testlibrary.ProcessTools;
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();
}
}
}
public class BadHandshakeTest {
/* /*
* Find a connector by name * Find a connector by name
*/ */
...@@ -106,22 +65,31 @@ public class BadHandshakeTest { ...@@ -106,22 +65,31 @@ public class BadHandshakeTest {
/* /*
* Launch a server debuggee with the given address * Launch a server debuggee with the given address
*/ */
private static Process launch(String address, String class_name) throws IOException { private static Process launch(String address, String class_name) throws Exception {
String exe = System.getProperty("java.home") String[] args = VMConnection.insertDebuggeeVMOptions(new String[] {
+ File.separator + "bin" + File.separator + "java"; "-agentlib:jdwp=transport=dt_socket" +
String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() + ",server=y" + ",suspend=y" + ",address=" + address,
" -agentlib:jdwp=transport=dt_socket" + class_name
",server=y" + ",suspend=y" + ",address=" + address + });
" " + class_name;
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args);
System.out.println("Starting: " + cmd);
final AtomicBoolean success = new AtomicBoolean();
Process p = Runtime.getRuntime().exec(cmd); Process p = ProcessTools.startProcess(
class_name,
IOHandler.handle(p.getInputStream()); pb,
IOHandler.handle(p.getErrorStream()); (line) -> {
// The first thing that will get read is
return p; // 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 { ...@@ -131,23 +99,14 @@ public class BadHandshakeTest {
* - verify we saw no error * - verify we saw no error
*/ */
public static void main(String args[]) throws Exception { public static void main(String args[]) throws Exception {
// find a free port int port = Utils.getFreePort();
ServerSocket ss = new ServerSocket(0);
int port = ss.getLocalPort();
ss.close();
String address = String.valueOf(port); String address = String.valueOf(port);
// launch the server debuggee // launch the server debuggee
Process process = launch(address, "Exit0"); Process process = launch(address, "Exit0");
if (process == null) {
// wait for the debugge to be ready throw new RuntimeException("Unable to start debugee");
while (!ready) {
try {
Thread.sleep(1000);
} catch(Exception ee) {
throw ee;
}
} }
// Connect to the debuggee and handshake with garbage // Connect to the debuggee and handshake with garbage
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册