Support running debug tests with java
This CL allows to run the debug tests with java. It makes it easier
to compare debugging behavior between java and art.
In case of expected behavior difference, the test needs to support
different checks. An example in this CL is the ExceptionTest where
stepping through an exception leads to different locations depending
on the selected runtime.
We keep running these tests with art by default. In the future, we
may want to run these tests in both modes.
Change-Id: I99ccf52a30b8fe4d3e2f47516588239c5ac0c1a3
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index 5f9a95c..8f2e9ce 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -62,8 +62,13 @@
public static final StepFilter INTELLIJ_FILTER = new StepFilter.IntelliJStepFilter();
private static final StepFilter DEFAULT_FILTER = NO_FILTER;
+ enum RuntimeKind {
+ JAVA,
+ ART
+ }
+
// Set to true to run tests with java
- private static final boolean RUN_DEBUGGEE_WITH_JAVA = false;
+ private static final RuntimeKind RUNTIME_KIND = RuntimeKind.ART;
// Set to true to enable verbose logs
private static final boolean DEBUG_TESTS = false;
@@ -77,6 +82,8 @@
DexVm.ART_5_1_1,
DexVm.ART_6_0_1);
+ private static final Path JDWP_JAR = ToolHelper
+ .getJdwpTestsJarPath(ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()));
private static final Path DEBUGGEE_JAR = Paths
.get(ToolHelper.BUILD_DIR, "test", "debug_test_resources.jar");
private static final Path DEBUGGEE_JAVA8_JAR = Paths
@@ -96,12 +103,11 @@
// Convert jar to dex with d8 with debug info
int minSdk = ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm());
{
- Path jdwpJar = ToolHelper.getJdwpTestsJarPath(minSdk);
Path dexOutputDir = temp.newFolder("d8-jdwp-jar").toPath();
jdwpDexD8 = dexOutputDir.resolve("classes.dex");
ToolHelper.runD8(
D8Command.builder()
- .addProgramFiles(jdwpJar)
+ .addProgramFiles(JDWP_JAR)
.setOutputPath(dexOutputDir)
.setMinApiLevel(minSdk)
.setMode(CompilationMode.DEBUG)
@@ -136,7 +142,12 @@
}
protected final boolean supportsDefaultMethod() {
- return ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()) >= Constants.ANDROID_N_API;
+ return RUNTIME_KIND == RuntimeKind.JAVA ||
+ ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()) >= Constants.ANDROID_N_API;
+ }
+
+ protected final boolean isRunningJava() {
+ return RUNTIME_KIND == RuntimeKind.JAVA;
}
protected final void runDebugTest(String debuggeeClass, JUnit3Wrapper.Command... commands)
@@ -146,7 +157,7 @@
protected final void runDebugTest(String debuggeeClass, List<JUnit3Wrapper.Command> commands)
throws Throwable {
- runDebugTest(debuggeeDexD8, debuggeeClass, commands);
+ runDebugTest(false, debuggeeClass, commands);
}
protected final void runDebugTestJava8(String debuggeeClass, JUnit3Wrapper.Command... commands)
@@ -156,10 +167,10 @@
protected final void runDebugTestJava8(String debuggeeClass, List<JUnit3Wrapper.Command> commands)
throws Throwable {
- runDebugTest(debuggeeJava8DexD8, debuggeeClass, commands);
+ runDebugTest(true, debuggeeClass, commands);
}
- private void runDebugTest(Path debuggeeExec, String debuggeeClass,
+ private void runDebugTest(boolean useJava8, String debuggeeClass,
List<JUnit3Wrapper.Command> commands)
throws Throwable {
// Skip test due to unsupported runtime.
@@ -169,8 +180,18 @@
"Skipping failing test " + testName.getMethodName() + " for runtime " + ToolHelper
.getDexVm(), UNSUPPORTED_ART_VERSIONS.contains(ToolHelper.getDexVm()));
- // Run with ART.
- String[] paths = new String[]{jdwpDexD8.toString(), debuggeeExec.toString()};
+ String[] paths;
+ if (RUNTIME_KIND == RuntimeKind.JAVA) {
+ paths = new String[] {
+ JDWP_JAR.toString(),
+ useJava8 ? DEBUGGEE_JAVA8_JAR.toString() : DEBUGGEE_JAR.toString()
+ };
+ } else {
+ paths = new String[] {
+ jdwpDexD8.toString(),
+ useJava8 ? debuggeeJava8DexD8.toString() : debuggeeDexD8.toString()
+ };
+ }
new JUnit3Wrapper(debuggeeClass, paths, commands).runBare();
}
@@ -370,6 +391,35 @@
}
}
+ @Override
+ protected JPDATestOptions createTestOptions() {
+ // Override properties to run debuggee with ART/Dalvik.
+ class ArtTestOptions extends JPDATestOptions {
+
+ ArtTestOptions(String[] debuggeePath) {
+ // Set debuggee command-line.
+ if (RUNTIME_KIND == RuntimeKind.ART) {
+ ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder(ToolHelper.getDexVm());
+ if (ToolHelper.getDexVm().isNewerThan(DexVm.ART_5_1_1)) {
+ artCommandBuilder.appendArtOption("-Xcompiler-option");
+ artCommandBuilder.appendArtOption("--debuggable");
+ artCommandBuilder.appendArtOption("-Xcompiler-option");
+ artCommandBuilder.appendArtOption("--compiler-filter=interpret-only");
+ }
+ setProperty("jpda.settings.debuggeeJavaPath", artCommandBuilder.build());
+ }
+
+ // Set debuggee classpath
+ String debuggeeClassPath = String.join(File.pathSeparator, debuggeePath);
+ setProperty("jpda.settings.debuggeeClasspath", debuggeeClassPath);
+
+ // Set verbosity
+ setProperty("jpda.settings.verbose", Boolean.toString(DEBUG_TESTS));
+ }
+ }
+ return new ArtTestOptions(debuggeePath);
+ }
+
//
// Inspection
//
@@ -725,39 +775,6 @@
testBase.resume();
}
}
-
- @Override
- protected JPDATestOptions createTestOptions() {
- if (RUN_DEBUGGEE_WITH_JAVA) {
- return super.createTestOptions();
- } else {
- // Override properties to run debuggee with ART/Dalvik.
- class ArtTestOptions extends JPDATestOptions {
-
- ArtTestOptions(String[] debuggeePath) {
- // Set debuggee command-line.
- if (!RUN_DEBUGGEE_WITH_JAVA) {
- ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder(ToolHelper.getDexVm());
- if (ToolHelper.getDexVm().isNewerThan(DexVm.ART_5_1_1)) {
- artCommandBuilder.appendArtOption("-Xcompiler-option");
- artCommandBuilder.appendArtOption("--debuggable");
- artCommandBuilder.appendArtOption("-Xcompiler-option");
- artCommandBuilder.appendArtOption("--compiler-filter=interpret-only");
- }
- setProperty("jpda.settings.debuggeeJavaPath", artCommandBuilder.build());
-
- // Set debuggee classpath
- String debuggeeClassPath = String.join(File.pathSeparator, debuggeePath);
- setProperty("jpda.settings.debuggeeClasspath", debuggeeClassPath);
- }
-
- // Set verbosity
- setProperty("jpda.settings.verbose", Boolean.toString(DEBUG_TESTS));
- }
- }
- return new ArtTestOptions(debuggeePath);
- }
- }
}
//
diff --git a/src/test/java/com/android/tools/r8/debug/ExceptionTest.java b/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
index 96f4499..5f15f8f 100644
--- a/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
@@ -12,12 +12,21 @@
@Test
public void testStepOnCatch() throws Throwable {
+ int catchLine;
+ if (isRunningJava()) {
+ // Java jumps to first instruction of the catch handler, matching the source code.
+ catchLine = 11;
+ } else {
+ // ART/Dalvik jumps to 'move-exception' which initializes the local variable with the pending
+ // exception. Thus it is "attached" to the line declaring the exception in the catch handler.
+ catchLine = 10;
+ }
runDebugTest("Exceptions",
breakpoint("Exceptions", "catchException"),
run(),
checkLine(9), // line of the method call throwing the exception
stepOver(),
- checkLine(10), // line of the catch declaration
+ checkLine(catchLine), // line of the catch declaration
run());
}