1c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler/******************************************************************************* 2c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * Copyright (C) 2014 Google Inc. 3c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * Licensed to The Android Open Source Project. 4c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * 5c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 6c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * you may not use this file except in compliance with the License. 7c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * You may obtain a copy of the License at 8c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * 9c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 10c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * 11c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * Unless required by applicable law or agreed to in writing, software 12c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 13c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * See the License for the specific language governing permissions and 15c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler * limitations under the License. 16c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler *******************************************************************************/ 17c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 18c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerpackage com.android.mail.browse; 19c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 20c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.content.ContentValues; 21c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.content.Context; 22c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.content.ContextWrapper; 23c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.net.Uri; 24c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.os.ParcelFileDescriptor; 25c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.provider.OpenableColumns; 26c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.test.IsolatedContext; 27c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.test.LoaderTestCase; 28c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.test.mock.MockContentResolver; 29c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport android.test.suitebuilder.annotation.SmallTest; 30c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 31c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport java.io.FileNotFoundException; 32c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport java.io.IOException; 33c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport java.io.OutputStream; 34c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerimport java.util.HashMap; 35c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 36c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantlerpublic class EmlMessageLoaderTest extends LoaderTestCase { 37c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler private TestEmlProvider mTestProvider; 38c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 39c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler @Override 40c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler protected void setUp() throws Exception { 41c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler super.setUp(); 42c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler MockContentResolver resolver = new MockContentResolver(); 43c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler IsolatedContext context = new IsolatedContext(resolver, getContext()); 44c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler Context wrappedContext = new ContextWrapper(context) { 45c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler @Override 46c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public Context getApplicationContext() { 47c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler return this; 48c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 49c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler }; 50c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler setContext(wrappedContext); 51c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler mTestProvider = new TestEmlProvider(wrappedContext); 52c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler resolver.addProvider(TestEmlProvider.AUTHORITY, mTestProvider); 53c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 54c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 55c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler @SmallTest 56c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public void testLoadingBlankEml() throws Exception { 57b96eb04b2a8ff4b7d47b09b4b2b5493c032e4d36Tomasz Mikolajewski final Uri emptyEmlUri = new Uri.Builder().scheme("content").authority( 58b96eb04b2a8ff4b7d47b09b4b2b5493c032e4d36Tomasz Mikolajewski TestProvider.AUTHORITY).path("empty").build(); 59c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler final ContentValues cv = new ContentValues(2); 60c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler cv.put(OpenableColumns.DISPLAY_NAME, "Empty.eml"); 61c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler cv.put(OpenableColumns.SIZE, 0); 62c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler mTestProvider.insert(emptyEmlUri, cv); 63c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler final OutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream( 64c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler mTestProvider.makePipeForUri(emptyEmlUri)); 65c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler out.write(0); 66c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler out.close(); 67c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 68c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler EmlMessageLoader loader = new EmlMessageLoader(getContext(), emptyEmlUri); 69c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 70c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler getLoaderResultSynchronously(loader); 71c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler // If we don't crash, the test passed. 72c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 73c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 74c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public static class TestEmlProvider extends TestProvider { 75c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler private final HashMap<Uri, ParcelFileDescriptor> mFileMap = 76c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler new HashMap<Uri, ParcelFileDescriptor>(); 77c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 78c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public TestEmlProvider(Context context) { 79c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler super(context); 80c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 81c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 82c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public ParcelFileDescriptor makePipeForUri(Uri uri) throws IOException { 83c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler ParcelFileDescriptor[] descriptors = ParcelFileDescriptor.createPipe(); 84c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler mFileMap.put(uri, descriptors[0]); 85c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler return descriptors[1]; 86c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 87c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler 88c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler @Override 89c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 90c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler final ParcelFileDescriptor descriptor = mFileMap.get(uri); 91c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler if (descriptor != null) { 92c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler return descriptor; 93c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 94c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler return super.openFile(uri, mode); 95c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 96c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler } 97c4eeaf41cb2fba309a50796c83b5dfa19d9e6334Tony Mantler} 98