release-request-051da47e-713f-4e09-8f6c-698fb4d4e92e-for-git_oc-dr1-release-3997165 snap-temp-L04400000062809322

Change-Id: Id0d752ca9a68f3a2b166b4823f63ccfa09d4feec
diff --git a/jdwp/Android.mk b/jdwp/Android.mk
index 4fe4066..a2adcd9 100644
--- a/jdwp/Android.mk
+++ b/jdwp/Android.mk
@@ -35,6 +35,7 @@
 LOCAL_NO_EMMA_COMPILE := true
 LOCAL_CTS_TEST_PACKAGE := android.jdwp
 LOCAL_CTS_TARGET_RUNTIME_ARGS := $(cts_jdwp_test_target_runtime_args)
+LOCAL_ERROR_PRONE_FLAGS := -Xep:ArrayToString:ERROR
 include $(BUILD_CTS_TARGET_JAVA_LIBRARY)
 
 include $(CLEAR_VARS)
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ArrayType/NewInstanceDebuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ArrayType/NewInstanceDebuggee.java
index 9c5d2d5..7659c7b 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ArrayType/NewInstanceDebuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ArrayType/NewInstanceDebuggee.java
@@ -28,6 +28,8 @@
 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
 import org.apache.harmony.jpda.tests.share.SyncDebuggee;
 
