Change CtsJdwpTestCases to run with new agent JDWP implementation.

This CTS test was still testing the old JDWP implementation. We should
be testing the new one. This test will look at the
dalvik.vm.jdwp-provider property and run the jdwp tests using
whichever jdwp implementation is being used. If the property is unset,
'default' or 'adbconnection' it will use the JVMTI agent jdwp
implementation. If it is 'internal' it will use the old internal ART
jdwp implementation.

Bug: 74028528
Bug: 62821960

Test: cts-tradefed run cts -m CtsJdwpTestCases
Test: adb setprop dalvik.vm.jdwp-provider internal &&
      cts-tradefed run cts -m CtsJdwpTestCases
Change-Id: I21aa701f30ff914be0350ff6db1692a849c88569
diff --git a/tests/jdwp/AndroidTest.xml b/tests/jdwp/AndroidTest.xml
index 72d26b1..19d1e76 100644
--- a/tests/jdwp/AndroidTest.xml
+++ b/tests/jdwp/AndroidTest.xml
@@ -35,8 +35,12 @@
         <option name="dalvik-arg" value="-Djpda.settings.verbose=false" />
         <option name="dalvik-arg" value="-Djpda.settings.timeout=10000" />
         <option name="dalvik-arg" value="-Djpda.settings.waitingTime=10000" />
-        <option name="dalvik-arg" value="-Djpda.settings.debuggeeJavaPath='dalvikvm|#ABI#| -XXlib:libart.so -Xcompiler-option --debuggable -Xusejit:true'" />
+        <option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeAgentArgument=-agentpath:" />
+        <option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeAgentName=libjdwp.so" />
+        <option name="dalvik-arg-adbconnection" value="-Djpda.settings.debuggeeJavaPath='dalvikvm|#ABI#| -XXlib:libart.so -Xplugin:libopenjdkjvmti.so -Xcompiler-option --debuggable -Xusejit:true'" />
+        <option name="dalvik-arg-internal" value="-Djpda.settings.debuggeeJavaPath='dalvikvm|#ABI#| -XjdwpProvider:internal -XXlib:libart.so -Xcompiler-option --debuggable -Xusejit:true'" />
         <option name="known-failures" value="/expectations/jdwp-known-failures.txt" />
+        <option name="known-failures-adbconnection" value="/expectations/external_oj_libjdwp_art_failures.txt" />
         <option name="runtime-hint" value="16m" />
 
         <!-- Temporary work around to avoid running android.test.AndroidTestCase. -->
diff --git a/tests/jdwp/runner/host-side/resources/expectations/external_oj_libjdwp_art_failures.txt b/tests/jdwp/runner/host-side/resources/expectations/external_oj_libjdwp_art_failures.txt
new file mode 100644
index 0000000..61cf050
--- /dev/null
+++ b/tests/jdwp/runner/host-side/resources/expectations/external_oj_libjdwp_art_failures.txt
@@ -0,0 +1,52 @@
+/*
+ * This file contains expectations for JDWP tests run on CTS using libjdwp.
+ *
+ * This file should be kept in sync with the file of the same name in art/tools/.
+ */
+[
+{
+  description: "Test fails due to unexpectedly getting the thread-groups of zombie threads",
+  result: EXEC_FAILED,
+  bug: 66906414,
+  name: "org.apache.harmony.jpda.tests.jdwp.ThreadReference.ThreadGroup002Test#testThreadGroup002"
+},
+{
+  description: "This test is incorrect since it blindly requests local variables without checking their slot numbers.",
+  result: EXEC_FAILED,
+  bug: 74028528,
+  name: "org.apache.harmony.jpda.tests.jdwp.Events.Breakpoint003Test#testBreakPointInFrameworkCode"
+},
+{
+  description: "Test fails due to static values not being set correctly.",
+  result: EXEC_FAILED,
+  bug: 66905894,
+  name: "org.apache.harmony.jpda.tests.jdwp.ReferenceType.GetValues006Test#testGetValues006"
+},
+{
+  description: "Tests that fail on both ART and RI. These tests are likely incorrect",
+  result: EXEC_FAILED,
+  bug: 66906734,
+  names: [ "org.apache.harmony.jpda.tests.jdwp.ArrayReference.SetValues003Test#testSetValues003_InvalidIndex",
+           "org.apache.harmony.jpda.tests.jdwp.ClassType.InvokeMethod002Test#testInvokeMethod_wrong_argument_types",
+           "org.apache.harmony.jpda.tests.jdwp.ClassType.InvokeMethodTest#testInvokeMethod002",
+           "org.apache.harmony.jpda.tests.jdwp.ClassType.InvokeMethodTest#testInvokeMethod003",
+           "org.apache.harmony.jpda.tests.jdwp.ClassType.NewInstanceTest#testNewInstance002",
+           "org.apache.harmony.jpda.tests.jdwp.ClassType.SetValues002Test#testSetValues002",
+           "org.apache.harmony.jpda.tests.jdwp.Events.ClassPrepare002Test#testClassPrepareCausedByDebugger",
+           "org.apache.harmony.jpda.tests.jdwp.Events.ExceptionCaughtTest#testExceptionEvent_ThrowLocation_FromNative",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.DisableCollectionTest#testDisableCollection_null",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.EnableCollectionTest#testEnableCollection_invalid",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.EnableCollectionTest#testEnableCollection_null",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.GetValues002Test#testGetValues002",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.SetValues003Test#testSetValues003",
+           "org.apache.harmony.jpda.tests.jdwp.ObjectReference.SetValuesTest#testSetValues001",
+           "org.apache.harmony.jpda.tests.jdwp.ReferenceType.FieldsWithGenericTest#testFieldsWithGeneric001",
+           "org.apache.harmony.jpda.tests.jdwp.ReferenceType.GetValues002Test#testGetValues002",
+           "org.apache.harmony.jpda.tests.jdwp.ReferenceType.GetValues004Test#testGetValues004",
+           "org.apache.harmony.jpda.tests.jdwp.StringReference.ValueTest#testStringReferenceValueTest001_NullString",
+           "org.apache.harmony.jpda.tests.jdwp.ThreadGroupReference.ChildrenTest#testChildren_NullObject",
+           "org.apache.harmony.jpda.tests.jdwp.ThreadGroupReference.NameTest#testName001_NullObject",
+           "org.apache.harmony.jpda.tests.jdwp.ThreadGroupReference.ParentTest#testParent_NullObject",
+           "org.apache.harmony.jpda.tests.jdwp.VirtualMachine.CapabilitiesNewTest#testCapabilitiesNew001" ]
+}
+]
diff --git a/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java b/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
index 6abc6d7..51ded92 100644
--- a/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
+++ b/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
@@ -114,6 +114,9 @@
     private static String END_TEST = "end-test";
     private static String FAILURE = "failure";
 
