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))))