1b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini/* 2b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * Copyright (C) 2017 The Android Open Source Project 3b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * 4b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * Licensed under the Apache License, Version 2.0 (the "License"); 5b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * you may not use this file except in compliance with the License. 6b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * You may obtain a copy of the License at 7b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * 8b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * http://www.apache.org/licenses/LICENSE-2.0 9b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * 10b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * Unless required by applicable law or agreed to in writing, software 11b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * distributed under the License is distributed on an "AS IS" BASIS, 12b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * See the License for the specific language governing permissions and 14b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini * limitations under the License. 15b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini */ 16b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 17b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancinipackage android.util; 18b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 19b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport android.media.ExifInterface; 20b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport android.os.Bundle; 21b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport android.provider.DocumentsContract; 22b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport android.provider.MetadataReader; 23b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 24b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport libcore.io.IoUtils; 25b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 26b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport junit.framework.TestCase; 27b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 28b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport org.junit.After; 29b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport org.junit.Before; 30b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport org.junit.Test; 31b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 32b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport java.io.FileInputStream; 33b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport java.io.FileNotFoundException; 34b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport java.io.IOException; 35b65051579fd9d0a625686ba41808e0092a0ee40eJulian Manciniimport java.io.InputStream; 36b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 37b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancinipublic class MetadataReaderTest extends TestCase { 38b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 39b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini private InputStream mInputStream; 40b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini private Bundle mData; 41b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 42b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Before 43b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini protected void setUp() throws Exception { 44b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini mInputStream = getClass().getClassLoader().getResourceAsStream("res/drawable/image.jpg"); 45b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini mData = new Bundle(); 46b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 47b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 48b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @After 49b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini protected void tearDown() throws Exception { 50b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini IoUtils.closeQuietly(mInputStream); 51b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 52b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 53b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 54b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata() throws IOException { 55b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, mInputStream, "image/jpg", null); 56b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini Bundle exif = mData.getBundle(DocumentsContract.METADATA_EXIF); 57b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals("3036", String.valueOf(exif.getInt(ExifInterface.TAG_IMAGE_WIDTH))); 58b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals("4048", String.valueOf(exif.getInt(ExifInterface.TAG_IMAGE_LENGTH))); 59a83cc4582ff01f56eeb50664b51ab2aeb7bee45bJulian Mancini assertEquals("2017:07:26 21:06:25", exif.getString(ExifInterface.TAG_DATETIME)); 60a83cc4582ff01f56eeb50664b51ab2aeb7bee45bJulian Mancini assertEquals("33/1,59/1,4530/100", exif.getString(ExifInterface.TAG_GPS_LATITUDE)); 61a83cc4582ff01f56eeb50664b51ab2aeb7bee45bJulian Mancini assertEquals("N", exif.getString(ExifInterface.TAG_GPS_LATITUDE_REF)); 62a83cc4582ff01f56eeb50664b51ab2aeb7bee45bJulian Mancini assertEquals("118/1,28/1,3124/100", exif.getString(ExifInterface.TAG_GPS_LONGITUDE)); 63a83cc4582ff01f56eeb50664b51ab2aeb7bee45bJulian Mancini assertEquals("W", exif.getString(ExifInterface.TAG_GPS_LONGITUDE_REF)); 64b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals("Google", exif.getString(ExifInterface.TAG_MAKE)); 65b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals("Pixel", exif.getString(ExifInterface.TAG_MODEL)); 66b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(mData.getStringArray(DocumentsContract.METADATA_TYPES)[0], 67b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini DocumentsContract.METADATA_EXIF); 68b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 69b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 70b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 71b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_JpegOneTag() throws IOException { 72b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini String[] tags = {ExifInterface.TAG_MAKE}; 73b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, mInputStream, "image/jpg", tags); 74b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals("Google", 75b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini mData.getBundle(DocumentsContract.METADATA_EXIF).getString(tags[0])); 76b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 77b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 78b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 79b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_JpegNoResults() throws IOException { 80b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini String[] tags = {ExifInterface.TAG_SPECTRAL_SENSITIVITY}; 81b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(0, mData.size()); 82b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, mInputStream, "image/jpg", tags); 83b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(1, mData.size()); 84b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(mData.getStringArray(DocumentsContract.METADATA_TYPES).length, 0); 85b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 86b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 87b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 88b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_BadFile() { 89b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini try { 90b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini InputStream stream = new FileInputStream("badString"); 91b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, stream, "image/jpg", null); 92b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } catch (IOException e) { 93b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(FileNotFoundException.class, e.getClass()); 94b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 95b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 96b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 97b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 98b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_UnsupportedMimeType() throws IOException { 99b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, mInputStream, "no/metadata", null); 100b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(1, mData.size()); 101b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 102b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 103b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 104b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_NoTags() throws IOException { 105b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, mInputStream, "image/jpg", new String[0]); 106b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(1, mData.size()); 107b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 108b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 109b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini @Test 110b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini public void testGetMetadata_Png() throws IOException { 111b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini InputStream pngStream = getClass().getClassLoader().getResourceAsStream("res/drawable/png.png"); 112b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini MetadataReader.getMetadata(mData, pngStream, "image/png", null); 113b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini assertEquals(1, mData.size()); 114b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 115b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini } 116b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini 117b65051579fd9d0a625686ba41808e0092a0ee40eJulian Mancini} 118