31813
+ − 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
}