Skip to content

Commit 880e1ab

Browse files
committed
8192057: com/sun/jdi/BadHandshakeTest.java fails with java.net.ConnectException
Backport-of: c920b4a
1 parent e937be3 commit 880e1ab

File tree

1 file changed

+67
-113
lines changed

1 file changed

+67
-113
lines changed
+67-113
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -21,6 +21,7 @@
2121
* questions.
2222
*/
2323

24+
import java.net.ConnectException;
2425
import java.net.Socket;
2526

2627
import com.sun.jdi.Bootstrap;
@@ -34,10 +35,8 @@
3435
import java.util.List;
3536
import java.util.Iterator;
3637
import java.util.concurrent.TimeUnit;
37-
import java.util.concurrent.atomic.AtomicBoolean;
3838

39-
import jdk.test.lib.Utils;
40-
import jdk.test.lib.process.ProcessTools;
39+
import lib.jdb.Debuggee;
4140

4241
/* @test
4342
* @bug 6306165 6432567
@@ -46,7 +45,7 @@
4645
*
4746
* @modules java.management
4847
* jdk.jdi
49-
* @build VMConnection BadHandshakeTest Exit0
48+
* @build BadHandshakeTest Exit0
5049
* @run driver BadHandshakeTest
5150
*/
5251
public class BadHandshakeTest {
@@ -58,129 +57,84 @@ private static Connector findConnector(String name) {
5857
List<Connector> connectors = Bootstrap.virtualMachineManager().allConnectors();
5958
Iterator<Connector> iter = connectors.iterator();
6059
while (iter.hasNext()) {
61-
Connector connector = (Connector)iter.next();
60+
Connector connector = iter.next();
6261
if (connector.name().equals(name)) {
6362
return connector;
6463
}
6564
}
6665
return null;
6766
}
6867

69-
/*
70-
* Launch a server debuggee with the given address
71-
*/
72-
private static LaunchResult launch(String address, String class_name) throws Exception {
73-
String[] args = VMConnection.insertDebuggeeVMOptions(new String[] {
74-
"-agentlib:jdwp=transport=dt_socket" +
75-
",server=y" + ",suspend=y" + ",address=" + address,
76-
class_name
77-
});
78-
79-
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args);
80-
81-
final AtomicBoolean success = new AtomicBoolean();
82-
final AtomicBoolean bindFailed = new AtomicBoolean();
83-
Process p = ProcessTools.startProcess(
84-
class_name,
85-
pb,
86-
(line) -> {
87-
// 'Listening for transport dt_socket at address: xxxxx'
88-
// indicates the debuggee is ready to accept connections
89-
if (line.contains("Listening for transport dt_socket at address:")) {
90-
success.set(true);
91-
return true;
92-
}
93-
// 'Address already in use' indicates
94-
// the debuggee has failed to start due to busy port.
95-
if (line.contains("Address already in use")) {
96-
bindFailed.set(true);
97-
return true;
98-
}
99-
return false;
100-
},
101-
Integer.MAX_VALUE,
102-
TimeUnit.MILLISECONDS
103-
);
104-
105-
return new LaunchResult(success.get() ? p : null,
106-
bindFailed.get());
68+
private static void log(Object s) {
69+
System.out.println(String.valueOf(s));
10770
}
10871

109-
/*
110-
* - pick a TCP port
111-
* - Launch a server debuggee: server=y,suspend=y,address=${port}
112-
* - run it to VM death
113-
* - verify we saw no error
114-
*/
11572
public static void main(String args[]) throws Exception {
116-
// Launch the server debuggee
117-
int port = 0;
118-
Process process = null;
119-
while (process == null) {
120-
port = Utils.getFreePort();
121-
String address = String.valueOf(port);
122-
LaunchResult launchResult = launch(address, "Exit0");
123-
process = launchResult.getProcess();
124-
if (launchResult.isBindFailed()) {
125-
System.out.println("Port " + port + " already in use. Trying to restart debuggee with a new one...");
126-
Thread.sleep(100);
127-
} else if (process == null ) {
128-
throw new RuntimeException("Unable to start debugee");
73+
// Launch the server debugee
74+
log("Starting debuggee...");
75+
try (Debuggee debuggee = Debuggee.launcher("Exit0").launch()) {
76+
log("Debuggee started.");
77+
int port = Integer.parseInt(debuggee.getAddress());
78+
log("Debuggee port: " + port);
79+
80+
log("testcase 1...");
81+
// Connect to the debuggee and handshake with garbage
82+
Socket s = new Socket("localhost", port);
83+
s.getOutputStream().write("Here's a poke in the eye".getBytes("UTF-8"));
84+
s.close();
85+
86+
log("testcase 2...");
87+
// Re-connect and do a partial handshake - don't disconnect
88+
// Re-connect just after disconnect may cause "connection refused" error (see JDK-8192057)
89+
Exception error = null;
90+
long retryDelay = 20;
91+
for (int retry = 0; retry < 5; retry++) {
92+
if (error != null) {
93+
try {
94+
Thread.sleep(retryDelay);
95+
} catch (InterruptedException ex) {
96+
// ignore
97+
}
98+
retryDelay *= 2;
99+
error = null;
100+
}
101+
try {
102+
log("retry: " + retry);
103+
s = new Socket("localhost", port);
104+
s.getOutputStream().write("JDWP-".getBytes("UTF-8"));
105+
break;
106+
} catch (ConnectException ex) {
107+
log("got exception: " + ex.toString());
108+
error = ex;
109+
}
129110
}
130-
}
131-
132-
// Connect to the debuggee and handshake with garbage
133-
Socket s = new Socket("localhost", port);
134-
s.getOutputStream().write("Here's a poke in the eye".getBytes("UTF-8"));
135-
s.close();
136-
137-
// Re-connect and to a partial handshake - don't disconnect
138-
s = new Socket("localhost", port);
139-
s.getOutputStream().write("JDWP-".getBytes("UTF-8"));
140-
141-
142-
// Attach to server debuggee and resume it so it can exit
143-
AttachingConnector conn = (AttachingConnector)findConnector("com.sun.jdi.SocketAttach");
144-
Map<String, Argument> conn_args = conn.defaultArguments();
145-
Connector.IntegerArgument port_arg =
146-
(Connector.IntegerArgument)conn_args.get("port");
147-
port_arg.setValue(port);
148-
VirtualMachine vm = conn.attach(conn_args);
149-
150-
// The first event is always a VMStartEvent, and it is always in
151-
// an EventSet by itself. Wait for it.
152-
EventSet evtSet = vm.eventQueue().remove();
153-
for (Event event: evtSet) {
154-
if (event instanceof VMStartEvent) {
155-
break;
111+
if (error != null) {
112+
throw error;
156113
}
157-
throw new RuntimeException("Test failed - debuggee did not start properly");
158-
}
159-
160-
vm.eventRequestManager().deleteAllBreakpoints();
161-
vm.resume();
162-
163-
process.waitFor();
164-
}
165-
166-
private static class LaunchResult {
167114

168-
private final Process p;
169-
private final boolean bindFailed;
115+
log("cleaning...");
116+
// Attach to server debuggee and resume it so it can exit
117+
AttachingConnector conn = (AttachingConnector)findConnector("com.sun.jdi.SocketAttach");
118+
Map<String, Argument> conn_args = conn.defaultArguments();
119+
Connector.IntegerArgument port_arg =
120+
(Connector.IntegerArgument)conn_args.get("port");
121+
port_arg.setValue(port);
122+
VirtualMachine vm = conn.attach(conn_args);
123+
124+
// The first event is always a VMStartEvent, and it is always in
125+
// an EventSet by itself. Wait for it.
126+
EventSet evtSet = vm.eventQueue().remove();
127+
for (Event event : evtSet) {
128+
if (event instanceof VMStartEvent) {
129+
break;
130+
}
131+
throw new RuntimeException("Test failed - debuggee did not start properly");
132+
}
170133

171-
public LaunchResult(Process p, boolean bindFailed) {
172-
this.p = p;
173-
this.bindFailed = bindFailed;
174-
}
134+
vm.eventRequestManager().deleteAllBreakpoints();
135+
vm.resume();
175136

176-
public Process getProcess() {
177-
return p;
137+
debuggee.waitFor(10, TimeUnit.SECONDS);
178138
}
179-
180-
public boolean isBindFailed() {
181-
return bindFailed;
182-
}
183-
184139
}
185-
186140
}

0 commit comments

Comments
 (0)