+import java.util.Arrays;
+
 /**
  * Debuggee for JDWP NewInstanceTest unit test which 
  * exercises ArrayType.NewInstance command.
@@ -44,7 +46,7 @@
         logWriter.println("-> array of classes "+ clazz[0].name + " is created");
         synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY);
         logWriter.println("-> Hello World");
-        logWriter.println("DUMP{" + checkString + checkInt + ia + ca + "}");
+        logWriter.println("DUMP{" + Arrays.toString(checkString) + Arrays.toString(checkInt) + Arrays.toString(ia) + Arrays.toString(ca) + "}");
         synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
     }
 
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/GetValues003Debuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/GetValues003Debuggee.java
index 7adaed6..858f2a5 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/GetValues003Debuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/GetValues003Debuggee.java
@@ -28,6 +28,8 @@
 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
 import org.apache.harmony.jpda.tests.share.SyncDebuggee;
 
+import java.util.Arrays;
+
 public class GetValues003Debuggee extends SyncDebuggee {
     
     static GetValues003Debuggee testedObject;
@@ -69,8 +71,8 @@
         testedObject.classLoaderField = null;
 
         logWriter.println("\n--> Debuggee: GetValues003Debuggee: Before ObjectReference::GetValues command:");
-        logWriter.println("--> intArrayField value = " + testedObject.intArrayField);
-        logWriter.println("--> objectArrayField value = " + testedObject.objectArrayField);
+        logWriter.println("--> intArrayField value = " + Arrays.toString(testedObject.intArrayField));
+        logWriter.println("--> objectArrayField value = " + Arrays.toString(testedObject.objectArrayField));
         logWriter.println("--> objectField value = " + testedObject.objectField);
         logWriter.println("--> stringField value = " + testedObject.stringField);
         logWriter.println("--> threadField value = " + testedObject.threadField);
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/SetValues004Debuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/SetValues004Debuggee.java
index c2b50d2..0e6f9e1 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/SetValues004Debuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/SetValues004Debuggee.java
@@ -28,6 +28,8 @@
 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
 import org.apache.harmony.jpda.tests.share.SyncDebuggee;
 
+import java.util.Arrays;
+
 public class SetValues004Debuggee extends SyncDebuggee {
     
     static String passedStatus = "PASSED";
@@ -63,8 +65,8 @@
         testedObject.classLoaderField = testedObject.classField.getClassLoader();
 
         logWriter.println("\n--> Debuggee: SetValues004Debuggee: Before ObjectReference::SetValues command:");
-        logWriter.println("--> intArrayField value = " + testedObject.intArrayField);
-        logWriter.println("--> objectArrayField value = " + testedObject.objectArrayField);
+        logWriter.println("--> intArrayField value = " + Arrays.toString(testedObject.intArrayField));
+        logWriter.println("--> objectArrayField value = " + Arrays.toString(testedObject.objectArrayField));
         logWriter.println("--> objectField value = " + testedObject.objectField);
         logWriter.println("--> stringField value = " + testedObject.stringField);
         logWriter.println("--> threadField value = " + testedObject.threadField);
@@ -76,7 +78,7 @@
         synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
 
         logWriter.println("\n--> Debuggee: SetValues004Debuggee: After ObjectReference::SetValues command:");
-        logWriter.println("--> intArrayField value = " + testedObject.intArrayField);
+        logWriter.println("--> intArrayField value = " + Arrays.toString(testedObject.intArrayField));
         if ( testedObject.intArrayField != null ) {
             logWriter.println("##> Debuggee: FAILURE: Unexpected value");
             logWriter.println("##> Expected value = " + null);
@@ -85,7 +87,7 @@
             logWriter.println("--> Debuggee: OK. Expected value");
         }
 
-        logWriter.println("--> objectArrayField value = " + testedObject.objectArrayField);
+        logWriter.println("--> objectArrayField value = " + Arrays.toString(testedObject.objectArrayField));
         if ( testedObject.objectArrayField != null ) {
             logWriter.println("##> Debuggee: FAILURE: Unexpected value");
             logWriter.println("##> Expected value = " + null);
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/GetValues005Debuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/GetValues005Debuggee.java
index dad70a6..1b88509 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/GetValues005Debuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/GetValues005Debuggee.java
@@ -28,6 +28,8 @@
 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
 import org.apache.harmony.jpda.tests.share.SyncDebuggee;
 
+import java.util.Arrays;
+
 public class GetValues005Debuggee extends SyncDebuggee {
     
     static int intArrayField[]; // JDWP_TAG_ARRAY = 91
@@ -66,8 +68,8 @@
         classLoaderField = null;
 
         logWriter.println("\n--> Debuggee: GetValues005Debuggee: Before ReferenceType::GetValues command:");
-        logWriter.println("--> intArrayField value = " + intArrayField);
-        logWriter.println("--> objectArrayField value = " + objectArrayField);
+        logWriter.println("--> intArrayField value = " + Arrays.toString(intArrayField));
+        logWriter.println("--> objectArrayField value = " + Arrays.toString(objectArrayField));
         logWriter.println("--> objectField value = " + objectField);
         logWriter.println("--> stringField value = " + stringField);
         logWriter.println("--> threadField value = " + threadField);
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionDebuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionDebuggee.java
index 5a04599..ea90778 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionDebuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionDebuggee.java
@@ -26,6 +26,7 @@
 package org.apache.harmony.jpda.tests.jdwp.ReferenceType;
 
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Proxy;
 import java.net.URLClassLoader;
 import java.net.URL;
 import java.nio.ByteBuffer;
@@ -173,11 +174,17 @@
             }
         }
 
+        // Instantiate a proxy whose name should contain "$Proxy".
+        Class proxy = Proxy.getProxyClass(SomeInterface.class.getClassLoader(),
+                                          new Class[] { SomeInterface.class });
+
         synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY);
         logWriter.println("--> Debuggee: SourceDebugExtensionDebuggee...");
         synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
     }
 
+    interface SomeInterface {}
+
     public static void main(String [] args) {
         runDebuggee(SourceDebugExtensionDebuggee.class);
     }
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionTest.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionTest.java
index 93dbfa9..7f40430 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionTest.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionTest.java
@@ -43,8 +43,6 @@
     static final String thisCommandName = "ReferenceType.SourceDebugExtension command";
     static final String debuggeeSignature =
             "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/SourceDebugExtensionDebuggee;";
-    static final String classWithSourceDebugExtension =
-            "Lorg/apache/harmony/jpda/tests/jdwp/Events/SourceDebugExtensionMockClass;";
     static final String expectedSourceDebugExtension = "SMAP\nhelloworld_jsp.java\nJSP\n*S JSP\n" +
             "*F\n+ 0 helloworld.jsp\nhelloworld.jsp\n*L\n1,5:53\n6:58,3\n7,4:61\n*E\n";
 
@@ -53,6 +51,58 @@
         return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.SourceDebugExtensionDebuggee";
     }
 
+
+    private void doTest(String testName, String classSignature, int expectedErrorCode) {
+        //check capability, relevant for this test
+        logWriter.println("=> Check capability: canGetSourceDebugExtension");
+        if (!debuggeeWrapper.vmMirror.canGetSourceDebugExtension()) {
+            logWriter.println("##WARNING: this VM doesn't possess capability: canGetSourceDebugExtension");
+            return;
+        }
+
+        logWriter.println("==> " + testName + " for " + thisCommandName + ": START...");
+        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+        long refTypeID = getClassIDBySignature(classSignature);
+        logWriter.println("=> Class with SourceDebugExtension = " + classSignature);
+        logWriter.println("=> referenceTypeID for class with SourceDebugExtension = " + refTypeID);
+        logWriter.println("=> CHECK: send " + thisCommandName + " and check reply...");
+
+        CommandPacket checkedCommand = new CommandPacket(
+                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
+                JDWPCommands.ReferenceTypeCommandSet.SourceDebugExtensionCommand);
+        checkedCommand.setNextValueAsReferenceTypeID(refTypeID);
+
+        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
+        checkedCommand = null;
+
+        short errorCode = checkedReply.getErrorCode();
+        assertEquals(expectedErrorCode, errorCode);
+
+        switch ( errorCode ) {
+            case JDWPConstants.Error.NONE:
+                logWriter.println("=> No any ERROR is returned");
+                String sourceDebugExtension = checkedReply.getNextValueAsString();
+                logWriter.println("=> Returned SourceDebugExtension = " + sourceDebugExtension);
+                assertEquals(expectedSourceDebugExtension, sourceDebugExtension);
+                break;
+            case JDWPConstants.Error.ABSENT_INFORMATION:
+                logWriter.println("=> ABSENT_INFORMATION is returned");
+                break;
+            default:
+                logWriter.println("\n## FAILURE: " + thisCommandName + " returns unexpected ERROR = "
+                    + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")");
+                fail(thisCommandName + " returns unexpected ERROR = "
+                    + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")");
+        }
+
+        assertAllDataRead(checkedReply);
+
+        logWriter.println("=> CHECK PASSED: Received expected result");
+
+        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
+        logWriter.println("==> " + testName + " for " + thisCommandName + ": FINISH");
+    }
+
     /**
      * This testcase exercises ReferenceType.SourceDebugExtension command.
      *
@@ -65,51 +115,77 @@
      * the JSR45 metadata matches the expected value.
      */
     public void testSourceDebugExtension001() {
-        String thisTestName = "testSourceDebugExtension001";
+        doTest("testSourceDebugExtension001",
+               "Lorg/apache/harmony/jpda/tests/jdwp/Events/SourceDebugExtensionMockClass;",
+               JDWPConstants.Error.NONE);
+    }
 
