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