1
1
/*
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.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
21
21
* questions.
22
22
*/
23
23
24
+ import java .net .ConnectException ;
24
25
import java .net .Socket ;
25
26
26
27
import com .sun .jdi .Bootstrap ;
34
35
import java .util .List ;
35
36
import java .util .Iterator ;
36
37
import java .util .concurrent .TimeUnit ;
37
- import java .util .concurrent .atomic .AtomicBoolean ;
38
38
39
- import jdk .test .lib .Utils ;
40
- import jdk .test .lib .process .ProcessTools ;
39
+ import lib .jdb .Debuggee ;
41
40
42
41
/* @test
43
42
* @bug 6306165 6432567
46
45
*
47
46
* @modules java.management
48
47
* jdk.jdi
49
- * @build VMConnection BadHandshakeTest Exit0
48
+ * @build BadHandshakeTest Exit0
50
49
* @run driver BadHandshakeTest
51
50
*/
52
51
public class BadHandshakeTest {
@@ -58,129 +57,84 @@ private static Connector findConnector(String name) {
58
57
List <Connector > connectors = Bootstrap .virtualMachineManager ().allConnectors ();
59
58
Iterator <Connector > iter = connectors .iterator ();
60
59
while (iter .hasNext ()) {
61
- Connector connector = ( Connector ) iter .next ();
60
+ Connector connector = iter .next ();
62
61
if (connector .name ().equals (name )) {
63
62
return connector ;
64
63
}
65
64
}
66
65
return null ;
67
66
}
68
67
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 ));
107
70
}
108
71
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
- */
115
72
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
+ }
129
110
}
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 ;
156
113
}
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 {
167
114
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
+ }
170
133
171
- public LaunchResult (Process p , boolean bindFailed ) {
172
- this .p = p ;
173
- this .bindFailed = bindFailed ;
174
- }
134
+ vm .eventRequestManager ().deleteAllBreakpoints ();
135
+ vm .resume ();
175
136
176
- public Process getProcess () {
177
- return p ;
137
+ debuggee .waitFor (10 , TimeUnit .SECONDS );
178
138
}
179
-
180
- public boolean isBindFailed () {
181
- return bindFailed ;
182
- }
183
-
184
139
}
185
-
186
140
}
0 commit comments