diff options
Diffstat (limited to 'tests/src/com/android/gallery3d/exif/ExifInterfaceTest.java')
-rw-r--r-- | tests/src/com/android/gallery3d/exif/ExifInterfaceTest.java | 533 |
1 files changed, 0 insertions, 533 deletions
diff --git a/tests/src/com/android/gallery3d/exif/ExifInterfaceTest.java b/tests/src/com/android/gallery3d/exif/ExifInterfaceTest.java deleted file mode 100644 index 01b2a323e..000000000 --- a/tests/src/com/android/gallery3d/exif/ExifInterfaceTest.java +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.gallery3d.exif; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; - -import android.test.suitebuilder.annotation.MediumTest; - -import java.io.ByteArrayInputStream; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; - -import java.io.IOException; -import java.io.InputStream; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ExifInterfaceTest extends ExifXmlDataTestCase { - - private File mTmpFile; - private List<Map<Short, List<String>>> mGroundTruth; - private ExifInterface mInterface; - private ExifTag mVersionTag; - private ExifTag mGpsVersionTag; - private ExifTag mModelTag; - private ExifTag mDateTimeTag; - private ExifTag mCompressionTag; - private ExifTag mThumbnailFormatTag; - private ExifTag mLongitudeTag; - private ExifTag mShutterTag; - Map<Integer, ExifTag> mTestTags; - Map<Integer, Integer> mTagDefinitions; - - public ExifInterfaceTest(int imageRes, int xmlRes) { - super(imageRes, xmlRes); - } - - public ExifInterfaceTest(String imagePath, String xmlPath) { - super(imagePath, xmlPath); - } - - @MediumTest - public void testInterface() throws Exception { - - InputStream imageInputStream = null; - try { - // Basic checks - - // Check if bitmap is valid - byte[] imgData = Util.readToByteArray(getImageInputStream()); - imageInputStream = new ByteArrayInputStream(imgData); - checkBitmap(imageInputStream); - - // Check defines - int tag = ExifInterface.defineTag(1, (short) 0x0100); - assertTrue(getImageTitle(), tag == 0x00010100); - int tagDef = mInterface.getTagDefinition((short) 0x0100, IfdId.TYPE_IFD_0); - assertTrue(getImageTitle(), tagDef == 0x03040001); - int[] allowed = ExifInterface.getAllowedIfdsFromInfo(mInterface.getTagInfo().get( - ExifInterface.TAG_IMAGE_WIDTH)); - assertTrue(getImageTitle(), allowed.length == 2 && allowed[0] == IfdId.TYPE_IFD_0 - && allowed[1] == IfdId.TYPE_IFD_1); - - // Check if there are any initial tags - assertTrue(getImageTitle(), mInterface.getAllTags() == null); - - // ///////// Basic read/write testing - - // Make sure we can read - imageInputStream = new ByteArrayInputStream(imgData); - mInterface.readExif(imageInputStream); - - // Check tags against ground truth - checkTagsAgainstXml(mInterface.getAllTags()); - - // Make sure clearing Exif works - mInterface.clearExif(); - assertTrue(getImageTitle(), mInterface.getAllTags() == null); - - // Make sure setting tags works - mInterface.setTags(mTestTags.values()); - checkTagsAgainstHash(mInterface.getAllTags(), mTestTags); - - // Try writing over bitmap exif - ByteArrayOutputStream imgModified = new ByteArrayOutputStream(); - mInterface.writeExif(imgData, imgModified); - - // Check if bitmap is valid - byte[] imgData2 = imgModified.toByteArray(); - imageInputStream = new ByteArrayInputStream(imgData2); - checkBitmap(imageInputStream); - - // Make sure we get the same tags out - imageInputStream = new ByteArrayInputStream(imgData2); - mInterface.readExif(imageInputStream); - checkTagsAgainstHash(mInterface.getAllTags(), mTestTags); - - // Reread original image - imageInputStream = new ByteArrayInputStream(imgData); - mInterface.readExif(imageInputStream); - - // Write out with original exif - imgModified = new ByteArrayOutputStream(); - mInterface.writeExif(imgData2, imgModified); - - // Read back in exif and check tags - imgData2 = imgModified.toByteArray(); - imageInputStream = new ByteArrayInputStream(imgData2); - mInterface.readExif(imageInputStream); - checkTagsAgainstXml(mInterface.getAllTags()); - - // Check if bitmap is valid - imageInputStream = new ByteArrayInputStream(imgData2); - checkBitmap(imageInputStream); - - } catch (Exception e) { - throw new Exception(getImageTitle(), e); - } finally { - Util.closeSilently(imageInputStream); - } - } - - @MediumTest - public void testInterfaceModify() throws Exception { - - // TODO: This test is dependent on galaxy_nexus jpeg/xml file. - InputStream imageInputStream = null; - try { - // Check if bitmap is valid - byte[] imgData = Util.readToByteArray(getImageInputStream()); - imageInputStream = new ByteArrayInputStream(imgData); - checkBitmap(imageInputStream); - - // ///////// Exif modifier testing. - - // Read exif and write to temp file - imageInputStream = new ByteArrayInputStream(imgData); - mInterface.readExif(imageInputStream); - mInterface.writeExif(imgData, mTmpFile.getPath()); - - // Check if bitmap is valid - imageInputStream = new FileInputStream(mTmpFile); - checkBitmap(imageInputStream); - - // Create some tags to overwrite with - ArrayList<ExifTag> tags = new ArrayList<ExifTag>(); - tags.add(mInterface.buildTag(ExifInterface.TAG_ORIENTATION, - ExifInterface.Orientation.RIGHT_TOP)); - tags.add(mInterface.buildTag(ExifInterface.TAG_USER_COMMENT, "goooooooooooooooooogle")); - - // Attempt to rewrite tags - assertTrue(getImageTitle(), mInterface.rewriteExif(mTmpFile.getPath(), tags)); - - imageInputStream.close(); - // Check if bitmap is valid - imageInputStream = new FileInputStream(mTmpFile); - checkBitmap(imageInputStream); - - // Read tags and check against xml - mInterface.readExif(mTmpFile.getPath()); - for (ExifTag t : mInterface.getAllTags()) { - short tid = t.getTagId(); - if (tid != ExifInterface.getTrueTagKey(ExifInterface.TAG_ORIENTATION) - && tid != ExifInterface.getTrueTagKey(ExifInterface.TAG_USER_COMMENT)) { - checkTagAgainstXml(t); - } - } - assertTrue(getImageTitle(), mInterface.getTagIntValue(ExifInterface.TAG_ORIENTATION) - .shortValue() == ExifInterface.Orientation.RIGHT_TOP); - String valString = mInterface.getTagStringValue(ExifInterface.TAG_USER_COMMENT); - assertTrue(getImageTitle(), valString.equals("goooooooooooooooooogle")); - - // Test forced modify - - // Create some tags to overwrite with - tags = new ArrayList<ExifTag>(); - tags.add(mInterface.buildTag(ExifInterface.TAG_SOFTWARE, "magic super photomaker pro")); - tags.add(mInterface.buildTag(ExifInterface.TAG_USER_COMMENT, "noodles")); - tags.add(mInterface.buildTag(ExifInterface.TAG_ORIENTATION, - ExifInterface.Orientation.TOP_LEFT)); - - // Force rewrite tags - mInterface.forceRewriteExif(mTmpFile.getPath(), tags); - - imageInputStream.close(); - // Check if bitmap is valid - imageInputStream = new FileInputStream(mTmpFile); - checkBitmap(imageInputStream); - - // Read tags and check against xml - mInterface.readExif(mTmpFile.getPath()); - for (ExifTag t : mInterface.getAllTags()) { - short tid = t.getTagId(); - if (!ExifInterface.isOffsetTag(tid) - && tid != ExifInterface.getTrueTagKey(ExifInterface.TAG_SOFTWARE) - && tid != ExifInterface.getTrueTagKey(ExifInterface.TAG_USER_COMMENT)) { - checkTagAgainstXml(t); - } - } - valString = mInterface.getTagStringValue(ExifInterface.TAG_SOFTWARE); - String compareString = "magic super photomaker pro\0"; - assertTrue(getImageTitle(), valString.equals(compareString)); - valString = mInterface.getTagStringValue(ExifInterface.TAG_USER_COMMENT); - assertTrue(getImageTitle(), valString.equals("noodles")); - - } catch (Exception e) { - throw new Exception(getImageTitle(), e); - } finally { - Util.closeSilently(imageInputStream); - } - } - - @MediumTest - public void testInterfaceDefines() throws Exception { - - InputStream imageInputStream = null; - try { - // Check if bitmap is valid - byte[] imgData = Util.readToByteArray(getImageInputStream()); - imageInputStream = new ByteArrayInputStream(imgData); - checkBitmap(imageInputStream); - - // Set some tags. - mInterface.setTags(mTestTags.values()); - - // Check tag definitions against default - for (Integer i : mTestTags.keySet()) { - int check = mTagDefinitions.get(i).intValue(); - int actual = mInterface.getTagInfo().get(i); - assertTrue(check == actual); - } - - // Check defines - int tag1 = ExifInterface.defineTag(IfdId.TYPE_IFD_1, (short) 42); - int tag2 = ExifInterface.defineTag(IfdId.TYPE_IFD_INTEROPERABILITY, (short) 43); - assertTrue(tag1 == 0x0001002a); - assertTrue(tag2 == 0x0003002b); - - // Define some non-standard tags - assertTrue(mInterface.setTagDefinition((short) 42, IfdId.TYPE_IFD_1, - ExifTag.TYPE_UNSIGNED_BYTE, (short) 16, new int[] { - IfdId.TYPE_IFD_1 - }) == tag1); - assertTrue(mInterface.getTagInfo().get(tag1) == 0x02010010); - assertTrue(mInterface.setTagDefinition((short) 43, IfdId.TYPE_IFD_INTEROPERABILITY, - ExifTag.TYPE_ASCII, (short) 5, new int[] { - IfdId.TYPE_IFD_GPS, IfdId.TYPE_IFD_INTEROPERABILITY - }) == tag2); - assertTrue(mInterface.getTagInfo().get(tag2) == 0x18020005); - - // Make sure these don't work - assertTrue(mInterface.setTagDefinition((short) 42, IfdId.TYPE_IFD_1, - ExifTag.TYPE_UNSIGNED_BYTE, (short) 16, new int[] { - IfdId.TYPE_IFD_0 - }) == ExifInterface.TAG_NULL); - assertTrue(mInterface.setTagDefinition((short) 42, IfdId.TYPE_IFD_1, (short) 0, - (short) 16, new int[] { - IfdId.TYPE_IFD_1 - }) == ExifInterface.TAG_NULL); - assertTrue(mInterface.setTagDefinition((short) 42, 5, ExifTag.TYPE_UNSIGNED_BYTE, - (short) 16, new int[] { - 5 - }) == ExifInterface.TAG_NULL); - assertTrue(mInterface.setTagDefinition((short) 42, IfdId.TYPE_IFD_1, - ExifTag.TYPE_UNSIGNED_BYTE, (short) 16, new int[] { - -1 - }) == ExifInterface.TAG_NULL); - assertTrue(mInterface.setTagDefinition((short) 43, IfdId.TYPE_IFD_GPS, - ExifTag.TYPE_ASCII, (short) 5, new int[] { - IfdId.TYPE_IFD_GPS - }) == ExifInterface.TAG_NULL); - assertTrue(mInterface.setTagDefinition((short) 43, IfdId.TYPE_IFD_0, - ExifTag.TYPE_ASCII, (short) 5, new int[] { - IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_GPS - }) == ExifInterface.TAG_NULL); - - // Set some tags - mInterface.setTags(mTestTags.values()); - checkTagsAgainstHash(mInterface.getAllTags(), mTestTags); - - // Make some tags using new defines - ExifTag defTag0 = mInterface.buildTag(tag1, new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 - }); - assertTrue(defTag0 != null); - ExifTag defTag1 = mInterface.buildTag(tag2, "hihi"); - assertTrue(defTag1 != null); - ExifTag defTag2 = mInterface.buildTag(tag2, IfdId.TYPE_IFD_GPS, "byte"); - assertTrue(defTag2 != null); - - // Make sure these don't work - ExifTag badTag = mInterface.buildTag(tag1, new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - }); - assertTrue(badTag == null); - badTag = mInterface.buildTag(tag1, IfdId.TYPE_IFD_0, new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 - }); - assertTrue(badTag == null); - badTag = mInterface.buildTag(0x0002002a, new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 - }); - assertTrue(badTag == null); - badTag = mInterface.buildTag(tag2, new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 - }); - assertTrue(badTag == null); - - // Set the tags - assertTrue(mInterface.setTag(defTag0) == null); - assertTrue(mInterface.setTag(defTag1) == null); - assertTrue(mInterface.setTag(defTag2) == null); - assertTrue(mInterface.setTag(defTag0).equals(defTag0)); - assertTrue(mInterface.setTag(null) == null); - assertTrue(mInterface.setTagValue(tag2, "yoyo") == true); - assertTrue(mInterface.setTagValue(tag2, "yaaarggg") == false); - assertTrue(mInterface.getTagStringValue(tag2).equals("yoyo\0")); - - // Try writing over bitmap exif - ByteArrayOutputStream imgModified = new ByteArrayOutputStream(); - mInterface.writeExif(imgData, imgModified); - - // Check if bitmap is valid - byte[] imgData2 = imgModified.toByteArray(); - imageInputStream = new ByteArrayInputStream(imgData2); - checkBitmap(imageInputStream); - - // Read back in the tags - mInterface.readExif(imgData2); - - // Check tags - for (ExifTag t : mInterface.getAllTags()) { - int tid = t.getTagId(); - if (tid != ExifInterface.getTrueTagKey(tag1) - && tid != ExifInterface.getTrueTagKey(tag2)) { - checkTagAgainstHash(t, mTestTags); - } - } - assertTrue(Arrays.equals(mInterface.getTagByteValues(tag1), new byte[] { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 - })); - assertTrue(mInterface.getTagStringValue(tag2).equals("yoyo\0")); - assertTrue(mInterface.getTagStringValue(tag2, IfdId.TYPE_IFD_GPS).equals("byte\0")); - - } catch (Exception e) { - throw new Exception(getImageTitle(), e); - } finally { - Util.closeSilently(imageInputStream); - } - } - - @MediumTest - public void testInterfaceThumbnails() throws Exception { - - InputStream imageInputStream = null; - try { - // Check if bitmap is valid - byte[] imgData = Util.readToByteArray(getImageInputStream()); - imageInputStream = new ByteArrayInputStream(imgData); - checkBitmap(imageInputStream); - - // Check thumbnails - mInterface.readExif(imgData); - Bitmap bmap = mInterface.getThumbnailBitmap(); - assertTrue(getImageTitle(), bmap != null); - - // Make a new thumbnail and set it - BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inSampleSize = 16; - Bitmap thumb = BitmapFactory.decodeByteArray(imgData, 0, imgData.length, opts); - assertTrue(getImageTitle(), thumb != null); - assertTrue(getImageTitle(), mInterface.setCompressedThumbnail(thumb) == true); - - // Write out image - ByteArrayOutputStream outData = new ByteArrayOutputStream(); - mInterface.writeExif(imgData, outData); - - // Make sure bitmap is still valid - byte[] imgData2 = outData.toByteArray(); - imageInputStream = new ByteArrayInputStream(imgData2); - checkBitmap(imageInputStream); - - // Read in bitmap and make sure thumbnail is still valid - mInterface.readExif(imgData2); - bmap = mInterface.getThumbnailBitmap(); - assertTrue(getImageTitle(), bmap != null); - - } catch (Exception e) { - throw new Exception(getImageTitle(), e); - } finally { - Util.closeSilently(imageInputStream); - } - } - - @Override - public void setUp() throws Exception { - super.setUp(); - mTmpFile = File.createTempFile("exif_test", ".jpg"); - mGroundTruth = ExifXmlReader.readXml(getXmlParser()); - - mInterface = new ExifInterface(); - - // TYPE_UNDEFINED with 4 components - mVersionTag = mInterface.buildTag(ExifInterface.TAG_EXIF_VERSION, new byte[] { - 5, 4, 3, 2 - }); - // TYPE_UNSIGNED_BYTE with 4 components - mGpsVersionTag = mInterface.buildTag(ExifInterface.TAG_GPS_VERSION_ID, new byte[] { - 6, 7, 8, 9 - }); - // TYPE ASCII with arbitary length - mModelTag = mInterface.buildTag(ExifInterface.TAG_MODEL, "helloworld"); - // TYPE_ASCII with 20 components - mDateTimeTag = mInterface.buildTag(ExifInterface.TAG_DATE_TIME, "2013:02:11 20:20:20"); - // TYPE_UNSIGNED_SHORT with 1 components - mCompressionTag = mInterface.buildTag(ExifInterface.TAG_COMPRESSION, 100); - // TYPE_UNSIGNED_LONG with 1 components - mThumbnailFormatTag = - mInterface.buildTag(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, 100); - // TYPE_UNSIGNED_RATIONAL with 3 components - mLongitudeTag = mInterface.buildTag(ExifInterface.TAG_GPS_LONGITUDE, new Rational[] { - new Rational(2, 2), new Rational(11, 11), - new Rational(102, 102) - }); - // TYPE_RATIONAL with 1 components - mShutterTag = mInterface - .buildTag(ExifInterface.TAG_SHUTTER_SPEED_VALUE, new Rational(4, 6)); - - mTestTags = new HashMap<Integer, ExifTag>(); - - mTestTags.put(ExifInterface.TAG_EXIF_VERSION, mVersionTag); - mTestTags.put(ExifInterface.TAG_GPS_VERSION_ID, mGpsVersionTag); - mTestTags.put(ExifInterface.TAG_MODEL, mModelTag); - mTestTags.put(ExifInterface.TAG_DATE_TIME, mDateTimeTag); - mTestTags.put(ExifInterface.TAG_COMPRESSION, mCompressionTag); - mTestTags.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, mThumbnailFormatTag); - mTestTags.put(ExifInterface.TAG_GPS_LONGITUDE, mLongitudeTag); - mTestTags.put(ExifInterface.TAG_SHUTTER_SPEED_VALUE, mShutterTag); - - mTagDefinitions = new HashMap<Integer, Integer>(); - mTagDefinitions.put(ExifInterface.TAG_EXIF_VERSION, 0x04070004); - mTagDefinitions.put(ExifInterface.TAG_GPS_VERSION_ID, 0x10010004); - mTagDefinitions.put(ExifInterface.TAG_MODEL, 0x03020000); - mTagDefinitions.put(ExifInterface.TAG_DATE_TIME, 0x03020014); - mTagDefinitions.put(ExifInterface.TAG_COMPRESSION, 0x03030001); - mTagDefinitions.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, 0x02040001); - mTagDefinitions.put(ExifInterface.TAG_GPS_LONGITUDE, 0x100a0003); - mTagDefinitions.put(ExifInterface.TAG_SHUTTER_SPEED_VALUE, 0x040a0001); - } - - @Override - public void tearDown() throws Exception { - super.tearDown(); - mTmpFile.delete(); - } - - // Helper functions - - private void checkTagAgainstXml(ExifTag tag) { - List<String> truth = mGroundTruth.get(tag.getIfd()).get(tag.getTagId()); - - if (truth == null) { - fail(String.format("Unknown Tag %02x", tag.getTagId()) + ", " + getImageTitle()); - } - - // No value from exiftool. - if (truth.contains(null)) - return; - - String dataString = Util.tagValueToString(tag).trim(); - assertTrue(String.format("Tag %02x", tag.getTagId()) + ", " + getImageTitle() - + ": " + dataString, - truth.contains(dataString)); - } - - private void checkTagsAgainstXml(List<ExifTag> tags) { - for (ExifTag t : tags) { - checkTagAgainstXml(t); - } - } - - private void checkTagAgainstHash(ExifTag tag, Map<Integer, ExifTag> testTags) { - int tagdef = mInterface.getTagDefinitionForTag(tag); - assertTrue(getImageTitle(), tagdef != ExifInterface.TAG_NULL); - ExifTag t = testTags.get(tagdef); - // Ignore offset tags & other special tags - if (!ExifInterface.sBannedDefines.contains(tag.getTagId())) { - assertTrue(getImageTitle(), t != null); - } else { - return; - } - if (t == tag) - return; - assertTrue(getImageTitle(), tag.equals(t)); - assertTrue(getImageTitle(), tag.getDataType() == t.getDataType()); - assertTrue(getImageTitle(), tag.getTagId() == t.getTagId()); - assertTrue(getImageTitle(), tag.getIfd() == t.getIfd()); - assertTrue(getImageTitle(), tag.getComponentCount() == t.getComponentCount()); - } - - private void checkTagsAgainstHash(List<ExifTag> tags, Map<Integer, ExifTag> testTags) { - for (ExifTag t : tags) { - checkTagAgainstHash(t, testTags); - } - } - - private void checkBitmap(InputStream inputStream) throws IOException { - Bitmap bmp = BitmapFactory.decodeStream(inputStream); - assertTrue(getImageTitle(), bmp != null); - } - -} |