1 /* 2 * Copyright (c) 2002, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test NoLaunchOptionTest.java 26 * @bug 4554734 4724714 27 * @summary Test for -Xrunjdwp:[onthrow,onuncaught] suboptions require launch suboption 28 * @author Tim Bell 29 * 30 * @modules jdk.jdi 31 * @run compile -g NoLaunchOptionTest.java 32 * @build VMConnection 33 * @run driver NoLaunchOptionTest 34 */ 35 36 import java.net.ServerSocket; 37 38 public class NoLaunchOptionTest extends Object { 39 private Process subprocess; 40 private int subprocessStatus; 41 private static final String CR = System.getProperty("line.separator"); 42 private static final int BUFFERSIZE = 4096; 43 public static final int RETSTAT = 0; 44 public static final int STDOUT = 1; 45 public static final int STDERR = 2; 46 47 /** 48 * Run an arbitrary command and return the results to caller. 49 * 50 * @param an array of String containing the command 51 * to run and any flags or parameters to the command. 52 * 53 * @return completion status, stderr and stdout as array of String 54 * Look for: 55 * return status in result[NoLaunchOptionTest.RETSTAT] 56 * standard out in result[NoLaunchOptionTest.STDOUT] 57 * standard err in result[NoLaunchOptionTest.STDERR] 58 * 59 */ 60 public String[] run (String[] cmdStrings) { 61 StringBuffer stdoutBuffer = new StringBuffer(); 62 StringBuffer stderrBuffer = new StringBuffer(); 63 64 System.out.print(CR + "runCommand method about to execute: "); 65 for (int iNdx = 0; iNdx < cmdStrings.length; iNdx++) { 66 System.out.print(" "); 67 System.out.print(cmdStrings[iNdx]); 68 } 69 System.out.println(CR); 70 try { 71 Process process = Runtime.getRuntime().exec(cmdStrings); 72 /* 73 * Gather up the output of the subprocess using non-blocking 74 * reads so we can get both the subprocess stdout and the 75 * subprocess stderr without overfilling any buffers. 76 */ 77 java.io.BufferedInputStream is = 78 new java.io.BufferedInputStream(process.getInputStream()); 79 int isLen = 0; 80 byte[] isBuf = new byte[BUFFERSIZE]; 81 82 java.io.BufferedInputStream es = 83 new java.io.BufferedInputStream(process.getErrorStream()); 84 int esLen = 0; 85 byte[] esBuf = new byte[BUFFERSIZE]; 86 87 do { 88 isLen = is.read(isBuf); 89 if (isLen > 0) { 90 stdoutBuffer.append( 91 new String(isBuf, 0, isLen)); 92 } 93 esLen = es.read(esBuf); 94 if (esLen > 0) { 95 stderrBuffer.append( 96 new String(esBuf, 0, esLen)); 97 } 98 } while ((isLen > -1) || (esLen > -1)); 99 try { 100 process.waitFor(); 101 subprocessStatus = process.exitValue(); 102 process = null; 103 } catch(java.lang.InterruptedException e) { 104 System.err.println("InterruptedException: " + e); 105 } 106 107 } catch(java.io.IOException ex) { 108 System.err.println("IO error: " + ex); 109 } 110 String[] result = 111 new String[] { 112 Integer.toString(subprocessStatus), 113 stdoutBuffer.toString(), 114 stderrBuffer.toString() 115 }; 116 117 System.out.println(CR + "--- Return code was: " + 118 CR + result[RETSTAT]); 119 System.out.println(CR + "--- Return stdout was: " + 120 CR + result[STDOUT]); 121 System.out.println(CR + "--- Return stderr was: " + 122 CR + result[STDERR]); 123 124 return result; 125 } 126 127 public static void main(String[] args) throws Exception { 128 // find a free port 129 ServerSocket ss = new ServerSocket(0); 130 int port = ss.getLocalPort(); 131 ss.close(); 132 String address = String.valueOf(port); 133 134 String javaExe = System.getProperty("java.home") + 135 java.io.File.separator + "bin" + 136 java.io.File.separator + "java"; 137 String targetClass = "NotAClass"; 138 String cmds [] = {javaExe, 139 "-agentlib:jdwp=transport=dt_socket,address=" + 140 address + "," + 141 "onthrow=java.lang.ClassNotFoundException,suspend=n", 142 targetClass}; 143 NoLaunchOptionTest myTest = new NoLaunchOptionTest(); 144 String results [] = myTest.run(VMConnection.insertDebuggeeVMOptions(cmds)); 145 if ((results[RETSTAT].equals("1")) && 146 (results[STDERR].contains("ERROR:"))) { 147 System.out.println("Test passed: status = 1 with warning messages " + 148 "is expected and normal for this test"); 149 } else { 150 throw new Exception("Test failed: unspecified test failure"); 151 } 152 } 153 154 }