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