am 4d777350: am 206fb102: Merge "Fix CTS Signature test." into lmp-dev

* commit '4d7773509f81ad58eafd229c8ba7bdbe1defc32b':
  Fix CTS Signature test.
diff --git a/tests/signature/src/android/signature/cts/JDiffClassDescription.java b/tests/signature/src/android/signature/cts/JDiffClassDescription.java
index 7ea9911..6f07107 100644
--- a/tests/signature/src/android/signature/cts/JDiffClassDescription.java
+++ b/tests/signature/src/android/signature/cts/JDiffClassDescription.java
@@ -26,8 +26,10 @@
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -53,6 +55,8 @@
 
     @SuppressWarnings("unchecked")
     private Class<?> mClass;
+    // A map of field name to field of the fields contained in {@code mClass}
+    private Map<String, Field> mClassFieldMap;
 
     private String mPackageName;
     private String mShortClassName;
@@ -437,6 +441,7 @@
     public void checkSignatureCompliance() {
         checkClassCompliance();
         if (mClass != null) {
+            mClassFieldMap = buildFieldMap(mClass);
             checkFieldsCompliance();
             checkConstructorCompliance();
             checkMethodCompliance();
@@ -709,10 +714,15 @@
             try {
                 Field f = findMatchingField(field);
                 if (f == null) {
+                    StringBuilder builder = new StringBuilder();
+                    Field[] fields = mClass.getDeclaredFields();
+                    for (Field fi : fields) {
+                        builder.append("\tfield: ").append(fi.getName()).append("\n");
+                    }
                     mResultObserver.notifyFailure(FailureType.MISSING_FIELD,
                             field.toReadableString(mAbsoluteClassName),
                             "No field with correct signature found:" +
-                            field.toSignatureString());
+                            field.toSignatureString() + ". Found: " + builder.toString());
                 } else if (f.getModifiers() != field.mModifier) {
                     mResultObserver.notifyFailure(FailureType.MISMATCH_FIELD,
                             field.toReadableString(mAbsoluteClassName),
@@ -751,14 +761,8 @@
      * @param field the field description to find
      * @return the reflected field, or null if not found.
      */
-    private Field findMatchingField(JDiffField field){
-        Field[] fields = mClass.getDeclaredFields();
-        for (Field f : fields) {
-            if (f.getName().equals(field.mName)) {
-                return f;
-            }
-        }
-        return null;
+    private Field findMatchingField(JDiffField field) {
+        return mClassFieldMap.get(field.mName);
     }
 
     /**
@@ -1191,6 +1195,31 @@
         return paramType.replace("<? extends java.lang.Object>", "<?>");
     }
 
+    /**
+     * Scan a class (an its entire inheritance chain) for fields.
+     *
+     * @return a {@link Map} of fieldName to {@link Field}
+     */
+    private static Map<String, Field> buildFieldMap(Class testClass) {
+        Map<String, Field> fieldMap = new HashMap<String, Field>();
+        // Scan the superclass
+        if (testClass.getSuperclass() != null) {
+            fieldMap.putAll(buildFieldMap(testClass.getSuperclass()));
+        }
+
+        // Scan the interfaces
+        for (Class interfaceClass : testClass.getInterfaces()) {
+            fieldMap.putAll(buildFieldMap(interfaceClass));
+        }
+
+        // Check the fields in the test class
+        for (Field field : testClass.getDeclaredFields()) {
+            fieldMap.put(field.getName(), field);
+        }
+
+        return fieldMap;
+    }
+
     private static void loge(String message, Exception exception) {
         System.err.println(String.format("%s: %s", message, exception));
     }
diff --git a/tests/signature/src/android/signature/cts/SignatureTest.java b/tests/signature/src/android/signature/cts/SignatureTest.java
index e3099a9..85b77f8 100644
--- a/tests/signature/src/android/signature/cts/SignatureTest.java
+++ b/tests/signature/src/android/signature/cts/SignatureTest.java
@@ -69,8 +69,6 @@
     private static final String ATTRIBUTE_TYPE = "type";
     private static final String ATTRIBUTE_RETURN = "return";
 
-    private static ArrayList<String> mDebugArray = new ArrayList<String>();
-
     private HashSet<String> mKeyTagSet;
     private TestResultObserver mResultObserver;
 
@@ -85,6 +83,8 @@
             mErrorString.append(type.toString().toLowerCase());
             mErrorString.append(":\t");
             mErrorString.append(name);
+            mErrorString.append("\tError: ");
+            mErrorString.append(errorMessage);
         }
     }
 
@@ -109,7 +109,7 @@
         logd(String.format("Class: %s", rClass.toString()));
         Field[] fs = rClass.getFields();
         for (Field f : fs) {
-            logd(String.format("Field: %s", fs.toString()));
+            logd(String.format("Field: %s", f.toString()));
             try {
                 start(r.getXml(f.getInt(rClass)));
             } catch (Exception e) {
@@ -142,11 +142,12 @@
      * Signature test entry point.
      */
     private void start(XmlPullParser parser) throws XmlPullParserException, IOException {
-        logd(String.format("Parser: %s", parser.getName()));
-        logd(String.format("Parser: %s", parser.getNamespace()));
-        logd(String.format("Parser: %s", parser.getLineNumber()));
-        logd(String.format("Parser: %s", parser.getColumnNumber()));
-        logd(String.format("Parser: %s", parser.getPositionDescription()));
+        logd(String.format("Name: %s", parser.getName()));
+        logd(String.format("Text: %s", parser.getText()));
+        logd(String.format("Namespace: %s", parser.getNamespace()));
+        logd(String.format("Line Number: %s", parser.getLineNumber()));
+        logd(String.format("Column Number: %s", parser.getColumnNumber()));
+        logd(String.format("Position Description: %s", parser.getPositionDescription()));
         JDiffClassDescription currentClass = null;
         String currentPackage = "";
         JDiffMethod currentMethod = null;
@@ -204,7 +205,16 @@
                 currentClass.addField(field);
             } else {
                 throw new RuntimeException(
-                        "unknow tag exception:" + tagname);
+                        "unknown tag exception:" + tagname);
+            }
+            if (currentPackage != null) {
+                logd(String.format("currentPackage: %s", currentPackage));
+            }
+            if (currentClass != null) {
+                logd(String.format("currentClass: %s", currentClass.toSignatureString()));
+            }
+            if (currentMethod != null) {
+                logd(String.format("currentMethod: %s", currentMethod.toSignatureString()));
             }
         }
     }