blob: 58c582360180982651e23060636480c4bfba67a1 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/* @test
25 * @bug 4287596
26 * @summary Unit test for "Pluggable Connectors and Transports" feature.
27 *
28 * This test checks that VirtualMachineManager creates Connectors that
29 * are "compatible" those created by 1.4 or earilier releases.
30 */
31
32import com.sun.jdi.*;
33import com.sun.jdi.connect.*;
34import java.util.*;
35
36public class CompatibleConnectors {
37
38 // number of tests that fail
39 static int failures;
40
41 static void fail(String msg) {
42 System.out.println(msg + " - test failed.");
43 failures++;
44 }
45
46 // the AttachingConnectors that we expect
47 static Object[][] attachingConnectors() {
48 return new Object[][] {
49 { "com.sun.jdi.SocketAttach",
50 "dt_socket",
51 new String[] { "hostname", "Connector.StringArgument", "false" },
52 new String[] { "port", "Connector.IntegerArgument", "true" }
53 },
54
55 { "com.sun.jdi.SharedMemoryAttach",
56 "dt_shmem",
57 new String[] { "name", "Connector.StringArgument", "true" }
58 }
59 };
60 }
61
62 // the ListeningConnectors that we expect
63 static Object[][] listeningConnectors() {
64 return new Object[][] {
65 { "com.sun.jdi.SocketListen",
66 "dt_socket",
67 new String[] { "port", "Connector.IntegerArgument", "true" }
68 },
69
70 { "com.sun.jdi.SharedMemoryListen",
71 "dt_shmem",
72 new String[] { "name", "Connector.StringArgument", "false" }
73 }
74 };
75
76 }
77
78 // the LaunchingConnectors that we expect
79 // - note that we don't indicate the transport name (as it varies
80 // for these connectors)
81 static Object[][] launchingConnectors() {
82 return new Object[][] {
83 { "com.sun.jdi.CommandLineLaunch",
84 null,
85 new String[] { "home", "Connector.StringArgument", "false" },
86 new String[] { "options", "Connector.StringArgument", "false" },
87 new String[] { "main", "Connector.StringArgument", "true" },
88 new String[] { "suspend", "Connector.BooleanArgument", "false" },
89 new String[] { "quote", "Connector.StringArgument", "true" },
90 new String[] { "vmexec", "Connector.StringArgument", "true" }
91 },
92
93 { "com.sun.jdi.RawCommandLineLaunch",
94 null,
95 new String[] { "command", "Connector.StringArgument", "true" },
96 new String[] { "address", "Connector.StringArgument", "true" },
97 new String[] { "quote", "Connector.StringArgument", "true" }
98 }
99 };
100
101 }
102
103 // find Connector by name, return null if not found
104 static Connector find(String name, List l) {
105 Iterator i = l.iterator();
106 while (i.hasNext()) {
107 Connector c = (Connector)i.next();
108 if (c.name().equals(name)) {
109 return c;
110 }
111 }
112 return null;
113 }
114
115 // check that a connector is of the expected type
116 static void type_match(String arg_name, String arg_type, Connector.Argument arg) {
117 boolean fail = false;
118 if (arg_type.equals("Connector.StringArgument")) {
119 if (!(arg instanceof Connector.StringArgument)) {
120 fail = true;
121 }
122 }
123 if (arg_type.equals("Connector.IntegerArgument")) {
124 if (!(arg instanceof Connector.IntegerArgument)) {
125 fail = true;
126 }
127 }
128 if (arg_type.equals("Connector.BooleanArgument")) {
129 if (!(arg instanceof Connector.BooleanArgument)) {
130 fail = true;
131 }
132 }
133 if (arg_type.equals("Connector.SelectedArgument")) {
134 if (!(arg instanceof Connector.IntegerArgument)) {
135 fail = true;
136 }
137 }
138 if (fail) {
139 fail(arg_name + " is of type: " + arg.getClass() + ", expected: "
140 + arg_type);
141 }
142 }
143
144
145 // check that a Connector is compatible
146 static void check(Object[] desc, Connector connector) {
147 String name = (String)desc[0];
148 String transport_name = (String)desc[1];
149
150 // if the transport name is "null" it means its transport may
151 // vary (eg: SunCommandLineLauncher will choose shared memory
152 // on Windows and dt_socket on Solaris). In that case we can't
153 // check the transport name.
154 //
155 if (transport_name != null) {
156 System.out.println("Checking transpot name");
157 if (!(transport_name.equals(connector.transport().name()))) {
158 fail("transport().name() returns: " +
159 connector.transport().name() + ", expected: " + transport_name);
160 }
161 }
162
163 // check that all the old arguments still exist
164 for (int i=2; i<desc.length; i++) {
165 String[] args = (String[])desc[i];
166 String arg_name = args[0];
167 String arg_type = args[1];
168 String arg_mandatory = args[2];
169
170 System.out.println("Checking argument: " + arg_name);
171
172 // check that the arg still exists
173 Map defaultArgs = connector.defaultArguments();
174 Object value = defaultArgs.get(arg_name);
175 if (value == null) {
176 fail(name + " is missing Connector.Argument: " + arg_name);
177 continue;
178 }
179
180 // next check that the type matches
181 Connector.Argument connector_arg = (Connector.Argument)value;
182
183 // check that the argument type hasn't changed
184 type_match(arg_name, arg_type, connector_arg);
185
186 // check that an optional argument has been made mandatory
187 if (arg_mandatory.equals("false")) {
188 if (connector_arg.mustSpecify()) {
189 fail(arg_name + " is now mandatory");
190 }
191 }
192 }
193
194 // next we check for new arguments that are mandatory but
195 // have no default value
196
197 System.out.println("Checking for new arguments");
198 Map dfltArgs = connector.defaultArguments();
199 Iterator iter = dfltArgs.keySet().iterator();
200 while (iter.hasNext()) {
201 String arg_name = (String)iter.next();
202
203 // see if the argument is new
204 boolean found = false;
205 for (int j=2; j<desc.length; j++) {
206 String[] args = (String[])desc[j];
207 if (args[0].equals(arg_name)) {
208 found = true;
209 break;
210 }
211 }
212
213 if (!found) {
214 Connector.Argument connector_arg =
215 (Connector.Argument)dfltArgs.get(arg_name);
216
217 if (connector_arg.mustSpecify()) {
218 String value = connector_arg.value();
219 if (value.equals("")) {
220 value = null;
221 }
222 if (value == null) {
223 fail("New Connector.Argument \"" + connector_arg.name() +
224 "\" added - argument is mandatory");
225 }
226 }
227 }
228 }
229 }
230
231
232 // compare the actual list of Connectors against the
233 // expected list of Connectors.
234 static void compare(Object[][] prev, List list) {
235 String os = System.getProperty("os.name");
236 for (int i=0; i<prev.length; i++) {
237 Object[] desc = prev[i];
238 String name = (String)desc[0];
239
240 // ignore Windows specific Connectors are non-Windows machines
241 if (!(os.startsWith("Windows"))) {
242 if (name.equals("com.sun.jdi.SharedMemoryAttach") ||
243 name.equals("com.sun.jdi.SharedMemoryListen")) {
244 continue;
245 }
246 }
247
248 System.out.println("");
249 System.out.println("Checking Connector " + name);
250
251 // check that the Connector exists
252 Connector c = find(name, list);
253 if (c == null) {
254 fail("Connector is missing");
255 continue;
256 }
257
258 check(desc, c);
259 }
260 }
261
262 public static void main(String args[]) throws Exception {
263 VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
264
265 // in 1.2/1.3/1.4 the defualtConnector was
266 // com.sun.jdi.CommandLineLaunch. Many debuggers probably
267 // depend on this so check that it's always the default.
268 //
269 String expected = "com.sun.jdi.CommandLineLaunch";
270 System.out.println("Checking that defaultConnector is: " + expected);
271 String dflt = vmm.defaultConnector().name();
272 if (!(dflt.equals(expected))) {
273 System.err.println("defaultConnector() is: " + dflt +
274 ", expected:" + expected);
275 failures++;
276 } else {
277 System.out.println("Okay");
278 }
279
280 compare(attachingConnectors(), vmm.attachingConnectors());
281 compare(listeningConnectors(), vmm.listeningConnectors());
282 compare(launchingConnectors(), vmm.launchingConnectors());
283
284 // test results
285 if (failures > 0) {
286 System.out.println("");
287 throw new RuntimeException(failures + " test(s) failed");
288 }
289 }
290}