+    // If we are running with adbconnection jdwp provider (hence a libjdwp agent).
+    private boolean mIsAdbConnection = true;
+
     @Option(name = "run-name", description = "The name to use when reporting results")
     private String mRunName;
 
@@ -123,6 +126,16 @@
     @Option(name = "dalvik-arg", description = "Holds arguments to pass to Dalvik")
     private List<String> mDalvikArgs = new ArrayList<>();
 
+    @Option(name = "dalvik-arg-adbconnection",
+            description = "Holds arguments to pass to Dalvik when " +
+                          "dalvik.vm.jdwp-provider == adbconnection or default or is empty")
+    private List<String> mDalvikArgsAdbconnection = new ArrayList<>();
+
+    @Option(name = "dalvik-arg-internal",
+            description = "Holds arguments to pass to Dalvik only when " +
+                          "dalvik.vm.jdwp-provider == internal")
+    private List<String> mDalvikArgsInternal = new ArrayList<>();
+
     @Option(name = "runner-arg",
             description = "Holds arguments to pass to the device-side test runner")
     private List<String> mRunnerArgs = new ArrayList<>();
@@ -150,6 +163,13 @@
             description="The hint about the test's runtime.")
     private long mRuntimeHint = 60000;// 1 minute
 
+    @Option(name = "known-failures-adbconnection",
+            description = "Comma-separated list of files specifying known-failures to be skipped")
+    private String mKnownFailuresAdbconnection;
+    @Option(name = "known-failures-internal",
+            description = "Comma-separated list of files specifying known-failures to be skipped")
+    private String mKnownFailuresInternal;
+
     @Option(name = "known-failures",
             description = "Comma-separated list of files specifying known-failures to be skipped")
     private String mKnownFailures;
@@ -274,6 +294,17 @@
         mCollectTestsOnly = shouldCollectTest;
     }
 
+    private static boolean isAdbconnection(ITestDevice device) throws DeviceNotAvailableException {
+        String provider = device.getProperty("dalvik.vm.jdwp-provider");
+        if (provider == null || provider.equals("default") || provider.equals("adbconnection")) {
+            return true;
+        } else if (provider.equals("internal")) {
+            return false;
+        } else {
+            throw new RuntimeException("Unknown dalvik.vm.jdwp-provider = " + provider);
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -281,6 +312,7 @@
     public void run(final ITestInvocationListener listener) throws DeviceNotAvailableException {
         String abiName = mAbi.getName();
         String bitness = AbiUtils.getBitness(abiName);
+        mIsAdbConnection = isAdbconnection(getDevice());
 
         File tmpExcludeFile = null;
         try {
@@ -306,6 +338,13 @@
             }
         }
 
+        if (mIsAdbConnection) {
+            Log.logAndDisplay(LogLevel.INFO, TAG, "Running with ADBConnection/libjdwp agent");
+            mDalvikArgs.addAll(mDalvikArgsAdbconnection);
+        } else {
+            Log.logAndDisplay(LogLevel.INFO, TAG, "Running with internal jdwp implementation");
+            mDalvikArgs.addAll(mDalvikArgsInternal);
+        }
 
         // Create command
         mDalvikArgs.add("-Duser.name=shell");
@@ -409,10 +448,18 @@
                     ExpectationStore.parse(expectationFiles, ModeId.DEVICE);
             // create expectation store from expectation files found in module resources dir
             ExpectationStore resourceStore = null;
+            Set<String> knownFailuresFiles = new HashSet<String>();
+            Splitter splitter = Splitter.on(',').trimResults();
             if (mKnownFailures != null) {
-                Splitter splitter = Splitter.on(',').trimResults();
-                Set<String> knownFailuresFiles =
-                        new HashSet<>(splitter.splitToList(mKnownFailures));
+                knownFailuresFiles.addAll(splitter.splitToList(mKnownFailures));
+            }
+            if (mIsAdbConnection && mKnownFailuresAdbconnection != null) {
+                knownFailuresFiles.addAll(splitter.splitToList(mKnownFailuresAdbconnection));
+            }
+            if (!mIsAdbConnection && mKnownFailuresInternal != null) {
+                knownFailuresFiles.addAll(splitter.splitToList(mKnownFailuresInternal));
+            }
+            if (knownFailuresFiles.size() != 0) {
                 resourceStore = ExpectationStore.parseResources(
                         getClass(), knownFailuresFiles, ModeId.DEVICE);
             }