| /** |
| * @test |
| * @bug 4390869 |
| * @bug 4460328 |
| * @summary Test the new SourceDebugExtension facility |
| * @author Robert Field |
| * |
| * @library .. |
| * |
| * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE |
| * @run compile MangleTest.java |
| * @run compile -g onion/pickle/Mangle.java |
| * @run driver MangleTest |
| */ |
| import com.sun.jdi.*; |
| import com.sun.jdi.event.*; |
| import com.sun.jdi.request.*; |
| |
| import java.util.*; |
| import java.io.File; |
| |
| public class MangleTest extends TestScaffold { |
| static final String op = "onion" + File.separator + "pickle" + File.separator; |
| ReferenceType targetClass; |
| |
| MangleTest (String args[]) { |
| super(args); |
| } |
| |
| public static void main(String[] args) throws Exception { |
| testSetUp(); |
| new MangleTest(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 assist **********/ |
| |
| void checkLocation(Location loc, String label, |
| String expectedSourceName, |
| String expectedSourcePath, |
| int expectedLinenumber) throws Exception { |
| String sourceName = loc.sourceName(); |
| if (sourceName.equals(expectedSourceName)) { |
| println(label + " sourceName: " + sourceName); |
| } else { |
| failure("FAIL: " + label + |
| " expected sourceName " + expectedSourceName + |
| " got - " + sourceName); |
| } |
| |
| String sourcePath = loc.sourcePath(); |
| if (sourcePath.equals(expectedSourcePath)) { |
| println(label + " sourcePath: " + sourcePath); |
| } else { |
| failure("FAIL: " + label + |
| " expected sourcePath " + expectedSourcePath + |
| " got - " + sourcePath); |
| } |
| |
| int ln = loc.lineNumber(); |
| if (ln == expectedLinenumber) { |
| println(label + " line number: " + ln); |
| } else { |
| failure("FAIL: " + label + |
| " expected line number " + expectedLinenumber + |
| " got - " + ln); |
| } |
| } |
| |
| void checkLocation(String stratum, Location loc, String label, |
| String expectedSourceName, |
| String expectedSourcePath, |
| int expectedLinenumber) throws Exception { |
| String sourceName = loc.sourceName(stratum); |
| if (sourceName.equals(expectedSourceName)) { |
| println(label + "(" + stratum + ")" + |
| " sourceName: " + sourceName); |
| } else { |
| failure("FAIL: " + label + "(" + stratum + ")" + |
| " expected sourceName " + expectedSourceName + |
| " got " + sourceName); |
| } |
| |
| String sourcePath = loc.sourcePath(stratum); |
| if (sourcePath.equals(expectedSourcePath)) { |
| println(label + "(" + stratum + ")" + |
| " sourcePath: " + sourcePath); |
| } else { |
| failure("FAIL: " + label + "(" + stratum + ")" + |
| " expected sourcePath " + expectedSourcePath + |
| " got " + sourcePath); |
| } |
| |
| int ln = loc.lineNumber(stratum); |
| if (ln == expectedLinenumber) { |
| println(label + "(" + stratum + ")" + |
| " line number: " + ln); |
| } else { |
| failure("FAIL: " + label + "(" + stratum + ")" + |
| " expected line number " + expectedLinenumber + |
| " got " + ln); |
| } |
| } |
| |
| Location getLoc(int index, List locList) { |
| return ((Location)(locList.get(index))); |
| } |
| |
| void lineMatch(int index, String stratum, Location loc, int line) { |
| int gotLine = loc.lineNumber(stratum); |
| if (gotLine != line) { |
| failure("FAIL: index=" + index + |
| " " + stratum + " line=" + gotLine + |
| " expected: " + line); |
| } |
| } |
| |
| void lineMatch(int index, Location loc, |
| int javaLine, int xyzLine, int ratsLine) { |
| lineMatch(index, "Java", loc, javaLine); |
| lineMatch(index, "XYZ", loc, xyzLine); |
| lineMatch(index, "Rats", loc, ratsLine); |
| } |
| |
| List listWith(String s1) { |
| List result = new ArrayList(); |
| result.add(s1); |
| return result; |
| } |
| |
| List listWith(String s1, String s2) { |
| List result = new ArrayList(); |
| result.add(s1); |
| result.add(s2); |
| return result; |
| } |
| |
| |
| /********** test core **********/ |
| |
| protected void runTests() throws Exception { |
| /* |
| * Get to the top of main() |
| * to determine targetClass |
| */ |
| BreakpointEvent bpe = startToMain("onion.pickle.Mangle"); |
| targetClass = bpe.location().declaringType(); |
| |
| // ref type source name |
| String sourceName = targetClass.sourceName(); |
| if (sourceName.equals("Mangle.xyz")) { |
| println("ref type sourceName: " + sourceName); |
| } else { |
| failure("FAIL: unexpected ref type sourceName - " + sourceName); |
| } |
| |
| // ref type source names /paths |
| List sourceNames; |
| sourceNames = targetClass.sourceNames("Java"); |
| if (sourceNames.equals(listWith("Mangle.java"))) { |
| println("ref type Java sourceNames: " + sourceNames); |
| } else { |
| failure("FAIL: unexpected ref type Java sourceNames - " + |
| sourceNames); |
| } |
| sourceNames = targetClass.sourceNames("XYZ"); |
| if (sourceNames.equals(listWith("Mangle.xyz", "Incl.xyz"))) { |
| println("ref type XYZ sourceNames: " + sourceNames); |
| } else { |
| failure("FAIL: unexpected ref type XYZ sourceNames - " + |
| sourceNames); |
| } |
| sourceNames = targetClass.sourceNames(null); |
| if (sourceNames.equals(listWith("Mangle.xyz", "Incl.xyz"))) { |
| println("ref type null sourceNames: " + sourceNames); |
| } else { |
| failure("FAIL: unexpected ref type null sourceNames - " + |
| sourceNames); |
| } |
| sourceNames = targetClass.sourceNames("Rats"); |
| if (sourceNames.equals(listWith("Mangle.rats", "Incl.rats"))) { |
| println("ref type Rats sourceNames: " + sourceNames); |
| } else { |
| failure("FAIL: unexpected ref type Rats sourceNames - " + |
| sourceNames); |
| } |
| List sourcePaths; |
| sourcePaths = targetClass.sourcePaths("Java"); |
| if (sourcePaths.equals(listWith(op + "Mangle.java"))) { |
| println("ref type Java sourcePaths: " + sourcePaths); |
| } else { |
| failure("FAIL: unexpected ref type Java sourcePaths - " + |
| sourcePaths); |
| } |
| sourcePaths = targetClass.sourcePaths("XYZ"); |
| if (sourcePaths.equals(listWith("database14", op + "Incl.xyz"))) { |
| println("ref type XYZ sourcePaths: " + sourcePaths); |
| } else { |
| failure("FAIL: unexpected ref type XYZ sourcePaths - " + |
| sourcePaths); |
| } |
| sourcePaths = targetClass.sourcePaths(null); |
| if (sourcePaths.equals(listWith("database14", op + "Incl.xyz"))) { |
| println("ref type null sourcePaths: " + sourcePaths); |
| } else { |
| failure("FAIL: unexpected ref type null sourcePaths - " + |
| sourcePaths); |
| } |
| sourcePaths = targetClass.sourcePaths("Rats"); |
| if (sourcePaths.equals(listWith(op + "Mangle.rats", |
| "bleep:bleep:Incl.rats"))) { |
| println("ref type Rats sourcePaths: " + sourcePaths); |
| } else { |
| failure("FAIL: unexpected ref type Rats sourcePaths - " + |
| sourcePaths); |
| } |
| |
| Method main = findMethod(targetClass, "main", |
| "([Ljava/lang/String;)V"); |
| List allLines = main.allLineLocations(); |
| List javaLines = main.allLineLocations("Java", null); |
| List bogusLines = main.allLineLocations("bogus", null); |
| List nullLines = main.allLineLocations(null, null); |
| List xyzLines = main.allLineLocations("XYZ", null); |
| List ratsLines = main.allLineLocations("Rats", null); |
| |
| List tl = new ArrayList(allLines); |
| tl.removeAll(xyzLines); |
| if (tl.isEmpty() && allLines.size() == xyzLines.size()) { |
| println("allLineLocations() is OK"); |
| } else { |
| failure("FAIL: allLineLocations() wrong - " + allLines); |
| } |
| |
| tl = new ArrayList(bogusLines); |
| tl.removeAll(xyzLines); |
| if (tl.isEmpty() && bogusLines.size() == xyzLines.size()) { |
| println("allLineLocations(\"bogus\") is OK"); |
| } else { |
| failure("FAIL: allLineLocations(\"bogus\") wrong - " + bogusLines); |
| } |
| |
| tl = new ArrayList(nullLines); |
| tl.removeAll(xyzLines); |
| if (tl.isEmpty() && nullLines.size() == xyzLines.size()) { |
| println("allLineLocations(null) is OK"); |
| } else { |
| failure("FAIL: allLineLocations(null) wrong - " + nullLines); |
| } |
| |
| if (!javaLines.get(0).equals(ratsLines.get(0))) { |
| failure("FAIL: locations should match - " + javaLines.get(0)); |
| } |
| if (javaLines.get(0).equals(xyzLines.get(0))) { |
| failure("FAIL: locations should not match - " + |
| javaLines.get(0)); |
| } |
| if (!javaLines.get(1).equals(ratsLines.get(1))) { |
| failure("FAIL: locations should match - " + javaLines.get(1)); |
| } |
| if (!javaLines.get(1).equals(xyzLines.get(0))) { |
| failure("FAIL: locations should match - " + javaLines.get(1)); |
| } |
| if (javaLines.get(2).equals(ratsLines.get(1))) { |
| failure("FAIL: locations should not match - " + |
| javaLines.get(1)); |
| } |
| if (xyzLines.contains(javaLines.get(0))) { |
| failure("FAIL: xyz locations should not match - " + |
| javaLines.get(0)); |
| } |
| if (xyzLines.contains(javaLines.get(2))) { |
| failure("FAIL: xyz locations should not match - " + |
| javaLines.get(2)); |
| } |
| if (xyzLines.contains(javaLines.get(6))) { |
| failure("FAIL: xyz locations should not match - " + |
| javaLines.get(6)); |
| } |
| |
| if (ratsLines.contains(javaLines.get(2))) { |
| failure("FAIL: rats locations should not match - " + |
| javaLines.get(2)); |
| } |
| if (ratsLines.contains(javaLines.get(4))) { |
| failure("FAIL: rats locations should not match - " + |
| javaLines.get(4)); |
| } |
| if (ratsLines.contains(javaLines.get(5))) { |
| failure("FAIL: rats locations should not match - " + |
| javaLines.get(5)); |
| } |
| |
| println("*** Java"); |
| for (Iterator it = javaLines.iterator(); it.hasNext(); ) { |
| Location loc = (Location)it.next(); |
| print("" + loc.lineNumber("Java") + " - "); |
| print(loc.sourceName("XYZ") + " : "); |
| print("" + loc.lineNumber("XYZ") + " ... "); |
| print(loc.sourceName("Rats") + " : "); |
| println("" + loc.lineNumber("Rats")); |
| } |
| |
| println("*** XYZ"); |
| for (Iterator it = xyzLines.iterator(); it.hasNext(); ) { |
| Location loc = (Location)it.next(); |
| print("" + loc.lineNumber("Java") + " - "); |
| print(loc.sourceName("XYZ") + " : "); |
| print("" + loc.lineNumber("XYZ") + " ... "); |
| print(loc.sourceName("Rats") + " : "); |
| println("" + loc.lineNumber("Rats")); |
| } |
| |
| println("*** Rats"); |
| for (Iterator it = ratsLines.iterator(); it.hasNext(); ) { |
| Location loc = (Location)it.next(); |
| print("" + loc.lineNumber("Java") + " - "); |
| print(loc.sourceName("XYZ") + " : "); |
| print("" + loc.lineNumber("XYZ") + " ... "); |
| print(loc.sourceName("Rats") + " : "); |
| println("" + loc.lineNumber("Rats")); |
| } |
| |
| checkLocation(getLoc(0, javaLines), "0", |
| "Incl.xyz", |
| op + "Incl.xyz", 200); |
| checkLocation(null, getLoc(0, javaLines), "0", |
| "Incl.xyz", |
| op + "Incl.xyz", 200); |
| checkLocation("bogus", getLoc(0, javaLines), "0", |
| "Incl.xyz", |
| op + "Incl.xyz", 200); |
| checkLocation("Java", getLoc(0, javaLines), "0", |
| "Mangle.java", |
| op + "Mangle.java", 4); |
| checkLocation("XYZ", getLoc(0, javaLines), "0", |
| "Incl.xyz", |
| op + "Incl.xyz", 200); |
| checkLocation("Rats", getLoc(0, javaLines), "0", |
| "Mangle.rats", |
| op + "Mangle.rats", 1000); |
| |
| checkLocation(getLoc(3, javaLines), "3", |
| "Mangle.xyz", |
| "database14", 210); |
| checkLocation(null, getLoc(3, javaLines), "3", |
| "Mangle.xyz", |
| "database14", 210); |
| checkLocation("bogus", getLoc(3, javaLines), "3", |
| "Mangle.xyz", |
| "database14", 210); |
| checkLocation("Java", getLoc(3, javaLines), "3", |
| "Mangle.java", |
| op + "Mangle.java", 7); |
| checkLocation("XYZ", getLoc(3, javaLines), "3", |
| "Mangle.xyz", |
| "database14", 210); |
| checkLocation("Rats", getLoc(3, javaLines), "3", |
| "Incl.rats", |
| "bleep:bleep:Incl.rats", 1112); |
| |
| checkLocation(getLoc(6, javaLines), "6", |
| "Mangle.xyz", |
| "database14", 218); |
| checkLocation(null, getLoc(6, javaLines), "6", |
| "Mangle.xyz", |
| "database14", 218); |
| checkLocation("bogus", getLoc(6, javaLines), "6", |
| "Mangle.xyz", |
| "database14", 218); |
| checkLocation("Java", getLoc(6, javaLines), "6", |
| "Mangle.java", |
| op + "Mangle.java", 10); |
| checkLocation("XYZ", getLoc(6, javaLines), "6", |
| "Mangle.xyz", |
| "database14", 218); |
| checkLocation("Rats", getLoc(6, javaLines), "6", |
| "Incl.rats", |
| "bleep:bleep:Incl.rats", 1112); |
| |
| lineMatch(0, getLoc(0, javaLines), 4, 200, 1000); |
| lineMatch(1, getLoc(1, javaLines), 5, 200, 1111); |
| lineMatch(2, getLoc(2, javaLines), 6, 200, 1111); |
| lineMatch(3, getLoc(3, javaLines), 7, 210, 1112); |
| lineMatch(4, getLoc(4, javaLines), 8, 217, 1112); |
| lineMatch(5, getLoc(5, javaLines), 9, 218, 1112); |
| lineMatch(6, getLoc(6, javaLines), 10, 218, 1112); |
| |
| /* |
| * resume the target listening for events |
| */ |
| listenUntilVMDisconnect(); |
| |
| /* |
| * deal with results of test |
| * if anything has called failure("foo") testFailed will be true |
| */ |
| if (!testFailed) { |
| println("MangleTest: passed"); |
| } else { |
| throw new Exception("MangleTest: failed"); |
| } |
| } |
| } |