summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/gallery3d/exif/ExifReaderTest.java')
-rw-r--r--tests/src/com/android/gallery3d/exif/ExifReaderTest.java170
1 files changed, 88 insertions, 82 deletions
diff --git a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
index 269120870..30f34c09a 100644
--- a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
+++ b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
@@ -16,119 +16,125 @@
package com.android.gallery3d.exif;
-import android.content.res.XmlResourceParser;
import android.graphics.BitmapFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
public class ExifReaderTest extends ExifXmlDataTestCase {
private static final String TAG = "ExifReaderTest";
- private final HashMap<Short, String> mIfd0Value = new HashMap<Short, String>();
- private final HashMap<Short, String> mIfd1Value = new HashMap<Short, String>();
- private final HashMap<Short, String> mExifIfdValue = new HashMap<Short, String>();
- private final HashMap<Short, String> mInteroperabilityIfdValue = new HashMap<Short, String>();
-
- private InputStream mImageInputStream;
-
- public ExifReaderTest(int imageResourceId, int xmlResourceId) {
- super(imageResourceId, xmlResourceId);
- }
+ private List<Map<Short, List<String>>> mGroundTruth;
@Override
public void setUp() throws Exception {
- mImageInputStream = getInstrumentation()
- .getContext().getResources().openRawResource(mImageResourceId);
+ super.setUp();
+ mGroundTruth = ExifXmlReader.readXml(getXmlParser());
+ }
- XmlResourceParser parser =
- getInstrumentation().getContext().getResources().getXml(mXmlResourceId);
+ public ExifReaderTest(int imgRes, int xmlRes) {
+ super(imgRes, xmlRes);
+ }
- ExifXmlReader.readXml(parser, mIfd0Value, mIfd1Value, mExifIfdValue
- , mInteroperabilityIfdValue);
- parser.close();
+ public ExifReaderTest(String imgPath, String xmlPath) {
+ super(imgPath, xmlPath);
}
- public void testRead() throws ExifInvalidFormatException, IOException {
- ExifReader reader = new ExifReader();
- ExifData exifData = reader.read(mImageInputStream);
- checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_0), mIfd0Value);
- checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_1), mIfd1Value);
- checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_EXIF), mExifIfdValue);
- checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY),
- mInteroperabilityIfdValue);
- checkThumbnail(exifData);
+ public void testRead() throws Exception {
+ try {
+ ExifReader reader = new ExifReader();
+ ExifData exifData = reader.read(getImageInputStream());
+ for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) {
+ checkIfd(exifData.getIfdData(i), mGroundTruth.get(i));
+ }
+ checkThumbnail(exifData);
+ } catch (Exception e) {
+ throw new Exception(getImageTitle(), e);
+ }
}
private void checkThumbnail(ExifData exifData) {
+ Map<Short, List<String>> ifd1Truth = mGroundTruth.get(IfdId.TYPE_IFD_1);
+
+ List<String> typeTagValue = ifd1Truth.get(ExifTag.TAG_COMPRESSION);
+ if (typeTagValue == null) return;
+
IfdData ifd1 = exifData.getIfdData(IfdId.TYPE_IFD_1);
- if (ifd1 != null) {
- if (ifd1.getTag(ExifTag.TAG_COMPRESSION).getUnsignedShort(0) ==
- ExifTag.Compression.JPEG) {
- assertTrue(exifData.hasCompressedThumbnail());
- byte[] thumbnail = exifData.getCompressedThumbnail();
- assertTrue(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;
- ExifTag planarTag = ifd1.getTag(ExifTag.TAG_PLANAR_CONFIGURATION);
- if (planarTag != null) {
- planarType = planarTag.getUnsignedShort(0);
- }
+ if (ifd1 == null) fail(getImageTitle() + ": failed to find IFD1");
+
+ String typeTagTruth = typeTagValue.get(0);
+
+ int type = (int) ifd1.getTag(ExifTag.TAG_COMPRESSION).getValueAt(0);
+
+ if (String.valueOf(ExifTag.Compression.JPEG).equals(typeTagTruth)) {
+ assertTrue(getImageTitle(), type == ExifTag.Compression.JPEG);
+ assertTrue(getImageTitle(), exifData.hasCompressedThumbnail());
+ byte[] thumbnail = exifData.getCompressedThumbnail();
+ assertTrue(getImageTitle(),
+ BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length) != null);
+ } else if (String.valueOf(ExifTag.Compression.UNCOMPRESSION).equals(typeTagTruth)) {
+ assertTrue(getImageTitle(), type == ExifTag.Compression.UNCOMPRESSION);
+ // Try to check the strip count with the formula provided by EXIF spec.
+ int planarType = ExifTag.PlanarConfiguration.CHUNKY;
+ ExifTag planarTag = ifd1.getTag(ExifTag.TAG_PLANAR_CONFIGURATION);
+ if (planarTag != null) {
+ planarType = (int) planarTag.getValueAt(0);
+ }
- ExifTag heightTag = ifd1.getTag(ExifTag.TAG_IMAGE_LENGTH);
- ExifTag rowPerStripTag = ifd1.getTag(ExifTag.TAG_ROWS_PER_STRIP);
+ if (!ifd1Truth.containsKey(ExifTag.TAG_IMAGE_LENGTH) ||
+ !ifd1Truth.containsKey(ExifTag.TAG_ROWS_PER_STRIP)) return;
- int imageLength = getUnsignedIntOrShort(heightTag);
- int rowsPerStrip = getUnsignedIntOrShort(rowPerStripTag);
- int stripCount = ifd1.getTag(
- ExifTag.TAG_STRIP_OFFSETS).getComponentCount();
+ ExifTag heightTag = ifd1.getTag(ExifTag.TAG_IMAGE_LENGTH);
+ ExifTag rowPerStripTag = ifd1.getTag(ExifTag.TAG_ROWS_PER_STRIP);
- if (planarType == ExifTag.PlanarConfiguration.CHUNKY) {
- assertTrue(stripCount == (imageLength + rowsPerStrip - 1) / rowsPerStrip);
- } else {
- ExifTag samplePerPixelTag = ifd1.getTag(ExifTag.TAG_SAMPLES_PER_PIXEL);
- int samplePerPixel = samplePerPixelTag.getUnsignedShort(0);
- assertTrue(stripCount ==
- (imageLength + rowsPerStrip - 1) / rowsPerStrip * samplePerPixel);
- }
+ // Fail the test if required tags are missing
+ if (heightTag == null || rowPerStripTag == null) fail(getImageTitle());
- 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);
- } else {
- assertEquals(
- byteCountTag.getUnsignedLong(i), exifData.getStrip(i).length);
- }
- }
+ int imageLength = (int) heightTag.getValueAt(0);
+ int rowsPerStrip = (int) rowPerStripTag.getValueAt(0);
+ int stripCount = ifd1.getTag(
+ ExifTag.TAG_STRIP_OFFSETS).getComponentCount();
+
+ if (planarType == ExifTag.PlanarConfiguration.CHUNKY) {
+ assertTrue(getImageTitle(),
+ stripCount == (imageLength + rowsPerStrip - 1) / rowsPerStrip);
+ } else {
+ if (!ifd1Truth.containsKey(ExifTag.TAG_SAMPLES_PER_PIXEL)) return;
+ ExifTag samplePerPixelTag = ifd1.getTag(ExifTag.TAG_SAMPLES_PER_PIXEL);
+ int samplePerPixel = (int) samplePerPixelTag.getValueAt(0);
+ assertTrue(getImageTitle(),
+ stripCount ==
+ (imageLength + rowsPerStrip - 1) / rowsPerStrip * samplePerPixel);
}
- }
- }
- private int getUnsignedIntOrShort(ExifTag tag) {
- if (tag.getDataType() == ExifTag.TYPE_UNSIGNED_SHORT) {
- return tag.getUnsignedShort(0);
- } else {
- return (int) tag.getUnsignedLong(0);
+ if (!ifd1Truth.containsKey(ExifTag.TAG_STRIP_BYTE_COUNTS)) return;
+ ExifTag byteCountTag = ifd1.getTag(ExifTag.TAG_STRIP_BYTE_COUNTS);
+ short byteCountDataType = byteCountTag.getDataType();
+ for (int i = 0; i < stripCount; i++) {
+ if (byteCountDataType == ExifTag.TYPE_UNSIGNED_SHORT) {
+ assertEquals(getImageTitle(),
+ byteCountTag.getValueAt(i), exifData.getStrip(i).length);
+ } else {
+ assertEquals(getImageTitle(),
+ byteCountTag.getValueAt(i), exifData.getStrip(i).length);
+ }
+ }
}
}
- private void checkIfd(IfdData ifd, HashMap<Short, String> ifdValue) {
+ private void checkIfd(IfdData ifd, Map<Short, List<String>> ifdValue) {
if (ifd == null) {
- assertEquals(0 ,ifdValue.size());
+ assertEquals(getImageTitle(), 0 ,ifdValue.size());
return;
}
ExifTag[] tags = ifd.getAllTags();
for (ExifTag tag : tags) {
- assertEquals(ifdValue.get(tag.getTagId()), tag.valueToString().trim());
+ List<String> truth = ifdValue.get(tag.getTagId());
+ assertNotNull(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(), truth);
+ if (truth.contains(null)) continue;
+ assertTrue(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(),
+ truth.contains(Util.tagValueToString(tag).trim()));
}
- assertEquals(ifdValue.size(), tags.length);
- }
-
- @Override
- public void tearDown() throws Exception {
- mImageInputStream.close();
+ assertEquals(getImageTitle(), ifdValue.size(), tags.length);
}
}