Run JDWP tests on Dalvik
Updates the tools/run-jdwp-tests.py script to run JDWP tests on
Dalvik and filters out tests which are expected to fail.
Also updates jdwp test binaries to workaround a few more commands
not supported by Dalvik (like RT.Fields).
Bug: 65869324
Change-Id: I72e45a683ee8cd21d219b61b7c4387039bac679b
diff --git a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
index 8e12fc6..d7c40d4 100644
--- a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
+++ b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
@@ -57,6 +57,10 @@
boolean test(DexVm dexVm, Tool tool);
}
+ static boolean isAndroidLOrAbove(DexVm dexVm, Tool tool) {
+ return dexVm.getVersion().isNewerThan(Version.V4_4_4);
+ }
+
static boolean isAndroidMOrAbove(DexVm dexVm, Tool tool) {
return dexVm.getVersion().isNewerThan(Version.V5_1_1);
}
@@ -69,6 +73,10 @@
return dexVm.getVersion().isNewerThan(Version.V7_0_0);
}
+ static boolean isNotAndroidL(DexVm dexVm, Tool tool) {
+ return dexVm.getVersion() != Version.V5_1_1;
+ }
+
static boolean isLatestRuntime(DexVm dexVm, Tool tool) {
return dexVm == DexVm.ART_DEFAULT;
}
@@ -85,46 +93,123 @@
static final Map<String, TestPredicate> FAILING_TESTS =
ImmutableMap.<String, TestPredicate>builder()
+ .put("ArrayReference.GetValuesTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ArrayReference.LengthTest", RunJdwpTests::isAndroidLOrAbove)
.put("ArrayReference.SetValues003Test", RunJdwpTests::isAndroidNOrAbove)
+ .put("ClassObjectReference.ReflectedTypeTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ClassObjectReference.ReflectedType002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ClassType.InvokeMethodTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ClassType.InvokeMethod002Test", RunJdwpTests::isAndroidLOrAbove)
.put("ClassType.InvokeMethodAfterMultipleThreadSuspensionTest",
RunJdwpTests::isAndroidNOrAbove)
.put("ClassType.InvokeMethodWithSuspensionTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("ClassType.NewInstanceTest", RunJdwpTests::isAndroidLOrAbove)
.put("ClassType.NewInstanceAfterMultipleThreadSuspensionTest",
RunJdwpTests::isAndroidNOrAbove)
.put("ClassType.NewInstanceStringTest", RunJdwpTests::isAndroidOOrAbove)
.put("ClassType.NewInstanceTagTest", RunJdwpTests::isAndroidNOrAbove)
.put("ClassType.NewInstanceWithSuspensionTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("ClassType.SetValues002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ClassType.SuperClassTest", RunJdwpTests::isAndroidLOrAbove)
.put("Events.BreakpointTest", RunJdwpTests::isAndroidMOrAbove)
.put("Events.Breakpoint002Test", RunJdwpTests::isAndroidMOrAbove)
.put("Events.BreakpointOnCatchTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("Events.ClassPrepareTest", RunJdwpTests::isAndroidLOrAbove)
.put("Events.ClassPrepare002Test", RunJdwpTests::isAndroidOOrAbove)
+ .put("Events.CombinedEvents002Test", RunJdwpTests::isAndroidLOrAbove)
.put("Events.CombinedExceptionEventsTest", RunJdwpTests::isAndroidMOrAbove)
.put("Events.ExceptionCaughtTest", RunJdwpTests::isAndroidMOrAbove)
- .put("Events.ExceptionUncaughtTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("Events.ExceptionUncaughtTest", RunJdwpTests::isNotAndroidL)
+ .put("Events.ExceptionWithLocationTest", RunJdwpTests::isAndroidLOrAbove)
.put("Events.EventWithExceptionTest", RunJdwpTests::isAndroidNOrAbove)
.put("Events.FieldAccessTest", RunJdwpTests::isAndroidMOrAbove)
.put("Events.FieldModificationTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("Events.FieldModification002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("Events.FieldWithLocationTest", RunJdwpTests::isAndroidLOrAbove)
.put("Events.MethodEntryTest", RunJdwpTests::isAndroidMOrAbove)
.put("Events.MethodExitTest", RunJdwpTests::isAndroidMOrAbove)
.put("Events.MethodExitWithReturnValueTest", RunJdwpTests::isAndroidMOrAbove)
- .put("Events.SingleStepTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("Events.SingleStepTest", RunJdwpTests::isNotAndroidL)
.put("Events.SingleStepWithPendingExceptionTest", RunJdwpTests::isAndroidNOrAbove)
+ .put("EventModifiers.CountModifierTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("EventModifiers.ThreadOnlyModifierTest", RunJdwpTests::isAndroidLOrAbove)
.put("InterfaceType.InvokeMethodTest", RunJdwpTests::isAndroidNOrAbove)
+ .put("Method.BytecodesTest", RunJdwpTests::isAndroidLOrAbove)
.put("Method.IsObsoleteTest", RunJdwpTests::isAndroidNOrAbove)
.put("Method.VariableTableWithGenericTest", RunJdwpTests::isAndroidOOrAbove)
+ .put("MultiSession.AttachConnectorTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.BreakpointTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.ClassObjectIDTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.ClassPrepareTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.EnableCollectionTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.ExceptionTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.FieldAccessTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.FieldModificationTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.MethodEntryExitTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.RefTypeIDTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.ResumeTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.SingleStepTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("MultiSession.VMDeathTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.DisableCollectionTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.EnableCollectionTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.GetValues002Test", RunJdwpTests::isAndroidLOrAbove)
.put("ObjectReference.InvokeMethodDefaultTest", RunJdwpTests::isAndroidNOrAbove)
.put("ObjectReference.InvokeMethodDefault002Test", RunJdwpTests::isAndroidNOrAbove)
.put("ObjectReference.InvokeMethodAfterMultipleThreadSuspensionTest",
RunJdwpTests::isAndroidNOrAbove)
.put("ObjectReference.InvokeMethodWithSuspensionTest", RunJdwpTests::isAndroidMOrAbove)
- .put("ReferenceType.GetValues006Test", RunJdwpTests::isAndroidOOrAbove)
+ .put("ObjectReference.IsCollectedTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.MonitorInfoTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.SetValuesTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.SetValues002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ObjectReference.SetValues003Test", RunJdwpTests::isAndroidLOrAbove)
.put("ReferenceType.ClassLoaderTest", RunJdwpTests::isAndroidNOrAbove)
+ .put("ReferenceType.FieldsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.GetValues002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.GetValues004Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.GetValues006Test", RunJdwpTests::isAndroidOOrAbove)
+ .put("ReferenceType.MethodsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.ModifiersTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.Signature002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.SourceDebugExtensionTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.SyntheticFieldsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ReferenceType.SyntheticMethodsTest", RunJdwpTests::isAndroidLOrAbove)
.put("StackFrame.GetValuesTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("StackFrame.ProxyThisObjectTest", RunJdwpTests::isAndroidLOrAbove)
.put("StackFrame.SetValuesTest", RunJdwpTests::isAndroidMOrAbove)
.put("StackFrame.SetValues002Test", RunJdwpTests::isAndroidMOrAbove)
+ .put("StackFrame.ThisObjectTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("StringReference.ValueTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadGroupReference.ChildrenTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadGroupReference.NameTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadGroupReference.ParentTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.CurrentContendedMonitorTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.FrameCountTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.FramesTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.InterruptTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.OwnedMonitorsStackDepthInfoTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.OwnedMonitorsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.ResumeTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.Status002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.Status003Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.Status004Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.Status005Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.Status006Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.StatusTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.SuspendCountTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.SuspendTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.ThreadGroup002Test", RunJdwpTests::isAndroidLOrAbove)
+ .put("ThreadReference.ThreadGroupTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("VirtualMachine.AllClassesTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("VirtualMachine.AllThreadsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("VirtualMachine.CapabilitiesTest", RunJdwpTests::isAndroidLOrAbove)
.put("VirtualMachine.CapabilitiesNewTest", RunJdwpTests::isLatestRuntime)
.put("VirtualMachine.ClassPathsTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("VirtualMachine.DisposeTest", RunJdwpTests::isAndroidLOrAbove)
.put("VirtualMachine.DisposeDuringInvokeTest", RunJdwpTests::isAndroidMOrAbove)
+ .put("VirtualMachine.DisposeObjectsTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("VirtualMachine.ExitTest", RunJdwpTests::isAndroidLOrAbove)
+ .put("VirtualMachine.ResumeTest", RunJdwpTests::isAndroidLOrAbove)
.build();
// The smoke tests are the set of tests that fail if there is no debugging info in the dex files.
diff --git a/third_party/jdwp-tests.tar.gz.sha1 b/third_party/jdwp-tests.tar.gz.sha1
index dd998eb..d3eeb60 100644
--- a/third_party/jdwp-tests.tar.gz.sha1
+++ b/third_party/jdwp-tests.tar.gz.sha1
@@ -1 +1 @@
-c1f8da93dfe1b811904ee19a670fb5ed1a35766f
\ No newline at end of file
+db49b6093abaa165e422734a755cdcecf36c03db
\ No newline at end of file
diff --git a/tools/run-jdwp-tests.py b/tools/run-jdwp-tests.py
index ff61dcc..15b69c8 100755
--- a/tools/run-jdwp-tests.py
+++ b/tools/run-jdwp-tests.py
@@ -18,12 +18,7 @@
'7.0.0',
'6.0.1',
'5.1.1',
-]
-
-BOOT_LIBS = [
- 'core-libart-hostdex.jar',
- 'core-oj-hostdex.jar',
- 'apache-xml-hostdex.jar',
+ '4.4.4'
]
JUNIT_HOSTDEX = os.path.join(
@@ -53,7 +48,10 @@
]
def get_art_dir(version):
- art_dir = version == 'default' and 'art' or 'art-%s' % version
+ if version == '4.4.4':
+ art_dir = 'dalvik'
+ else:
+ art_dir = version == 'default' and 'art' or 'art-%s' % version
return os.path.join(utils.REPO_ROOT, 'tools', 'linux', art_dir)
def get_lib_dir(version):
@@ -63,7 +61,7 @@
return os.path.join(get_art_dir(version), 'framework')
def get_vm(version):
- return os.path.join(get_art_dir(version), 'bin', 'dalvikvm64')
+ return os.path.join(get_art_dir(version), 'bin', 'dalvikvm')
def setup_environment(version):
art_dir = get_art_dir(version)
@@ -71,6 +69,11 @@
android_data = os.path.join(utils.REPO_ROOT, 'build', 'tmp', version)
if not os.path.isdir(android_data):
os.mkdir(android_data)
+ if version == '4.4.4':
+ # Dalvik expects that the dalvik-cache dir already exists.
+ dalvik_cache_dir = os.path.join(android_data, 'dalvik-cache')
+ if not os.path.isdir(dalvik_cache_dir):
+ os.mkdir(dalvik_cache_dir)
os.environ['ANDROID_DATA'] = android_data
os.environ['ANDROID_ROOT'] = art_dir
os.environ['LD_LIBRARY_PATH'] = lib_dir
@@ -78,12 +81,25 @@
os.environ['LD_USE_LOAD_BIAS'] = '1'
def get_boot_libs(version):
- return [os.path.join(get_fw_dir(version), lib) for lib in BOOT_LIBS]
+ boot_libs = []
+ if version == '4.4.4':
+ # Dalvik
+ boot_libs.extend(['core-hostdex.jar'])
+ else:
+ # ART
+ boot_libs.extend(['core-libart-hostdex.jar'])
+ if version != '5.1.1' and version != '6.0.1':
+ boot_libs.extend(['core-oj-hostdex.jar'])
+ boot_libs.extend(['apache-xml-hostdex.jar'])
+ return [os.path.join(get_fw_dir(version), lib) for lib in boot_libs]
def get_common_flags(version):
- flags = ['-Ximage:%s' % IMAGE]
- if version != '5.1.1':
- flags.extend(['-Xcompiler-option', '--debuggable'])
+ flags = []
+ flags.extend(['-Xbootclasspath:%s' % ':'.join(get_boot_libs(version))])
+ if version != '4.4.4':
+ flags.extend(['-Ximage:%s' % IMAGE])
+ if version != '5.1.1':
+ flags.extend(['-Xcompiler-option', '--debuggable'])
return flags
def get_debuggee_flags(version):
@@ -97,7 +113,6 @@
lib_dir = get_lib_dir(version)
fw_dir = get_fw_dir(version)
cmd = [get_vm(version)]
- cmd.append('-Xbootclasspath:%s' % ':'.join(get_boot_libs(version)))
cmd.extend(get_debuggee_flags(version))
cmd.extend(args)
setup_environment(version)
@@ -108,10 +123,9 @@
art_dir = get_art_dir(version)
lib_dir = get_lib_dir(version)
fw_dir = get_fw_dir(version)
- dalvikvm = os.path.join(art_dir, 'bin', 'dalvikvm64')
+ dalvikvm = os.path.join(art_dir, 'bin', 'dalvikvm')
cmd = [dalvikvm]
cmd.extend(['-classpath', '%s:%s' % (classpath, JUNIT_HOSTDEX)])
- cmd.append('-Xbootclasspath:%s' % ':'.join(get_boot_libs(version)))
cmd.extend(get_debugger_flags(version))
cmd.append('-Djpda.settings.debuggeeJavaPath=%s %s' %\
(dalvikvm, ' '.join(get_debuggee_flags(version))))