/* * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package nsk.jdi.Argument.value; import nsk.share.*; import nsk.share.jpda.*; import nsk.share.jdi.*; import com.sun.jdi.*; import com.sun.jdi.connect.*; import java.io.*; import javax.naming.directory.Attribute; import java.util.*; /** * Test for the control of * * Interface: com.sun.jdi.connect.Connector.Argument * Method: public java.lang.String value() * Assertion: "Returns the current value of the argument." * * * Comments: The test aims on the concrete Sun's JDI * reference implementations. It uses * com.sun.jdi.CommandLineLaunch connector and its * "options" and "main" arguments. * The test sets up the new "options" and "main" arguments * values and then checks that new values remain previously * after connection establishing with debugee VM and * after debugee VM finishing. */ public class value003 { private static Log log; public static void main(String argv[] ) { System.exit(run(argv, System.out)+95); // JCK-compatible exit status } public static int run(String argv[], PrintStream out) { ArgumentHandler argHandler = new ArgumentHandler(argv); log = new Log(out, argHandler); VirtualMachineManager vmm = Bootstrap.virtualMachineManager(); String javaKind = argHandler.getOptions().getProperty("debugee.vmkind"); boolean java_g = javaKind != null && javaKind.startsWith("java_g"); // ...or java_g.exe if (java_g) log.display("Test option: java_g"); List lcl = vmm.launchingConnectors(); if (lcl.size() > 0) { log.display("Number of all known JDI launching connectors: " + lcl.size()); } else { log.complain("FAILURE: no JDI launching connectors found!"); return 2; } Iterator lci = lcl.iterator(); for (int i = 1; lci.hasNext(); i++) { Connector c = (Connector) lci.next(); if (c.name().compareTo("com.sun.jdi.CommandLineLaunch") != 0) { continue; } Map cdfltArgmnts = c.defaultArguments(); int ksz = cdfltArgmnts.size(); String av[] = new String[ksz + 1]; Set ks = cdfltArgmnts.keySet(); if (ks.isEmpty()) { log.complain("FAILURE: empty default argument set is found " + "for " + c.name() + " connector!"); return 2; } log.display("Looking over " + c.name() + " connector arguments: "); boolean flg = false; Iterator argi = ks.iterator(); String ovl = null; String nvl = null; for (int j = 1; argi.hasNext(); j++) { String argkey = (String)argi.next(); Connector.Argument argval = (Connector.Argument)cdfltArgmnts.get((Object) argkey); if (java_g && argval.name().equals("vmexec")) { log.display("Substitute: vmexec --> java_g"); argval.setValue("java_g"); }; log.display("Connector.Argument argval = "+ argval); if (argkey.compareTo("options") != 0 && argkey.compareTo("main") != 0) { continue; } if (argkey.compareTo("main") == 0) { if (argval.isValid("nsk.jdi.Argument.value.value003a")) { argval.setValue("nsk.jdi.Argument.value.value003a"); } else { log.complain("FAILURE: Can't set up new value for " + "main-argument"); return 2; } continue; } flg = true; ovl = argval.value(); if (argval.isValid(ovl + "-verify ")) { argval.setValue(ovl + "-verify "); } else { log.complain("FAILURE: Can't set up new value for " + "options-argument"); return 2; } nvl = argval.value(); if (nvl.compareTo(ovl + "-verify ") != 0) { log.complain("FAILURE: Can't set up argument value!"); return 2; } log.display("Changed " + argval.name() + " argument's " + "value is: " + nvl); }; Binder binder = new Binder(argHandler, log); Debugee debugee = null; try { if (flg) { flg = false; VirtualMachine vm = ((LaunchingConnector) c).launch(cdfltArgmnts); log.display("VM = (" + vm + ")"); debugee = binder.enwrapDebugee(vm, vm.process()); if (((Connector.Argument)cdfltArgmnts .get((Object)"options")).value() .compareTo(ovl + "-verify ") != 0) { log.complain("FAILURE: Current 'options' argument " + "value is not coinsides with the last " + "setted up value."); return 2; } if (((Connector.Argument)c.defaultArguments() .get((Object) "options")).value() .compareTo(ovl) != 0) { log.complain("FAILURE: Default 'options' argument " + "value can not be changed."); return 2; } debugee.resume(); } } catch ( java.io.IOException exc) { log.complain("FAILURE: Unable to launch, so " + "java.io.IOException is arisen."); log.complain(exc.getMessage()); return 2; } catch (com.sun.jdi.connect.IllegalConnectorArgumentsException exc) { log.complain("FAILURE: One of the connector arguments is " + "invalid, so IllegalConnectorArgumentsException " + "is arisen."); log.complain(exc.getMessage()); return 2; } catch ( com.sun.jdi.connect.VMStartException exc) { log.complain("FAILURE: VM was terminated with error before " + "a connection could be established, so " + "VMStartException is arisen."); log.complain(exc.getMessage()); log.complain(Binder.readVMStartExceptionOutput(exc, log.getOutStream())); return 2; } finally { if (debugee != null) { try { debugee.dispose(); } catch (VMDisconnectedException ignore) { } int extcd = debugee.waitFor(); if (extcd != 95) { log.complain("FAILURE: Launching VM crushes with " + extcd + " exit code."); return 2; } } } }; log.display("Test PASSED!"); return 0; } }