192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki/* 292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Copyright (C) 2011 The Android Open Source Project 392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * 492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * you may not use this file except in compliance with the License. 692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * You may obtain a copy of the License at 792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * 892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * 1092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Unless required by applicable law or agreed to in writing, software 1192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 1292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * See the License for the specific language governing permissions and 1492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * limitations under the License. 1592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki */ 1692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 1792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukipackage com.android.emailcommon.utility; 1892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 1992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukiimport com.android.emailcommon.provider.EmailContent; 2092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 2192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukiimport android.net.Uri; 2292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukiimport android.test.AndroidTestCase; 2392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 2492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukiimport java.io.File; 2592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 2692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onukipublic class AttachmentUtilitiesTests extends AndroidTestCase { 2792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki /** 2892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Test static inferMimeType() 2992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * From the method doc: 3092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * 3192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * <pre> 3292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * |---------------------------------------------------------| 3392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | E X T E N S I O N | 3492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * |---------------------------------------------------------| 3592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | .eml | known(.png) | unknown(.abc) | none | 3692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | M |-----------------------------------------------------------------------| 3792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | I | none | msg/rfc822 | image/png | app/abc | app/oct-str | 3892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | M |-------------| (always | | | | 3992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | E | app/oct-str | overrides | | | | 4092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | T |-------------| | |-----------------------------| 4192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | Y | text/plain | | | text/plain | 4292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | P |-------------| |-------------------------------------------| 4392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * | E | any/type | | any/type | 4492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * |---|-----------------------------------------------------------------------| 4592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * </pre> 4692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * 4792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Also, all results should be in lowercase. 4892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki */ 4992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki public void testInferMimeType() { 5092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String DEFAULT_MIX = "Application/Octet-stream"; 5192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String DEFAULT_LOWER = DEFAULT_MIX.toLowerCase(); 5292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String TEXT_PLAIN = "text/plain"; 5392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String TYPE_IMG_PNG = "image/png"; 5492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_PNG = "myfile.false.pNg"; 5592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_ABC = "myfile.false.aBc"; 5692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_NO_EXT = "myfile"; 5792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 5892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // .eml files always override mime type 5992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("message/rfc822", AttachmentUtilities.inferMimeType("a.eml", null)); 6092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("message/rfc822", AttachmentUtilities.inferMimeType("a.eml", "")); 6192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("message/rfc822", 6292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType("a.eml", DEFAULT_LOWER)); 6392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("message/rfc822", 6492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType("a.eMl", TEXT_PLAIN)); 6592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("message/rfc822", 6692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType("a.eml", TYPE_IMG_PNG)); 6792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 6892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Non-generic, non-empty mime type; return it 6992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("mime/type", AttachmentUtilities.inferMimeType(FILE_PNG, "Mime/TyPe")); 7092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("mime/type", AttachmentUtilities.inferMimeType(FILE_ABC, "Mime/TyPe")); 7192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("mime/type", 7292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType(FILE_NO_EXT, "Mime/TyPe")); 7392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("mime/type", AttachmentUtilities.inferMimeType(null, "Mime/TyPe")); 7492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("mime/type", AttachmentUtilities.inferMimeType("", "Mime/TyPe")); 7592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 7692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Recognizable file extension; return known type 7792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, null)); 7892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, "")); 7992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, DEFAULT_MIX)); 8092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, TEXT_PLAIN)); 8192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 8292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Unrecognized and non-empty file extension, non-"text/plain" type; generate mime type 8392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("application/abc", AttachmentUtilities.inferMimeType(FILE_ABC, null)); 8492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("application/abc", AttachmentUtilities.inferMimeType(FILE_ABC, "")); 8592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("application/abc", 8692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType(FILE_ABC, DEFAULT_MIX)); 8792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 8892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Unrecognized and empty file extension, non-"text/plain" type; return "app/octet-stream" 8992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(FILE_NO_EXT, null)); 9092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(FILE_NO_EXT, "")); 9192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(DEFAULT_LOWER, 9292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType(FILE_NO_EXT, DEFAULT_MIX)); 9392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(null, null)); 9492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType("", "")); 9592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 9692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Unrecognized or empty file extension, "text/plain" type; return "text/plain" 9792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType(FILE_ABC, TEXT_PLAIN)); 9892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(TEXT_PLAIN, 9992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.inferMimeType(FILE_NO_EXT, TEXT_PLAIN)); 10092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType(null, TEXT_PLAIN)); 10192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType("", TEXT_PLAIN)); 10292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki } 10392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 10492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki public void testInferMimeTypeForUri() { 10592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki String type; 10692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Test for content URI 10792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki type = AttachmentUtilities.inferMimeTypeForUri(getContext(), EmailContent.Body.CONTENT_URI); 10892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("vnd.android.cursor.dir/email-body", type); 10992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 11092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // Test for file URI 11192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki type = AttachmentUtilities.inferMimeTypeForUri(getContext(), 11292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki Uri.fromFile(new File("a.png"))); 11392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", type); 11492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 11592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki type = AttachmentUtilities.inferMimeTypeForUri(getContext(), 11692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki Uri.fromFile(new File("/a/b/c/d.png"))); 11792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("image/png", type); 11892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki } 11992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 12092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki /** 12192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki * Text extension extractor 12292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki */ 12392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki public void testGetFilenameExtension() { 12492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_NO_EXTENSION = "myfile"; 12592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_EXTENSION = "myfile.pDf"; 12692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki final String FILE_TWO_EXTENSIONS = "myfile.false.AbC"; 12792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 12892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertNull(AttachmentUtilities.getFilenameExtension(null)); 12992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertNull(AttachmentUtilities.getFilenameExtension("")); 13092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertNull(AttachmentUtilities.getFilenameExtension(FILE_NO_EXTENSION)); 13192cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 13292cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("pdf", AttachmentUtilities.getFilenameExtension(FILE_EXTENSION)); 13392cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki assertEquals("abc", AttachmentUtilities.getFilenameExtension(FILE_TWO_EXTENSIONS)); 13492cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki 13592cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // The API makes no claim as to how these are handled (it probably should), 13692cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki // but make sure that they don't crash. 13792cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.getFilenameExtension("filename."); 13892cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki AttachmentUtilities.getFilenameExtension(".extension"); 13992cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki } 14092cbc9369ba7dc80ebd7190bf99b99e9c43b8f66Makoto Onuki} 141