blob: 96461095c159a1016123cbc4a94f4315af51207b [file] [log] [blame]
/**
* @test
* @bug 4836939
* @key intermittent
* @summary JDI add addSourceNameFilter to ClassPrepareRequest
* @author Robert Field / Jim Holmlund
*
* @library ..
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
* @run compile FilterMangleTest.java
* @run compile -g onion/pickle/Mangle.java
* @run driver FilterMangleTest
* @run driver FilterMangleTest SDE-pMangle.java*
* @run driver FilterMangleTest SDE-pMangle.jav*
* @run driver FilterMangleTest SDE-pMangle.j*
* @run driver FilterMangleTest SDE-p*Mangle.java
* @run driver FilterMangleTest SDE-p*angle.java
* @run driver FilterMangleTest SDE-p*java
* @run driver FilterMangleTest SDE-pMangle.xyz
* @run driver FilterMangleTest SDE-pIncl.rats*
* @run driver FilterMangleTest SDE-pIncl.rat*
* @run driver FilterMangleTest SDE-p*angle.rats
* @run driver FilterMangleTest SDE-f*Incl.rat
* @run driver FilterMangleTest SDE-ffred
* @run driver FilterMangleTest SDE-f*ratsx
* @run driver FilterMangleTest SDE-fMangle.javax*
*/
/*
* In this test, the file name that contains the class being
* prepared is Mangle.java.
* But, an SDE is created for it that contains the names Mangle.java,
* Mangle.xyz, Incl.xyz, Mangel.rats, Incl.rats.
* This test proves that specifying various patterns for these names
* in a SourceNameFilter allows the class prepared event thru
* (SDE-p prefix in the above names) or does not allow the event
* thru (SDE-f prefix).
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import com.sun.jdi.request.*;
import java.util.*;
import java.io.File;
class FilterMangleTarg {
public static void bkpt() {
}
public static void main(String[] args) {
System.out.println("calling mangle");
onion.pickle.Mangle.main(args);
System.out.println("calling mangle");
bkpt();
System.out.println("bkpt done");
}
}
public class FilterMangleTest extends TestScaffold {
ClassPrepareRequest cpReq;
boolean shouldResume = false;
boolean gotIt = false;
static boolean shouldPass = true;
static String pattern;
static final String op = "onion" + File.separator + "pickle" + File.separator;
ReferenceType targetClass;
FilterMangleTest (String args[]) {
super(args);
}
public static void main(String[] args) throws Exception {
testSetUp();
if (args.length != 0) {
if (args[0].startsWith("SDE-")) {
// this is a pattern to test
if (args[0].charAt(4) == 'f') {
shouldPass = false;
}
pattern = args[0].substring(5);
String[] args2 = new String[args.length - 1];
System.arraycopy(args, 1, args2, 0, args.length - 1);
new FilterMangleTest(args2).startTests();
return;
}
// could be -trace 255 or whatever
pattern = "Mangle.java";
} else {
// no args at all
pattern = "Mangle.java";
}
new FilterMangleTest(args).startTests();
}
/********** test set-up **********/
static void testSetUp() throws Exception {
InstallSDE.install(new File(System.getProperty("test.classes", "."),
op + "Mangle.class"),
new File(System.getProperty("test.src", "."),
"Mangle.sde"));
}
/********** test core **********/
public void eventSetComplete(EventSet set) {
if (shouldResume) {
set.resume();
shouldResume = false;
}
}
public void classPrepared(ClassPrepareEvent event) {
if (event.request() == cpReq) {
ReferenceType rt = event.referenceType();
String rtname = rt.name();
if (rtname.equals("onion.pickle.Mangle")) {
gotIt = true;
}
shouldResume = true;
// debug code
if (false) {
println("Got ClassPrepareEvent for : " + rtname);
try {
println(" sourceName = " + rt.sourceName());
} catch (AbsentInformationException ee) {
failure("failure: absent info on sourceName(): " + ee);
}
String stratum = rt.defaultStratum();
println(" defaultStratum = " + stratum);
try {
println(" sourceNames = " + rt.sourceNames(stratum));
} catch (AbsentInformationException ee) {
failure("failure: absent info on sourceNames(): " + ee);
}
println("Available strata: " + rt.availableStrata() + "\n");
}
}
}
protected void runTests() throws Exception {
/*
* Be very careful with class prepare requests!
* For example, if you try to set a bkpt on a class not yet
* loaded, TestScaffold will create a class prepare request
* to catch the load of that class so the bkpt can be
* set after the class is loaded. If our event handler
* resumes the event set, then I think that the debuggee
* runs off to completion before the bkpt can actually be
* set.
*/
BreakpointEvent bpe = startToMain("FilterMangleTarg");
targetClass = bpe.location().declaringType();
if (!vm().canGetSourceDebugExtension()) {
failure("FAIL: canGetSourceDebugExtension() is false");
} else {
println("canGetSourceDebugExtension() is true");
}
EventRequestManager erm = vm().eventRequestManager();
cpReq = erm.createClassPrepareRequest();
if (true) {
cpReq.addSourceNameFilter(pattern);
} else {
// a manual test for passing mulitple filters.
cpReq.addSourceNameFilter("Mangle.j*");
cpReq.addSourceNameFilter("Mangle.jav*");
}
cpReq.enable();
addListener(this);
resumeTo("FilterMangleTarg", "bkpt", "()V");
/*
* resume the target listening for events
*/
listenUntilVMDisconnect();
if (!gotIt) {
if (shouldPass) {
failure("FAIL: Did not get class prepare event for " +
"onion.pickle.Mangle, pattern = " + pattern);
}
} else {
if (!shouldPass) {
failure("FAIL: Got unexpected class prepare event for " +
"onion.pickle.Mangle, pattern = " + pattern);
}
}
/*
* deal with results of test
* if anything has called failure("foo") testFailed will be true
*/
if (!testFailed) {
println("FilterMangleTest: passed: pattern = " + pattern);
} else {
throw new Exception("FilterMangleTest: failed");
}
}
}