Merge "Make original exif test pass with the exiftool ground truth" into gb-ub-photos-bryce
diff --git a/src/com/android/gallery3d/exif/ExifTag.java b/src/com/android/gallery3d/exif/ExifTag.java
index 86ac7be..547a68f 100644
--- a/src/com/android/gallery3d/exif/ExifTag.java
+++ b/src/com/android/gallery3d/exif/ExifTag.java
@@ -1354,14 +1354,32 @@
                 (length > mComponentCount) ? mComponentCount : length);
     }
 
+    private String undefinedTypeValueToString() {
+        StringBuilder sbuilder = new StringBuilder();
+        switch (mTagId) {
+            case TAG_COMPONENTS_CONFIGURATION:
+            case TAG_FILE_SOURCE:
+            case TAG_SCENE_TYPE:
+                byte buf[] = (byte[]) mValue;
+                for(int i = 0, n = getComponentCount(); i < n; i++) {
+                    if(i != 0) sbuilder.append(" ");
+                    sbuilder.append(buf[i]);
+                }
+                break;
+            default:
+                sbuilder.append(new String((byte[]) mValue));
+        }
+        return sbuilder.toString();
+    }
+
     /**
      * Returns a string representation of the value of this tag.
      */
-    public String valueToString() {
+    String valueToString() {
         StringBuilder sbuilder = new StringBuilder();
         switch (getDataType()) {
             case ExifTag.TYPE_UNDEFINED:
-                sbuilder.append(new String((byte[]) mValue));
+                sbuilder.append(undefinedTypeValueToString());
                 break;
             case ExifTag.TYPE_UNSIGNED_BYTE:
                 byte buf[] = (byte[]) mValue;
diff --git a/tests/src/com/android/gallery3d/exif/ExifParserTest.java b/tests/src/com/android/gallery3d/exif/ExifParserTest.java
index f89ac29..fccf261 100644
--- a/tests/src/com/android/gallery3d/exif/ExifParserTest.java
+++ b/tests/src/com/android/gallery3d/exif/ExifParserTest.java
@@ -76,14 +76,19 @@
         // We can verify it by examining the sub-IFD or thumbnail itself.
         if (ExifTag.isSubIfdOffsetTag(tag.getTagId())) return;
 
-        String truthString = mGroundTruth.get(tag.getIfd()).get(tag.getTagId());
+        // TODO: Test MakerNote and UserComment
+        if (tag.getTagId() == ExifTag.TAG_MAKER_NOTE
+                || tag.getTagId() == ExifTag.TAG_USER_COMMENT) return;
+
+        String truthString = mGroundTruth.get(tag.getIfd()).get(tag.getTagId()).trim();
 
         if (truthString == null) {
-            fail(String.format("Unknown Tag %02x", tag.getTagId()));
+            fail(String.format("Unknown Tag %02x", tag.getTagId()) + ", " + getImageTitle());
         }
 
         String dataString = tag.valueToString().trim();
-        assertEquals(String.format("Tag %02x", tag.getTagId()), truthString, dataString);
+        assertEquals(String.format("Tag %02x", tag.getTagId()) + ", " + getImageTitle(),
+                truthString, dataString);
     }
 
     private void parseOneIfd(int ifd, int options)
@@ -95,11 +100,13 @@
         while(event != ExifParser.EVENT_END) {
             switch (event) {
                 case ExifParser.EVENT_START_OF_IFD:
-                    assertEquals(ifd, parser.getCurrentIfd());
+                    assertEquals(getImageTitle(), ifd, parser.getCurrentIfd());
                     break;
                 case ExifParser.EVENT_NEW_TAG:
                     ExifTag tag = parser.getTag();
-                    if (!ExifTag.isSubIfdOffsetTag(tag.getTagId())) numOfTag++;
+                    // The exiftool doesn't provide MakerNote tag
+                    if (!ExifTag.isSubIfdOffsetTag(tag.getTagId())
+                            && tag.getTagId() != ExifTag.TAG_MAKER_NOTE) numOfTag++;
                     if (tag.hasValue()) {
                         checkTag(tag);
                     } else {
@@ -117,7 +124,7 @@
                     break;
                 case ExifParser.EVENT_COMPRESSED_IMAGE:
                 case ExifParser.EVENT_UNCOMPRESSED_STRIP:
-                    fail("Invalid Event type: " + event);
+                    fail("Invalid Event type: " + event + ", " + getImageTitle());
                     break;
             }
             event = parser.next();
@@ -148,7 +155,7 @@
         while (event != ExifParser.EVENT_END) {
             switch (event) {
                 case ExifParser.EVENT_START_OF_IFD:
-                    assertEquals(IfdId.TYPE_IFD_0, parser.getCurrentIfd());
+                    assertEquals(getImageTitle(), IfdId.TYPE_IFD_0, parser.getCurrentIfd());
                     break;
                 case ExifParser.EVENT_NEW_TAG:
                     ExifTag tag = parser.getTag();
@@ -164,14 +171,14 @@
                     break;
                 case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG:
                     tag = parser.getTag();
-                    assertEquals(ExifTag.TAG_MODEL, tag.getTagId());
+                    assertEquals(getImageTitle(), ExifTag.TAG_MODEL, tag.getTagId());
                     checkTag(tag);
                     isTagFound = true;
                     break;
             }
             event = parser.next();
         }
-        assertTrue(isTagFound);
+        assertTrue(getImageTitle(), isTagFound);
     }
 
     public void testReadThumbnail() throws Exception {
@@ -201,7 +208,7 @@
             event = parser.next();
         }
         if (mIsContainCompressedImage) {
-            assertNotNull(bmp);
+            assertNotNull(getImageTitle(), bmp);
         }
     }
 }
diff --git a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
index 3a78e09..c753df6 100644
--- a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
+++ b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
@@ -47,9 +47,10 @@
         if (ifd1 != null) {
             if (ifd1.getTag(ExifTag.TAG_COMPRESSION).getUnsignedShort(0) ==
                     ExifTag.Compression.JPEG) {
-                assertTrue(exifData.hasCompressedThumbnail());
+                assertTrue(getImageTitle(), exifData.hasCompressedThumbnail());
                 byte[] thumbnail = exifData.getCompressedThumbnail();
-                assertTrue(BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length) != null);
+                assertTrue(getImageTitle(),
+                        BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length) != null);
             } else {
                 // Try to check the strip count with the formula provided by EXIF spec.
                 int planarType = ExifTag.PlanarConfiguration.CHUNKY;
@@ -67,20 +68,23 @@
                         ExifTag.TAG_STRIP_OFFSETS).getComponentCount();
 
                 if (planarType == ExifTag.PlanarConfiguration.CHUNKY) {
-                    assertTrue(stripCount == (imageLength + rowsPerStrip - 1) / rowsPerStrip);
+                    assertTrue(getImageTitle(),
+                            stripCount == (imageLength + rowsPerStrip - 1) / rowsPerStrip);
                 } else {
                     ExifTag samplePerPixelTag = ifd1.getTag(ExifTag.TAG_SAMPLES_PER_PIXEL);
                     int samplePerPixel = samplePerPixelTag.getUnsignedShort(0);
-                    assertTrue(stripCount ==
+                    assertTrue(getImageTitle(),
+                            stripCount ==
                             (imageLength + rowsPerStrip - 1) / rowsPerStrip * samplePerPixel);
                 }
 
                 for (int i = 0; i < stripCount; i++) {
                     ExifTag byteCountTag = ifd1.getTag(ExifTag.TAG_STRIP_BYTE_COUNTS);
                     if (byteCountTag.getDataType() == ExifTag.TYPE_UNSIGNED_SHORT) {
-                        assertEquals(byteCountTag.getUnsignedShort(i), exifData.getStrip(i).length);
+                        assertEquals(getImageTitle(),
+                                byteCountTag.getUnsignedShort(i), exifData.getStrip(i).length);
                     } else {
-                        assertEquals(
+                        assertEquals(getImageTitle(),
                                 byteCountTag.getUnsignedLong(i), exifData.getStrip(i).length);
                     }
                 }
@@ -98,16 +102,20 @@
 
     private void checkIfd(IfdData ifd, Map<Short, String> ifdValue) {
         if (ifd == null) {
-            assertEquals(0 ,ifdValue.size());
+            assertEquals(getImageTitle(), 0 ,ifdValue.size());
             return;
         }
         ExifTag[] tags = ifd.getAllTags();
         int size = 0;
         for (ExifTag tag : tags) {
-            if (ExifTag.isSubIfdOffsetTag(tag.getTagId())) continue;
-            assertEquals(ifdValue.get(tag.getTagId()), tag.valueToString().trim());
+            if (ExifTag.isSubIfdOffsetTag(tag.getTagId())
+                    || tag.getTagId() == ExifTag.TAG_MAKER_NOTE) continue;
+            if (tag.getTagId() != ExifTag.TAG_USER_COMMENT) {
+                assertEquals(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(),
+                        ifdValue.get(tag.getTagId()).trim(), tag.valueToString().trim());
+            }
             size++;
         }
-        assertEquals(ifdValue.size(), size);
+        assertEquals(getImageTitle(), ifdValue.size(), size);
     }
 }
diff --git a/tests/src/com/android/gallery3d/exif/ExifXmlDataTestCase.java b/tests/src/com/android/gallery3d/exif/ExifXmlDataTestCase.java
index 16a7c68..5b61778 100644
--- a/tests/src/com/android/gallery3d/exif/ExifXmlDataTestCase.java
+++ b/tests/src/com/android/gallery3d/exif/ExifXmlDataTestCase.java
@@ -29,6 +29,8 @@
 
 public class ExifXmlDataTestCase extends InstrumentationTestCase {
 
+    private static final String RES_ID_TITLE = "Resource ID: %x";
+
     private InputStream mImageInputStream;
     private InputStream mXmlInputStream;
     private XmlPullParser mXmlParser;
@@ -78,4 +80,12 @@
         Util.closeSilently(mImageInputStream);
         Util.closeSilently(mXmlInputStream);
     }
+
+    protected String getImageTitle() {
+        if (mImagePath != null) {
+            return mImagePath;
+        } else {
+            return String.format(RES_ID_TITLE, mImageResourceId);
+        }
+    }
 }