-        //check capability, relevant for this test
-        logWriter.println("=> Check capability: canGetSourceDebugExtension");
-        if (!debuggeeWrapper.vmMirror.canGetSourceDebugExtension()) {
-            logWriter.println("##WARNING: this VM doesn't possess capability: canGetSourceDebugExtension");
-            return;
+    /**
+     * This testcase exercises ReferenceType.SourceDebugExtension command.
+     *
+     * The class queried is a primitive type which on ART does not
+     * have an associated DEX cache.
+     */
+    public void testSourceDebugExtension002() {
+        doTest("testSourceDebugExtension001", "I", JDWPConstants.Error.ABSENT_INFORMATION);
+    }
+
+    /**
+     * This testcase exercises ReferenceType.SourceDebugExtension command.
+     *
+     * The class queried is a primitive array which on ART does not
+     * have an associated DEX cache.
+     */
+    public void testSourceDebugExtension003() {
+        doTest("testSourceDebugExtension003", "[I", JDWPConstants.Error.ABSENT_INFORMATION);
+    }
+
+    /**
+     * This testcase exercises ReferenceType.SourceDebugExtension command.
+     *
+     * The class queried is an array which on ART does not have an
+     * associated DEX cache.
+     */
+    public void testSourceDebugExtension004() {
+        doTest("testSourceDebugExtension004", "[Ljava/lang/String;",
+               JDWPConstants.Error.ABSENT_INFORMATION);
+    }
+
+    /**
+     * This testcase exercises ReferenceType.SourceDebugExtension command.
+     *
+     * The test queries all classes to find a proxy class and then
+     * tries he SourceDebugExtension command on the proxy class. The
+     * debuggee instantiates a proxy so we know there is at least one.
+     */
+    public void testSourceDebugExtension005() {
+        // Identifying the name of a proxy class is tricky so get all class names and walk them:
+
+        logWriter.println("==> Send VirtualMachine::AllClasses command...");
+        CommandPacket packet = new CommandPacket(
+            JDWPCommands.VirtualMachineCommandSet.CommandSetID,
+            JDWPCommands.VirtualMachineCommandSet.AllClassesCommand);
+        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
+        checkReplyPacket(reply, "VirtualMachine::AllClasses command");
+
+        long typeID;
+        String signature;
+        int status;
+        int classes = reply.getNextValueAsInt();
+        int count = 0;
+        for (int i = 0; i < classes; i++) {
+            reply.getNextValueAsByte();
+            typeID = reply.getNextValueAsReferenceTypeID();
+            signature = reply.getNextValueAsString();
+            status = reply.getNextValueAsInt();
+            if (signature.contains("$Proxy")) {
+                doTest("testSourceDebugExtension005", signature,
+                       JDWPConstants.Error.ABSENT_INFORMATION);
+                return;
+            }
         }
 
-        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
-        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
-        long refTypeID = getClassIDBySignature(classWithSourceDebugExtension);
-        logWriter.println("=> Class with SourceDebugExtension = " + classWithSourceDebugExtension);
-        logWriter.println("=> referenceTypeID for class with SourceDebugExtension = " + refTypeID);
-        logWriter.println("=> CHECK: send " + thisCommandName + " and check reply...");
-
-        CommandPacket checkedCommand = new CommandPacket(
-                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
-                JDWPCommands.ReferenceTypeCommandSet.SourceDebugExtensionCommand);
-        checkedCommand.setNextValueAsReferenceTypeID(refTypeID);
-
-        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
-        checkedCommand = null;
-
-        short errorCode = checkedReply.getErrorCode();
-
-        switch ( errorCode ) {
-            case JDWPConstants.Error.NONE:
-                logWriter.println("=> No any ERROR is returned");
-                String sourceDebugExtension = checkedReply.getNextValueAsString();
-                logWriter.println("=> Returned SourceDebugExtension = " + sourceDebugExtension);
-                assertEquals(expectedSourceDebugExtension, sourceDebugExtension);
-                break;
-            default:
-                logWriter.println("\n## FAILURE: " + thisCommandName + " returns unexpected ERROR = "
-                    + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")");
-                fail(thisCommandName + " returns unexpected ERROR = "
-                    + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")");
-        }
-
-        assertAllDataRead(checkedReply);
-
-        logWriter.println("=> CHECK PASSED: No any unexpected ERROR is returned");
-
-        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
-        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH");
+        logWriter.println("\n## FAILURE: testSourceDebugExtension005 did not find a proxy class");
+        fail("testSourceDebugExtension005 did not find a proxy class");
     }
 }
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/StackFrame/StackTrace002Debuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/StackFrame/StackTrace002Debuggee.java
index f05d2c5..4a25285 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/StackFrame/StackTrace002Debuggee.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/StackFrame/StackTrace002Debuggee.java
@@ -24,6 +24,7 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 
 /**
  * Debuggee for GetValues002Test and SetValues002Test.
@@ -544,7 +545,7 @@
     }
 
     public void breakpointArray(int[] param) {
-        logWriter.println("breakpointArray(param=\"" + param + "\")");
+        logWriter.println("breakpointArray(param=\"" + Arrays.toString(param) + "\")");
         synchronizeWithTest();
     }