1 /* 2 * Copyright (c) 2004, 2013, 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 /* DemoRun: 26 * 27 * Support classes for java jvmti demo tests 28 * 29 */ 30 31 import java.io.InputStream; 32 import java.io.IOException; 33 import java.io.File; 34 import java.io.BufferedInputStream; 35 import java.io.PrintStream; 36 37 /* 38 * Helper class to direct process output to a StringBuffer 39 */ 40 class MyInputStream implements Runnable { 41 private String name; 42 private BufferedInputStream in; 43 private StringBuffer buffer; 44 45 /* Create MyInputStream that saves all output to a StringBuffer */ 46 MyInputStream(String name, InputStream in) { 47 this.name = name; 48 this.in = new BufferedInputStream(in); 49 buffer = new StringBuffer(4096); 50 Thread thr = new Thread(this); 51 thr.setDaemon(true); 52 thr.start(); 53 } 54 55 /* Dump the buffer */ 56 void dump(PrintStream x) { 57 String str = buffer.toString(); 58 x.println("<beginning of " + name + " buffer>"); 59 x.println(str); 60 x.println("<end of buffer>"); 61 } 62 63 /* Check to see if a pattern is inside the output. */ 64 boolean contains(String pattern) { 65 String str = buffer.toString(); 66 return str.contains(pattern); 67 } 68 69 /* Runs as a separate thread capturing all output in a StringBuffer */ 70 public void run() { 71 try { 72 byte b[] = new byte[100]; 73 for (;;) { 74 int n = in.read(b); 75 String str; 76 if (n < 0) { 77 break; 78 } 79 str = new String(b, 0, n); 80 buffer.append(str); 81 System.out.print(str); 82 } 83 } catch (IOException ioe) { /* skip */ } 84 } 85 } 86 87 /* 88 * Main JVMTI Demo Run class. 89 */ 90 public class DemoRun { 91 92 private String demo_name; 93 private String demo_options; 94 private MyInputStream output; 95 private MyInputStream error; 96 97 /* Create a Demo run process */ 98 public DemoRun(String name, String options) 99 { 100 demo_name = name; 101 demo_options = options; 102 } 103 104 /* 105 * Execute a process with an -agentpath or -agentlib command option 106 */ 107 public void runit(String class_name) 108 { 109 runit(class_name, null); 110 } 111 112 /* 113 * Execute a process with an -agentpath or -agentlib command option 114 * plus any set of other java options. 115 */ 116 public void runit(String class_name, String vm_options[]) 117 { 118 String sdk_home = System.getProperty("java.home"); 119 String cdir = System.getProperty("test.classes", "."); 120 String os_arch = System.getProperty("os.arch"); 121 String os_name = System.getProperty("os.name"); 122 String libprefix = os_name.contains("Windows")?"":"lib"; 123 String libsuffix = os_name.contains("Windows")?".dll": 124 os_name.contains("OS X")?".dylib":".so"; 125 String java = sdk_home 126 + File.separator + "bin" 127 + File.separator + "java"; 128 /* Array of strings to be passed in for exec: 129 * 1. java 130 * 2. -Dtest.classes=. 131 * 3. -Xcheck:jni (Just because it finds bugs) 132 * 4. -Xverify:all (Make sure verification is on full blast) 133 * 5. -agent 134 * vm_options 135 * 6+i. classname 136 */ 137 int nvm_options = 0; 138 if ( vm_options != null ) nvm_options = vm_options.length; 139 String cmd[] = new String[1 + 7 + nvm_options]; 140 String cmdLine; 141 int exitStatus; 142 int i,j; 143 144 i = 0; 145 cmdLine = ""; 146 cmdLine += (cmd[i++] = java); 147 cmdLine += " "; 148 cmdLine += (cmd[i++] = "-cp"); 149 cmdLine += " "; 150 cmdLine += (cmd[i++] = cdir); 151 cmdLine += " "; 152 cmdLine += (cmd[i++] = "-Dtest.classes=" + cdir); 153 cmdLine += " "; 154 cmdLine += (cmd[i++] = "-Xcheck:jni"); 155 cmdLine += " "; 156 cmdLine += (cmd[i++] = "-Xverify:all"); 157 String libname = sdk_home 158 + File.separator + "demo" 159 + File.separator + "jvmti" 160 + File.separator + demo_name 161 + File.separator + "lib" 162 + File.separator + libprefix + demo_name + libsuffix; 163 cmdLine += " "; 164 cmdLine += (cmd[i++] = "-agentpath:" + libname 165 + (demo_options.equals("") ? "" : ("=" + demo_options))); 166 /* Add any special VM options */ 167 for ( j = 0; j < nvm_options; j++ ) { 168 cmdLine += " "; 169 cmdLine += (cmd[i++] = vm_options[j]); 170 } 171 /* Add classname */ 172 cmdLine += " "; 173 cmdLine += (cmd[i++] = class_name); 174 175 /* Begin process */ 176 Process p; 177 178 System.out.println("Starting: " + cmdLine); 179 try { 180 p = Runtime.getRuntime().exec(cmd); 181 } catch ( IOException e ) { 182 throw new RuntimeException("Test failed - exec got IO exception"); 183 } 184 185 /* Save process output in StringBuffers */ 186 output = new MyInputStream("Input Stream", p.getInputStream()); 187 error = new MyInputStream("Error Stream", p.getErrorStream()); 188 189 /* Wait for process to complete, and if exit code is non-zero we fail */ 190 try { 191 exitStatus = p.waitFor(); 192 if ( exitStatus != 0) { 193 System.out.println("Exit code is " + exitStatus); 194 error.dump(System.out); 195 output.dump(System.out); 196 throw new RuntimeException("Test failed - " + 197 "exit return code non-zero " + 198 "(exitStatus==" + exitStatus + ")"); 199 } 200 } catch ( InterruptedException e ) { 201 throw new RuntimeException("Test failed - process interrupted"); 202 } 203 System.out.println("Completed: " + cmdLine); 204 } 205 206 /* Does the pattern appear in the output of this process */ 207 public boolean output_contains(String pattern) 208 { 209 return output.contains(pattern) || error.contains(pattern); 210 } 211 }