AttachmentProviderTests.java revision a7bc0319a75184ad706bb35c049af107ac3688e6
1301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler/*
2301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * Copyright (C) 2009 The Android Open Source Project
3301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *
4301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
5301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * you may not use this file except in compliance with the License.
6301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * You may obtain a copy of the License at
7301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *
8301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
9301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *
10301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * Unless required by applicable law or agreed to in writing, software
11301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
12301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * See the License for the specific language governing permissions and
14301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * limitations under the License.
15301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler */
16301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
17301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerpackage com.android.email.provider;
18301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
19751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedyimport com.android.email.AttachmentInfo;
20301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport com.android.email.R;
212193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.MessagingException;
22a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
23a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Account;
24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Mailbox;
26a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
278a574694606f0e5d781334d0d426fc379c51f3edMarc Blankimport com.android.emailcommon.utility.AttachmentUtilities;
28301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
29301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.ContentResolver;
30301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.Context;
31301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.res.AssetFileDescriptor;
32301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.database.Cursor;
33301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.graphics.Bitmap;
34301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.graphics.BitmapFactory;
35301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.net.Uri;
36301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.test.ProviderTestCase2;
37301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.test.mock.MockContentResolver;
38301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
39301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.File;
40301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.FileNotFoundException;
41301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.FileOutputStream;
42301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.IOException;
43301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
44301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler/**
45301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * Tests of the Email Attachments provider.
461d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki *
47301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * You can run this entire test case with:
48301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *   runtest -c com.android.email.provider.AttachmentProviderTests email
49301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler */
50301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerpublic class AttachmentProviderTests extends ProviderTestCase2<AttachmentProvider> {
51301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
52301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    EmailProvider mEmailProvider;
53301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    Context mMockContext;
54301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    ContentResolver mMockResolver;
55301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
56301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public AttachmentProviderTests() {
578a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        super(AttachmentProvider.class, AttachmentUtilities.AUTHORITY);
58301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
59301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
60301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    @Override
61301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void setUp() throws Exception {
62301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        super.setUp();
63301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mMockContext = getMockContext();
64301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mMockResolver = mMockContext.getContentResolver();
65301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
66301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Spin up an Email provider as well and put it under the same mock test framework
67301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mEmailProvider = new EmailProvider();
68301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mEmailProvider.attachInfo(mMockContext, null);
69301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(mEmailProvider);
70301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        ((MockContentResolver) mMockResolver)
71301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                .addProvider(EmailProvider.EMAIL_AUTHORITY, mEmailProvider);
72301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
73301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
74301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
75301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test delete() - should do nothing
76301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test update() - should do nothing
77301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test insert() - should do nothing
78301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
79301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testUnimplemented() {
808a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(0, mMockResolver.delete(AttachmentUtilities.CONTENT_URI, null, null));
818a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(0, mMockResolver.update(AttachmentUtilities.CONTENT_URI, null, null,
828a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                null));
838a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(null, mMockResolver.insert(AttachmentUtilities.CONTENT_URI, null));
84301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
85301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
86301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
87301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test query()
88301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - item found
89301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - item not found
90301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - permuted projection
91301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
92301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testQuery() throws MessagingException {
93301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
94301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
95301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
96301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
97301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
98301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
99301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment3Id = 3;
100301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
101301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
102301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
103301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
104301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
1058a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachment1Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
1068a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id);
1078a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachment2Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
1088a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment2Id);
1098a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachment3Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
1108a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment3Id);
111301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
1127d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return null
1133d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Cursor c = mMockResolver.query(attachment1Uri, (String[])null, null, (String[])null, null);
1143d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        assertNull(c);
115301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
116301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add a couple of attachment entries.  Note, query() just uses the DB, and does not
117301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // sample the files, so we won't bother creating the files
118301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment1 = ProviderTestUtils.setupAttachment(message1Id, "file1", 100,
119301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
120301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment1.mContentUri =
1218a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            AttachmentUtilities.getAttachmentUri(account1.mId, attachment1Id).toString();
122301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment1);
123301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
124301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
125301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file2", 200,
126301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
127301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
1288a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id).toString();
129301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
130301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
131301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
132301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message1Id, "file3", 300,
133301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
134301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment3.mContentUri =
1358a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            AttachmentUtilities.getAttachmentUri(account1.mId, attachment3Id).toString();
136301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment3Id = addAttachmentToDb(account1, newAttachment3);
137301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 3, attachment3Id);
138301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
139301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Return a row with all columns specified
1408a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        attachment2Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id);
141301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        c = mMockResolver.query(
142301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                attachment2Uri,
1438a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                new String[] { AttachmentUtilities.Columns._ID,
1448a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns.DATA,
1458a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns.DISPLAY_NAME,
1468a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns.SIZE },
147301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                null, null, null);
148301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(1, c.getCount());
149301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertTrue(c.moveToFirst());
150301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment2Id, c.getLong(0));                  // id
151301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment2Uri.toString(), c.getString(1));    // content URI
152301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("file2", c.getString(2));                      // display name
153301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(200, c.getInt(3));                             // size
154301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
155301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Return a row with permuted columns
1568a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        attachment3Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment3Id);
157301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        c = mMockResolver.query(
158301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                attachment3Uri,
1598a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                new String[] { AttachmentUtilities.Columns.SIZE,
1608a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns.DISPLAY_NAME,
1618a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns.DATA,
1628a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                               AttachmentUtilities.Columns._ID },
163301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                null, null, null);
164301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(1, c.getCount());
165301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertTrue(c.moveToFirst());
166301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment3Id, c.getLong(3));                  // id
167301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment3Uri.toString(), c.getString(2));    // content URI
168301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("file3", c.getString(1));                      // display name
169301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(300, c.getInt(0));                             // size
170301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
171301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
172751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    private static Message createMessage(Context c, Mailbox b) {
17343a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        Message m = ProviderTestUtils.setupMessage("1", b.mAccountKey, b.mId, true, false, c, false,
174751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                false);
17543a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        m.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
17643a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        m.save(c);
17743a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        return m;
178751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    }
179751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
180751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    public void testInboxQuery() {
181751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create 2 accounts
182751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Account a1 = ProviderTestUtils.setupAccount("inboxquery-1", true, mMockContext);
183751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Account a2 = ProviderTestUtils.setupAccount("inboxquery-2", true, mMockContext);
184751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
185751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create mailboxes for each account
186751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b1 = ProviderTestUtils.setupMailbox(
187751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box1", a1.mId, true, mMockContext, Mailbox.TYPE_INBOX);
188751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b2 = ProviderTestUtils.setupMailbox(
189751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box2", a1.mId, true, mMockContext, Mailbox.TYPE_MAIL);
190751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b3 = ProviderTestUtils.setupMailbox(
191751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box3", a2.mId, true, mMockContext, Mailbox.TYPE_INBOX);
192751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b4 = ProviderTestUtils.setupMailbox(
193751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box4", a2.mId, true, mMockContext, Mailbox.TYPE_MAIL);
194751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox bt = ProviderTestUtils.setupMailbox(
195751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "boxT", a2.mId, true, mMockContext, Mailbox.TYPE_TRASH);
196751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
197751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create some messages
198751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b1 (account 1, inbox): 2 messages
199751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m11 = createMessage(mMockContext, b1);
200751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m12 = createMessage(mMockContext, b1);
201751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
202751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b2 (account 1, mail): 2 messages
203751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m21 = createMessage(mMockContext, b2);
204751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m22 = createMessage(mMockContext, b2);
205751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
206751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b3 (account 2, inbox): 1 message
207751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m31 = createMessage(mMockContext, b3);
208751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
209751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b4 (account 2, mail) has no messages.
210751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
211751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // bt (account 2, trash): 1 message
212751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message mt1 = createMessage(mMockContext, bt);
213751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
214751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 4 attachments in the inbox, 2 different messages, 1 downloaded
215751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m11.mId, null);
216751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m11.mId, null);
217751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m12.mId, null);
218751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m12.mId, "file:///path/to/file1");
219751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
220751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 3 attachments in generic mailbox, 2 different messages, 1 downloaded
221751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m21.mId, null);
222751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m21.mId, null);
223751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m22.mId, null);
224751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m22.mId, "file:///path/to/file2");
225751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
226751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 1 attachment in inbox
227751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, m31.mId, null);
228751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
229751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 2 attachments in trash, same message
230751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, mt1.mId, null);
231751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, mt1.mId, null);
232751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
233751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Cursor c = null;
234751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        try {
235751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            // count all attachments with an empty URI, regardless of mailbox location
236751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c = mMockContext.getContentResolver().query(
237751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    Attachment.CONTENT_URI, AttachmentInfo.PROJECTION,
238751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    EmailContent.Attachment.EMPTY_URI_SELECTION,
239751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    null, Attachment.RECORD_ID + " DESC");
240751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            assertEquals(9, c.getCount());
241751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        } finally {
242751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c.close();
243751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        }
244751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
245751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        try {
246751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            // count all attachments with an empty URI, only in an inbox
247751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c = mMockContext.getContentResolver().query(
248751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    Attachment.CONTENT_URI, AttachmentInfo.PROJECTION,
249751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    EmailContent.Attachment.EMPTY_URI_INBOX_SELECTION,
250751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    null, Attachment.RECORD_ID + " DESC");
251751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            assertEquals(4, c.getCount());
252751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        } finally {
253751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c.close();
254751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        }
255751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    }
256751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
257301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
258301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test getType()
259301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - regular file
260301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - thumbnail
261301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
262301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testGetType() throws MessagingException {
263301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("get-type", false, mMockContext);
264301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
265301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
266301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
267301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
268301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
269301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment3Id = 3;
27080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment4Id = 4;
27180ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment5Id = 5;
27280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment6Id = 6;
273301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
2748a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachment1Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
2758a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id);
276301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
2777d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return null
278301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        String type = mMockResolver.getType(attachment1Uri);
279301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(type);
280301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
281301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add a couple of attachment entries.  Note, getType() just uses the DB, and does not
282301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // sample the files, so we won't bother creating the files
283301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file2", 100,
284301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
285301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/jpg";
286301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
287301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
288301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message1Id, "file3", 100,
289301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
2903d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        newAttachment3.mMimeType = "text/plain";
2913d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        attachment3Id = addAttachmentToDb(account1, newAttachment3);
292301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
29380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment4 = ProviderTestUtils.setupAttachment(message1Id, "file4.doc", 100,
29480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
29580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment4.mMimeType = "application/octet-stream";
29680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment4Id = addAttachmentToDb(account1, newAttachment4);
29780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
29880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment5 = ProviderTestUtils.setupAttachment(message1Id, "file5.xyz", 100,
29980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
30080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment5.mMimeType = "application/octet-stream";
30180ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment5Id = addAttachmentToDb(account1, newAttachment5);
30280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
30380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment6 = ProviderTestUtils.setupAttachment(message1Id, "file6", 100,
30480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
30580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment6.mMimeType = "";
30680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment6Id = addAttachmentToDb(account1, newAttachment6);
30780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
308301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Check the returned filetypes
3098a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id);
310301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
311301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/jpg", type);
3128a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment3Id);
313301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
314301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("text/plain", type);
3158a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment4Id);
31680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
31780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/msword", type);
3188a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment5Id);
31980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
32080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/xyz", type);
3218a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment6Id);
32280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
32380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/octet-stream", type);
324301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
325301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Check the returned filetypes for the thumbnails
3268a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId, attachment2Id, 62,
3278a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                62);
328301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
329301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/png", type);
3308a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId, attachment3Id, 62,
3318a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                62);
332301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
333301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/png", type);
334301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
335301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
336301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
33780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     * Test static inferMimeType()
33880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     * From the method doc:
3398586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     *
3408586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * <pre>
3418586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     *                   |---------------------------------------------------------|
3428586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     *                   |                  E X T E N S I O N                      |
3438586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     *                   |---------------------------------------------------------|
3448586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     *                   | .eml        | known(.png) | unknown(.abc) | none        |
3458586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | M |-----------------------------------------------------------------------|
3468586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | I | none        | msg/rfc822  | image/png   | app/abc       | app/oct-str |
3478586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | M |-------------| (always     |             |               |             |
3488586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | E | app/oct-str |  overrides  |             |               |             |
3498586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | T |-------------|             |             |-----------------------------|
3508586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | Y | text/plain  |             |             | text/plain                  |
3518586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | P |-------------|             |-------------------------------------------|
3528586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * | E | any/type    |             | any/type                                  |
3538586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * |---|-----------------------------------------------------------------------|
3548586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy     * </pre>
3556833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki     *
3566833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki     * Also, all results should be in lowercase.
35780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     */
35880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    public void testInferMimeType() {
3596833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String DEFAULT_MIX = "Application/Octet-stream";
3606833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String DEFAULT_LOWER = DEFAULT_MIX.toLowerCase();
36134212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        final String TEXT_PLAIN = "text/plain";
3628586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        final String TYPE_IMG_PNG = "image/png";
3638586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        final String FILE_PNG = "myfile.false.pNg";
3646833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String FILE_ABC = "myfile.false.aBc";
36580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        final String FILE_NO_EXT = "myfile";
36680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
3678586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // .eml files always override mime type
3688a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("message/rfc822", AttachmentUtilities.inferMimeType("a.eml", null));
3698a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("message/rfc822", AttachmentUtilities.inferMimeType("a.eml", ""));
3708a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("message/rfc822",
3718a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType("a.eml", DEFAULT_LOWER));
3728a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("message/rfc822",
3738a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType("a.eMl", TEXT_PLAIN));
3748a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("message/rfc822",
3758a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType("a.eml", TYPE_IMG_PNG));
3768586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy
3778586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // Non-generic, non-empty mime type; return it
3788a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("mime/type", AttachmentUtilities.inferMimeType(FILE_PNG, "Mime/TyPe"));
3798a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("mime/type", AttachmentUtilities.inferMimeType(FILE_ABC, "Mime/TyPe"));
3808a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("mime/type",
3818a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType(FILE_NO_EXT, "Mime/TyPe"));
3828a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("mime/type", AttachmentUtilities.inferMimeType(null, "Mime/TyPe"));
3838a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("mime/type", AttachmentUtilities.inferMimeType("", "Mime/TyPe"));
38480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
3858586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // Recognizable file extension; return known type
3868a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, null));
3878a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, ""));
3888a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, DEFAULT_MIX));
3898a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("image/png", AttachmentUtilities.inferMimeType(FILE_PNG, TEXT_PLAIN));
39080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
3918586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // Unrecognized and non-empty file extension, non-"text/plain" type; generate mime type
3928a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("application/abc", AttachmentUtilities.inferMimeType(FILE_ABC, null));
3938a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("application/abc", AttachmentUtilities.inferMimeType(FILE_ABC, ""));
3948a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("application/abc",
3958a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType(FILE_ABC, DEFAULT_MIX));
39680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
3978586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // Unrecognized and empty file extension, non-"text/plain" type; return "app/octet-stream"
3988a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(FILE_NO_EXT, null));
3998a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(FILE_NO_EXT, ""));
4008a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(DEFAULT_LOWER,
4018a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType(FILE_NO_EXT, DEFAULT_MIX));
4028a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType(null, null));
4038a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(DEFAULT_LOWER, AttachmentUtilities.inferMimeType("", ""));
4041d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
4058586532f3ecb4dad4f25d82ad7d6ce345ced9bf1Todd Kennedy        // Unrecognized or empty file extension, "text/plain" type; return "text/plain"
4068a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType(FILE_ABC, TEXT_PLAIN));
4078a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(TEXT_PLAIN,
4088a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.inferMimeType(FILE_NO_EXT, TEXT_PLAIN));
4098a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType(null, TEXT_PLAIN));
4108a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals(TEXT_PLAIN, AttachmentUtilities.inferMimeType("", TEXT_PLAIN));
41180ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    }
41280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
41380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    /**
41486753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler     * Text extension extractor
41586753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler     */
41686753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    public void testGetFilenameExtension() {
41786753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_NO_EXTENSION = "myfile";
41886753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_EXTENSION = "myfile.pDf";
41986753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_TWO_EXTENSIONS = "myfile.false.AbC";
42086753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
4218a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertNull(AttachmentUtilities.getFilenameExtension(null));
4228a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertNull(AttachmentUtilities.getFilenameExtension(""));
4238a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertNull(AttachmentUtilities.getFilenameExtension(FILE_NO_EXTENSION));
42486753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
4258a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("pdf", AttachmentUtilities.getFilenameExtension(FILE_EXTENSION));
4268a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        assertEquals("abc", AttachmentUtilities.getFilenameExtension(FILE_TWO_EXTENSIONS));
42786753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
42886753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        // The API makes no claim as to how these are handled (it probably should),
42986753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        // but make sure that they don't crash.
4308a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.getFilenameExtension("filename.");
4318a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.getFilenameExtension(".extension");
43286753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    }
43386753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
43486753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    /**
435301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
436301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - regular file
437301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - TODO: variations on the content URI
438301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
439301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenFile() throws MessagingException, IOException {
440301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-file", false, mMockContext);
441301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
442301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
443301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
444301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
445301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
446301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
447301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
448301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
449301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
450301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
4518a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri file1Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment1Id);
4528a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri file2Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id);
453301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
4547d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found
455301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        AssetFileDescriptor afd;
456301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
457301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
458301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment entry");
459301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
460301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
461301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
462301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
463301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
464301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
465301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
466301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
467301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
468301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
469301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
470301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
471301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
472301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment file");
473301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
474301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
475301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
476301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
477301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
478301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
479301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
480301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
481301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
482301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
4838a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id)
4848a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                .toString();
485301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
486301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
487301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
488301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
489301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a file
490301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(file2Uri, "r");
491301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
492301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
493301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
494301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
495301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
496301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
497301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
498301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - thumbnail
499301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @throws IOException
500301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *
501301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * TODO:  The thumbnail mode returns null for its failure cases (and in one case, throws
502301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * an SQLiteException).  The ContentResolver contract requires throwing FileNotFoundException
503301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * in all of the non-success cases, and the provider should be fixed for consistency.
504301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
505301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenThumbnail() throws MessagingException, IOException {
506301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-thumbnail", false, mMockContext);
507301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
508301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
509301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
510301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
511301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
512301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
513301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
514301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
515301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
516301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
5178a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri thumb1Uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId,
5188a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id, 62, 62);
5198a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri thumb2Uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId,
5208a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment2Id, 62, 62);
521301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
522301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, but no attachment found
5237d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        AssetFileDescriptor afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
524301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
525301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
526301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
527301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
528301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
529301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
530301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
531301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
532301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
533301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
534301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
535301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
536301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
537301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
538301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
539301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
540301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
541301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
5428a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id)
5438a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                .toString();
544301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
545301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
546301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
547301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
548301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a thumbnail
549301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb2Uri, "r");
550301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
551301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
552301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
553301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
554301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5559ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    private Uri createAttachment(Account account, long messageId, String contentUriStr) {
5569ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Add an attachment entry.
5579ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        Attachment newAttachment = ProviderTestUtils.setupAttachment(messageId, "file", 100,
5589ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda                false, mMockContext);
5599ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        newAttachment.mContentUri = contentUriStr;
5609ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        long attachmentId = addAttachmentToDb(account, newAttachment);
5618a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachmentUri = AttachmentUtilities.getAttachmentUri(account.mId, attachmentId);
5629ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        return attachmentUri;
5639ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    }
5649ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda
565301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
566301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test resolveAttachmentIdToContentUri()
5679ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - without DB
568301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - not in DB
5699ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with not-null contentUri
5709ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with null contentUri
571301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
572301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testResolveAttachmentIdToContentUri() throws MessagingException {
573301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
574301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
575301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
576301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
5779ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We use attachmentId == 1 but any other id would do
5789ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        final long attachment1Id = 1;
5798a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        final Uri attachment1Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
5808a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id);
581301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5827d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return input
5839ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We know that the attachmentId 1 does not exist because there are no attachments
5849ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // created at this point
5858a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri result = AttachmentUtilities.resolveAttachmentIdToContentUri(
586301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                mMockResolver, attachment1Uri);
587301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment1Uri, result);
588301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5899ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri != null
5909ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Note, resolveAttachmentIdToContentUri() just uses
591301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // the DB, and does not sample the files, so we won't bother creating the files
5929ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
5939ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, "file:///path/to/file");
5948a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            Uri contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
5958a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                    mMockResolver, attachmentUri);
5969ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When the attachment is found, return the stored content_uri value
5979ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals("file:///path/to/file", contentUri.toString());
5989ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
599301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
6009ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri == null
6019ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
6029ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, null);
6038a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            Uri contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
6048a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                    mMockResolver, attachmentUri);
6059ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When contentUri is null should return input
6069ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals(attachmentUri, contentUri);
6079ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
608301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
609301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
610301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
6114b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     * Test the functionality of deleting all attachment files for a given message.
6124b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     */
6134b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    public void testDeleteFiles() throws IOException {
6144b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
6154b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
6164b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.save(mMockContext);
6174b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message1Id = 1;      // 1 attachment, 1 file
6184b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message2Id = 2;      // 2 attachments, 2 files
6194b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message3Id = 3;      // 1 attachment, missing file
6204b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message4Id = 4;      // no attachments
6214b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6224b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Add attachment entries for various test messages
6234b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment1 = ProviderTestUtils.setupAttachment(message1Id, "file1", 100,
6244b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
6254b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message2Id, "file2", 200,
6264b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
6274b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message2Id, "file3", 100,
6284b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
6294b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment4 = ProviderTestUtils.setupAttachment(message3Id, "file4", 100,
6304b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
6314b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6324b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Create test files
6334b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment1.mId);
6344b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment2.mId);
6354b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment3.mId);
6364b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6374b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Confirm 3 attachment files found
6388a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File attachmentsDir = AttachmentUtilities.getAttachmentDirectory(mMockContext,
6398a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
6404b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6414b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6424b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Command deletion of some files and check for results
6431d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
6444b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 4 has no attachments so no files should be deleted
6458a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
6468a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message4Id);
6474b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6484b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6494b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 3 has no attachment files so no files should be deleted
6508a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
6518a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message3Id);
6524b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6534b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6544b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 2 has 2 attachment files so this should delete 2 files
6558a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
6568a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message2Id);
6574b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
6584b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6594b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 1 has 1 attachment file so this should delete the last file
6608a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
6618a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message1Id);
6624b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
6634b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    }
6644b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6654b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    /**
66671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     * Test the functionality of deleting an entire mailbox's attachments.
66771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     */
66871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    public void testDeleteMailbox() throws IOException {
66971754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-mbox-del", false, mMockContext);
67071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.mCompatibilityUuid = "test-UUID";
67171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.save(mMockContext);
67271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long account1Id = account1.mId;
67371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
67471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox1Id = mailbox1.mId;
67571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
67671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox2Id = mailbox2.mId;
6771d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
678e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
679e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
680e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
68171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
68271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Confirm four attachment files found
6838a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File attachmentsDir = AttachmentUtilities.getAttachmentDirectory(mMockContext,
6848a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
68571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(4, attachmentsDir.listFiles().length);
68671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
68771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 1 - we should lose 3 attachment files
6888a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllMailboxAttachmentFiles(mMockContext, account1Id,
6898a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                mailbox1Id);
69071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
69171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
69271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 2 - we should lose 1 attachment file
6938a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllMailboxAttachmentFiles(mMockContext, account1Id,
6948a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                mailbox2Id);
69571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
69671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    }
6971d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
698e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
699e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Test the functionality of deleting an entire account's attachments.
700e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
701e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testDeleteAccount() throws IOException {
702e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-acct-del1", false, mMockContext);
703e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.mCompatibilityUuid = "test-UUID";
704e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.save(mMockContext);
705e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
706e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
707e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox1Id = mailbox1.mId;
708e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
709e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox2Id = mailbox2.mId;
710e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
711e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Repeat for account #2
712e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account2 = ProviderTestUtils.setupAccount("attach-acct-del2", false, mMockContext);
713e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.mCompatibilityUuid = "test-UUID-2";
714e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.save(mMockContext);
715e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
716e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox3 = ProviderTestUtils.setupMailbox("mbox3", account2Id, true, mMockContext);
717e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox3Id = mailbox3.mId;
718e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox4 = ProviderTestUtils.setupMailbox("mbox4", account2Id, true, mMockContext);
719e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox4Id = mailbox4.mId;
720e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
721e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
722e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
723e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
724e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox3Id, 5);
725e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox4Id, 2);
726e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
727e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm eleven attachment files found
7288a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File directory1 = AttachmentUtilities.getAttachmentDirectory(mMockContext,
7298a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
730e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(4, directory1.listFiles().length);
7318a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File directory2 = AttachmentUtilities.getAttachmentDirectory(mMockContext,
7328a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account2.mId);
733e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
734e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
735e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 1 - we should lose 4 attachment files
7368a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAccountAttachmentFiles(mMockContext, account1Id);
737e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
738e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
739e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
740e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 2 - we should lose 7 attachment file
7418a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAccountAttachmentFiles(mMockContext, account2Id);
742e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
743e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory2.listFiles().length);
744e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
745e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
746e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
747e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Create a set of attachments for a given test account and mailbox.  Creates the following:
748e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Two messages per mailbox, one w/attachments, one w/o attachments
749e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Any number of attachments (on the first message)
750e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param account the account to populate
751e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param mailboxId the mailbox to populate
752e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param numAttachments how many attachments to create
753e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
754e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    private void populateAccountMailbox(Account account, long mailboxId, int numAttachments)
755e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            throws IOException {
756e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long accountId = account.mId;
757e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
758e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // two messages per mailbox, one w/attachments, one w/o attachments
759e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message1a = ProviderTestUtils.setupMessage(
760e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1a", accountId, mailboxId, false, true, mMockContext);
761e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        /* Message message1b = */ ProviderTestUtils.setupMessage(
762e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1b", accountId, mailboxId, false, true, mMockContext);
763e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
764e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Create attachment records & files
765e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        for (int count = 0; count < numAttachments; count++) {
766e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            Attachment newAttachment = ProviderTestUtils.setupAttachment(message1a.mId,
767e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                    "file" + count, 100 * count, true, mMockContext);
768e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            createAttachmentFile(account, newAttachment.mId);
769e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        }
770e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
77171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
77271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    /**
773301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Create an attachment by copying an image resource into a file.  Uses "real" resources
774301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * to get a real image from Email
775301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
776301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private String createAttachmentFile(Account forAccount, long id) throws IOException {
777301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        File outFile = getAttachmentFile(forAccount, id);
778301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),
77964ac7a6cc81ef6dc84354153b978bd5db944e8b0Todd Kennedy                R.drawable.ic_attachment_holo_light);
780301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        FileOutputStream out = new FileOutputStream(outFile);
781301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
782301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        out.close();
783301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
784301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        return outFile.getAbsolutePath();
785301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
786301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
787301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
788301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Record an attachment in the attachments database
789301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @return the id of the attachment just created
790301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
791301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private long addAttachmentToDb(Account forAccount, Attachment newAttachment) {
7927d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        newAttachment.save(mMockContext);
7937d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return newAttachment.mId;
794301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
795301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
796301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
797301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Map from account, attachment ID to attachment file
798301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
799301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private File getAttachmentFile(Account forAccount, long id) {
800301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        String idString = Long.toString(id);
8017d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        File attachmentsDir = mMockContext.getDatabasePath(forAccount.mId + ".db_att");
8027d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        if (!attachmentsDir.exists()) {
8037d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler            attachmentsDir.mkdirs();
804301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
8057d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return new File(attachmentsDir, idString);
806301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
807301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler}
808