OptionTest.java revision 2017
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews/*
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * This code is free software; you can redistribute it and/or modify it
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * under the terms of the GNU General Public License version 2 only, as
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * published by the Free Software Foundation.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * This code is distributed in the hope that it will be useful, but WITHOUT
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * version 2 for more details (a copy is included in the LICENSE file that
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * accompanied this code).
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * You should have received a copy of the GNU General Public License version
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * 2 along with this work; if not, write to the Free Software Foundation,
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * CA 95054 USA or visit www.sun.com if you need additional information or
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * have any questions.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews */
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews/*
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @test OptionTest
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @bug 5095072
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @summary Test for misc jdwp options, just that the option is parsed
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @author Kelly O'Hair (copied from Tim Bell's NoLaunchOptionTest)
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @run compile -g OptionTest.java
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @run compile -g HelloWorld.java
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @run compile -g VMConnection.java
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @run main/othervm OptionTest
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews */
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrewsimport java.net.ServerSocket;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrewspublic class OptionTest extends Object {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews private Process subprocess;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews private int subprocessStatus;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews private static final String CR = System.getProperty("line.separator");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews private static final int BUFFERSIZE = 4096;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews public static final int RETSTAT = 0;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews public static final int STDOUT = 1;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews public static final int STDERR = 2;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews /**
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Run an arbitrary command and return the results to caller.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @param an array of String containing the command
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * to run and any flags or parameters to the command.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * @return completion status, stderr and stdout as array of String
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Look for:
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * return status in result[OptionTest.RETSTAT]
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * standard out in result[OptionTest.STDOUT]
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * standard err in result[OptionTest.STDERR]
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews *
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews */
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews public String[] run (String[] cmdStrings) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews StringBuffer stdoutBuffer = new StringBuffer();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews StringBuffer stderrBuffer = new StringBuffer();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.print(CR + "runCommand method about to execute: ");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews for (int iNdx = 0; iNdx < cmdStrings.length; iNdx++) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.print(" ");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.print(cmdStrings[iNdx]);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.println(CR);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews try {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews Process process = Runtime.getRuntime().exec(cmdStrings);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews /*
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Gather up the output of the subprocess using non-blocking
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * reads so we can get both the subprocess stdout and the
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * subprocess stderr without overfilling any buffers.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews */
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews java.io.BufferedInputStream is =
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews new java.io.BufferedInputStream(process.getInputStream());
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews int isLen = 0;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews byte[] isBuf = new byte[BUFFERSIZE];
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews java.io.BufferedInputStream es =
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews new java.io.BufferedInputStream(process.getErrorStream());
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews int esLen = 0;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews byte[] esBuf = new byte[BUFFERSIZE];
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews do {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews isLen = is.read(isBuf);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews if (isLen > 0) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews stdoutBuffer.append(
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews new String(isBuf, 0, isLen));
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews esLen = es.read(esBuf);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews if (esLen > 0) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews stderrBuffer.append(
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews new String(esBuf, 0, esLen));
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews } while ((isLen > -1) || (esLen > -1));
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews try {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews process.waitFor();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews subprocessStatus = process.exitValue();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews process = null;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews } catch(java.lang.InterruptedException e) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.err.println("InterruptedException: " + e);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews } catch(java.io.IOException ex) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.err.println("IO error: " + ex);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String[] result =
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews new String[] {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews Integer.toString(subprocessStatus),
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews stdoutBuffer.toString(),
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews stderrBuffer.toString()
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews };
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.println(CR + "--- Return code was: " +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews CR + result[RETSTAT]);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.println(CR + "--- Return stdout was: " +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews CR + result[STDOUT]);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.println(CR + "--- Return stderr was: " +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews CR + result[STDERR]);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews return result;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews public static void main(String[] args) throws Exception {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews // find a free port
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ServerSocket ss = new ServerSocket(0);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews int port = ss.getLocalPort();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ss.close();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String address = String.valueOf(port);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String javaExe = System.getProperty("java.home") +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews java.io.File.separator + "bin" +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews java.io.File.separator + "java";
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String targetClass = "HelloWorld";
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String baseOptions = "transport=dt_socket" +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ",address=" + address +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ",server=y" +
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ",suspend=n";
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews /* Option combinations to try (combos faster, fewer exec's) */
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String options[] = {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "timeout=0,mutf8=y,quiet=y,stdalloc=y,strict=n",
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "timeout=200000,mutf8=n,quiet=n,stdalloc=n,strict=y"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews };
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews for ( String option : options) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String cmds [] = {javaExe,
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "-agentlib:jdwp=" + baseOptions + "," + option,
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews targetClass};
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews OptionTest myTest = new OptionTest();
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String results [] = myTest.run(VMConnection.insertDebuggeeVMOptions(cmds));
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews if (!(results[RETSTAT].equals("0")) ||
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews (results[STDERR].startsWith("ERROR:"))) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews throw new Exception("Test failed: jdwp doesn't like " + cmds[1]);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews System.out.println("Test passed: status = 0");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews }
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews}
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews