AttachmentProviderTests.java revision 43a85091e90bb7598bdc2bdb6874b9ea7b2bd11b
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;
21301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport com.android.email.mail.MessagingException;
22301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport com.android.email.provider.AttachmentProvider.AttachmentProviderColumns;
23301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport com.android.email.provider.EmailContent.Account;
24301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport com.android.email.provider.EmailContent.Attachment;
2571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadlerimport com.android.email.provider.EmailContent.Mailbox;
2671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadlerimport com.android.email.provider.EmailContent.Message;
27301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
28301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.ContentResolver;
29301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.Context;
30301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.content.res.AssetFileDescriptor;
31301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.database.Cursor;
32301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.graphics.Bitmap;
33301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.graphics.BitmapFactory;
34301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.net.Uri;
35301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.test.ProviderTestCase2;
36301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport android.test.mock.MockContentResolver;
37301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
38301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.File;
39301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.FileNotFoundException;
40301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.FileOutputStream;
41301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerimport java.io.IOException;
42301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
43301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler/**
44301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * Tests of the Email Attachments provider.
451d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki *
46301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler * You can run this entire test case with:
47301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler *   runtest -c com.android.email.provider.AttachmentProviderTests email
48301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler */
49301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadlerpublic class AttachmentProviderTests extends ProviderTestCase2<AttachmentProvider> {
50301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
51301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    EmailProvider mEmailProvider;
52301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    Context mMockContext;
53301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    ContentResolver mMockResolver;
54301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
55301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public AttachmentProviderTests() {
56301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        super(AttachmentProvider.class, AttachmentProvider.AUTHORITY);
57301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
58301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
59301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    @Override
60301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void setUp() throws Exception {
61301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        super.setUp();
62301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mMockContext = getMockContext();
63301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mMockResolver = mMockContext.getContentResolver();
64301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
65301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Spin up an Email provider as well and put it under the same mock test framework
66301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mEmailProvider = new EmailProvider();
67301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        mEmailProvider.attachInfo(mMockContext, null);
68301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(mEmailProvider);
69301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        ((MockContentResolver) mMockResolver)
70301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                .addProvider(EmailProvider.EMAIL_AUTHORITY, mEmailProvider);
71301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
72301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
73301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
74301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test delete() - should do nothing
75301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test update() - should do nothing
76301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test insert() - should do nothing
77301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
78301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testUnimplemented() {
79301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(0, mMockResolver.delete(AttachmentProvider.CONTENT_URI, null, null));
80301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(0, mMockResolver.update(AttachmentProvider.CONTENT_URI, null, null, null));
81301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(null, mMockResolver.insert(AttachmentProvider.CONTENT_URI, null));
82301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
83301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
84301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
85301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test query()
86301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - item found
87301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - item not found
88301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - permuted projection
89301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
90301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testQuery() throws MessagingException {
91301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
92301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
93301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
94301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
95301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
96301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
97301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment3Id = 3;
98301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
99301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
100301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
101301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
102301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
1033d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri attachment1Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment1Id);
1043d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri attachment2Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id);
1053d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri attachment3Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment3Id);
106301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
1077d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return null
1083d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Cursor c = mMockResolver.query(attachment1Uri, (String[])null, null, (String[])null, null);
1093d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        assertNull(c);
110301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
111301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add a couple of attachment entries.  Note, query() just uses the DB, and does not
112301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // sample the files, so we won't bother creating the files
113301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment1 = ProviderTestUtils.setupAttachment(message1Id, "file1", 100,
114301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
115301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment1.mContentUri =
1163d25a519abf676f050b546d34401a277aea5de40Andrew Stadler            AttachmentProvider.getAttachmentUri(account1.mId, attachment1Id).toString();
117301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment1);
118301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
119301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
120301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file2", 200,
121301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
122301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
1233d25a519abf676f050b546d34401a277aea5de40Andrew Stadler            AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id).toString();
124301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
125301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
126301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
127301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message1Id, "file3", 300,
128301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
129301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment3.mContentUri =
1303d25a519abf676f050b546d34401a277aea5de40Andrew Stadler            AttachmentProvider.getAttachmentUri(account1.mId, attachment3Id).toString();
131301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment3Id = addAttachmentToDb(account1, newAttachment3);
132301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 3, attachment3Id);
133301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
134301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Return a row with all columns specified
1353d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        attachment2Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id);
136301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        c = mMockResolver.query(
137301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                attachment2Uri,
138301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                new String[] { AttachmentProviderColumns._ID, AttachmentProviderColumns.DATA,
139301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                               AttachmentProviderColumns.DISPLAY_NAME,
140301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                               AttachmentProviderColumns.SIZE },
141301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                null, null, null);
142301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(1, c.getCount());
143301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertTrue(c.moveToFirst());
144301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment2Id, c.getLong(0));                  // id
145301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment2Uri.toString(), c.getString(1));    // content URI
146301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("file2", c.getString(2));                      // display name
147301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(200, c.getInt(3));                             // size
148301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
149301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Return a row with permuted columns
1503d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        attachment3Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment3Id);
151301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        c = mMockResolver.query(
152301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                attachment3Uri,
153301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                new String[] { AttachmentProviderColumns.SIZE,
154301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                               AttachmentProviderColumns.DISPLAY_NAME,
155301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                               AttachmentProviderColumns.DATA, AttachmentProviderColumns._ID },
156301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                null, null, null);
157301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(1, c.getCount());
158301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertTrue(c.moveToFirst());
159301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment3Id, c.getLong(3));                  // id
160301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment3Uri.toString(), c.getString(2));    // content URI
161301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("file3", c.getString(1));                      // display name
162301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(300, c.getInt(0));                             // size
163301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
164301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
165751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    private static Message createMessage(Context c, Mailbox b) {
16643a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        Message m = ProviderTestUtils.setupMessage("1", b.mAccountKey, b.mId, true, false, c, false,
167751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                false);
16843a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        m.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
16943a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        m.save(c);
17043a85091e90bb7598bdc2bdb6874b9ea7b2bd11bTodd Kennedy        return m;
171751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    }
172751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
173751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    public void testInboxQuery() {
174751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create 2 accounts
175751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Account a1 = ProviderTestUtils.setupAccount("inboxquery-1", true, mMockContext);
176751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Account a2 = ProviderTestUtils.setupAccount("inboxquery-2", true, mMockContext);
177751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
178751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create mailboxes for each account
179751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b1 = ProviderTestUtils.setupMailbox(
180751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box1", a1.mId, true, mMockContext, Mailbox.TYPE_INBOX);
181751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b2 = ProviderTestUtils.setupMailbox(
182751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box2", a1.mId, true, mMockContext, Mailbox.TYPE_MAIL);
183751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b3 = ProviderTestUtils.setupMailbox(
184751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box3", a2.mId, true, mMockContext, Mailbox.TYPE_INBOX);
185751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox b4 = ProviderTestUtils.setupMailbox(
186751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "box4", a2.mId, true, mMockContext, Mailbox.TYPE_MAIL);
187751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Mailbox bt = ProviderTestUtils.setupMailbox(
188751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                "boxT", a2.mId, true, mMockContext, Mailbox.TYPE_TRASH);
189751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
190751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // Create some messages
191751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b1 (account 1, inbox): 2 messages
192751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m11 = createMessage(mMockContext, b1);
193751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m12 = createMessage(mMockContext, b1);
194751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
195751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b2 (account 1, mail): 2 messages
196751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m21 = createMessage(mMockContext, b2);
197751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m22 = createMessage(mMockContext, b2);
198751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
199751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b3 (account 2, inbox): 1 message
200751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message m31 = createMessage(mMockContext, b3);
201751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
202751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // b4 (account 2, mail) has no messages.
203751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
204751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // bt (account 2, trash): 1 message
205751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Message mt1 = createMessage(mMockContext, bt);
206751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
207751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 4 attachments in the inbox, 2 different messages, 1 downloaded
208751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m11.mId, null);
209751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m11.mId, null);
210751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m12.mId, null);
211751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m12.mId, "file:///path/to/file1");
212751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
213751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 3 attachments in generic mailbox, 2 different messages, 1 downloaded
214751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m21.mId, null);
215751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m21.mId, null);
216751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m22.mId, null);
217751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a1, m22.mId, "file:///path/to/file2");
218751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
219751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 1 attachment in inbox
220751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, m31.mId, null);
221751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
222751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        // 2 attachments in trash, same message
223751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, mt1.mId, null);
224751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        createAttachment(a2, mt1.mId, null);
225751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
226751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        Cursor c = null;
227751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        try {
228751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            // count all attachments with an empty URI, regardless of mailbox location
229751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c = mMockContext.getContentResolver().query(
230751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    Attachment.CONTENT_URI, AttachmentInfo.PROJECTION,
231751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    EmailContent.Attachment.EMPTY_URI_SELECTION,
232751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    null, Attachment.RECORD_ID + " DESC");
233751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            assertEquals(9, c.getCount());
234751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        } finally {
235751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c.close();
236751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        }
237751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
238751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        try {
239751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            // count all attachments with an empty URI, only in an inbox
240751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c = mMockContext.getContentResolver().query(
241751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    Attachment.CONTENT_URI, AttachmentInfo.PROJECTION,
242751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    EmailContent.Attachment.EMPTY_URI_INBOX_SELECTION,
243751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy                    null, Attachment.RECORD_ID + " DESC");
244751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            assertEquals(4, c.getCount());
245751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        } finally {
246751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy            c.close();
247751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy        }
248751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy    }
249751e4b2d9509b63bcdd3c8780afa82b67b99d7d4Todd Kennedy
250301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
251301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test getType()
252301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - regular file
253301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - thumbnail
254301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
255301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testGetType() throws MessagingException {
256301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("get-type", false, mMockContext);
257301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
258301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
259301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
260301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
261301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
262301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment3Id = 3;
26380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment4Id = 4;
26480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment5Id = 5;
26580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        long attachment6Id = 6;
266301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
2673d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri attachment1Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment1Id);
268301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
2697d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return null
270301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        String type = mMockResolver.getType(attachment1Uri);
271301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(type);
272301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
273301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add a couple of attachment entries.  Note, getType() just uses the DB, and does not
274301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // sample the files, so we won't bother creating the files
275301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file2", 100,
276301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
277301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/jpg";
278301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
279301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
280301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message1Id, "file3", 100,
281301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
2823d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        newAttachment3.mMimeType = "text/plain";
2833d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        attachment3Id = addAttachmentToDb(account1, newAttachment3);
284301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
28580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment4 = ProviderTestUtils.setupAttachment(message1Id, "file4.doc", 100,
28680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
28780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment4.mMimeType = "application/octet-stream";
28880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment4Id = addAttachmentToDb(account1, newAttachment4);
28980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
29080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment5 = ProviderTestUtils.setupAttachment(message1Id, "file5.xyz", 100,
29180ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
29280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment5.mMimeType = "application/octet-stream";
29380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment5Id = addAttachmentToDb(account1, newAttachment5);
29480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
29580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        Attachment newAttachment6 = ProviderTestUtils.setupAttachment(message1Id, "file6", 100,
29680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler                false, mMockContext);
29780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        newAttachment6.mMimeType = "";
29880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        attachment6Id = addAttachmentToDb(account1, newAttachment6);
29980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
300301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Check the returned filetypes
3013d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id);
302301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
303301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/jpg", type);
3043d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment3Id);
305301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
306301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("text/plain", type);
30780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment4Id);
30880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
30980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/msword", type);
31080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment5Id);
31180ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
31280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/xyz", type);
31380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment6Id);
31480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        type = mMockResolver.getType(uri);
31580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/octet-stream", type);
316301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
317301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Check the returned filetypes for the thumbnails
318a98de7e55e91229c35352b496fad3fbb108a9609Andrew Stadler        uri = AttachmentProvider.getAttachmentThumbnailUri(account1.mId, attachment2Id, 62, 62);
319301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
320301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/png", type);
321a98de7e55e91229c35352b496fad3fbb108a9609Andrew Stadler        uri = AttachmentProvider.getAttachmentThumbnailUri(account1.mId, attachment3Id, 62, 62);
322301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        type = mMockResolver.getType(uri);
323301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("image/png", type);
324301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
325301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
326301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
32780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     * Test static inferMimeType()
32880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     * From the method doc:
3291d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * If the file extension is ".eml", return "message/rfc822", which is necessary for the email
3301d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * app to open it.
3311d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * If the given mime type is non-empty and anything other than "application/octet-stream",
3321d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * just return it.  (This is the most common case.)
3331d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * If the filename has a recognizable extension and it converts to a mime type, return that.
3341d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * If the filename has an unrecognized extension, return "application/extension"
3351d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki     * Otherwise return "application/octet-stream".
3366833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki     *
3376833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki     * Also, all results should be in lowercase.
33880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler     */
33980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    public void testInferMimeType() {
3406833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String DEFAULT_MIX = "Application/Octet-stream";
3416833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String DEFAULT_LOWER = DEFAULT_MIX.toLowerCase();
34234212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        final String TEXT_PLAIN = "text/plain";
3436833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String FILE_PDF = "myfile.false.pDf";
3446833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        final String FILE_ABC = "myfile.false.aBc";
34580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        final String FILE_NO_EXT = "myfile";
34680ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
34780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        // If the given mime type is non-empty and anything other than "application/octet-stream",
34880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        // just return it.  (This is the most common case.)
3496833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("mime/type", AttachmentProvider.inferMimeType(null, "Mime/TyPe"));
3506833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("mime/type", AttachmentProvider.inferMimeType("", "Mime/TyPe"));
3516833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("mime/type", AttachmentProvider.inferMimeType(FILE_PDF, "Mime/TyPe"));
35280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
35380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        // If the filename has a recognizable extension and it converts to a mime type, return that.
35480ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/pdf", AttachmentProvider.inferMimeType(FILE_PDF, null));
35580ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/pdf", AttachmentProvider.inferMimeType(FILE_PDF, ""));
3566833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("application/pdf", AttachmentProvider.inferMimeType(FILE_PDF, DEFAULT_MIX));
35780ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
35880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        // If the filename has an unrecognized extension, return "application/extension"
35980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/abc", AttachmentProvider.inferMimeType(FILE_ABC, null));
36080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        assertEquals("application/abc", AttachmentProvider.inferMimeType(FILE_ABC, ""));
3616833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("application/abc", AttachmentProvider.inferMimeType(FILE_ABC, DEFAULT_MIX));
36280ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
36380ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler        // Otherwise return "application/octet-stream".
3646833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType(FILE_NO_EXT, null));
3656833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType(FILE_NO_EXT, ""));
3666833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType(FILE_NO_EXT, DEFAULT_MIX));
3676833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType(null, null));
3686833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType("", ""));
3691d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
37034212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        // If mime type can be inferred, return it; otherwise return text/plain
37134212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        assertEquals("application/pdf", AttachmentProvider.inferMimeType(FILE_PDF, TEXT_PLAIN));
37234212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        assertEquals(DEFAULT_LOWER, AttachmentProvider.inferMimeType(FILE_NO_EXT, TEXT_PLAIN));
37334212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy        assertEquals(TEXT_PLAIN, AttachmentProvider.inferMimeType(FILE_ABC, TEXT_PLAIN));
37434212cc7df317a058a3f9860fc0e7de508cb7120Todd Kennedy
3751d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki        // Test for eml files.
3766833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("message/rfc822", AttachmentProvider.inferMimeType("a.eMl", "Text/Plain"));
3776833fd5ab6c1e23c0bf2005dec2950796a040781Makoto Onuki        assertEquals("message/rfc822", AttachmentProvider.inferMimeType("a.eml", DEFAULT_MIX));
37880ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    }
37980ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler
38080ebde2897dced46a0f24efb7c15a997b660a8feAndrew Stadler    /**
38186753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler     * Text extension extractor
38286753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler     */
38386753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    public void testGetFilenameExtension() {
38486753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_NO_EXTENSION = "myfile";
38586753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_EXTENSION = "myfile.pDf";
38686753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        final String FILE_TWO_EXTENSIONS = "myfile.false.AbC";
38786753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
38886753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        assertNull(AttachmentProvider.getFilenameExtension(null));
38986753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        assertNull(AttachmentProvider.getFilenameExtension(""));
39086753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        assertNull(AttachmentProvider.getFilenameExtension(FILE_NO_EXTENSION));
39186753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
39286753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        assertEquals("pdf", AttachmentProvider.getFilenameExtension(FILE_EXTENSION));
39386753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        assertEquals("abc", AttachmentProvider.getFilenameExtension(FILE_TWO_EXTENSIONS));
39486753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
39586753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        // The API makes no claim as to how these are handled (it probably should),
39686753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        // but make sure that they don't crash.
39786753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        AttachmentProvider.getFilenameExtension("filename.");
39886753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler        AttachmentProvider.getFilenameExtension(".extension");
39986753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    }
40086753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler
40186753bc41c3957b3bba49846f6603ed29f13c84eAndy Stadler    /**
402301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
403301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - regular file
404301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - TODO: variations on the content URI
405301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
406301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenFile() throws MessagingException, IOException {
407301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-file", false, mMockContext);
408301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
409301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
410301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
411301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
412301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
413301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
414301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
415301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
416301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
417301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
4183d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri file1Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment1Id);
4193d25a519abf676f050b546d34401a277aea5de40Andrew Stadler        Uri file2Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id);
420301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
4217d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found
422301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        AssetFileDescriptor afd;
423301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
424301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
425301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment entry");
426301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
427301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
428301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
429301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
430301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
431301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
432301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
433301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
434301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
435301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
436301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
437301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
438301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
439301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment file");
440301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
441301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
442301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
443301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
444301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
445301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
446301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
447301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
448301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
449301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
4503d25a519abf676f050b546d34401a277aea5de40Andrew Stadler                AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id).toString();
451301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
452301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
453301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
454301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
455301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a file
456301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(file2Uri, "r");
457301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
458301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
459301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
460301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
461301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
462301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
463301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
464301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - thumbnail
465301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @throws IOException
466301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *
467301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * TODO:  The thumbnail mode returns null for its failure cases (and in one case, throws
468301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * an SQLiteException).  The ContentResolver contract requires throwing FileNotFoundException
469301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * in all of the non-success cases, and the provider should be fixed for consistency.
470301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
471301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenThumbnail() throws MessagingException, IOException {
472301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-thumbnail", false, mMockContext);
473301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
474301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
475301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
476301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
477301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
478301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
479301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
480301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
481301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
482301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
483a98de7e55e91229c35352b496fad3fbb108a9609Andrew Stadler        Uri thumb1Uri = AttachmentProvider.getAttachmentThumbnailUri(account1.mId, attachment1Id,
484301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                62, 62);
485a98de7e55e91229c35352b496fad3fbb108a9609Andrew Stadler        Uri thumb2Uri = AttachmentProvider.getAttachmentThumbnailUri(account1.mId, attachment2Id,
486301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                62, 62);
487301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
488301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, but no attachment found
4897d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        AssetFileDescriptor afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
490301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
491301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
492301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
493301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
494301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
495301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
496301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
497301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
498301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
499301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
500301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
501301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
502301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
503301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
504301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
505301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
506301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
507301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
5083d25a519abf676f050b546d34401a277aea5de40Andrew Stadler                AttachmentProvider.getAttachmentUri(account1.mId, attachment2Id).toString();
509301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
510301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
511301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
512301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
513301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a thumbnail
514301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb2Uri, "r");
515301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
516301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
517301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
518301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
519301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5209ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    private Uri createAttachment(Account account, long messageId, String contentUriStr) {
5219ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Add an attachment entry.
5229ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        Attachment newAttachment = ProviderTestUtils.setupAttachment(messageId, "file", 100,
5239ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda                false, mMockContext);
5249ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        newAttachment.mContentUri = contentUriStr;
5259ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        long attachmentId = addAttachmentToDb(account, newAttachment);
5269ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        Uri attachmentUri = AttachmentProvider.getAttachmentUri(account.mId, attachmentId);
5279ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        return attachmentUri;
5289ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    }
5299ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda
530301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
531301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test resolveAttachmentIdToContentUri()
5329ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - without DB
533301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - not in DB
5349ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with not-null contentUri
5359ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with null contentUri
536301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
537301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testResolveAttachmentIdToContentUri() throws MessagingException {
538301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
539301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
540301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
541301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
5429ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We use attachmentId == 1 but any other id would do
5439ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        final long attachment1Id = 1;
5449ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        final Uri attachment1Uri = AttachmentProvider.getAttachmentUri(account1.mId, attachment1Id);
545301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5467d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return input
5479ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We know that the attachmentId 1 does not exist because there are no attachments
5489ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // created at this point
5497d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        Uri result = AttachmentProvider.resolveAttachmentIdToContentUri(
550301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                mMockResolver, attachment1Uri);
551301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment1Uri, result);
552301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5539ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri != null
5549ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Note, resolveAttachmentIdToContentUri() just uses
555301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // the DB, and does not sample the files, so we won't bother creating the files
5569ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
5579ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, "file:///path/to/file");
5581d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki            Uri contentUri = AttachmentProvider.resolveAttachmentIdToContentUri(mMockResolver,
5599ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda                    attachmentUri);
5609ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When the attachment is found, return the stored content_uri value
5619ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals("file:///path/to/file", contentUri.toString());
5629ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
563301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5649ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri == null
5659ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
5669ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, null);
5671d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki            Uri contentUri = AttachmentProvider.resolveAttachmentIdToContentUri(mMockResolver,
5689ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda                    attachmentUri);
5699ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When contentUri is null should return input
5709ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals(attachmentUri, contentUri);
5719ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
572301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
573301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
574301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
5754b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     * Test the functionality of deleting all attachment files for a given message.
5764b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     */
5774b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    public void testDeleteFiles() throws IOException {
5784b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
5794b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
5804b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.save(mMockContext);
5814b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message1Id = 1;      // 1 attachment, 1 file
5824b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message2Id = 2;      // 2 attachments, 2 files
5834b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message3Id = 3;      // 1 attachment, missing file
5844b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message4Id = 4;      // no attachments
5854b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5864b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Add attachment entries for various test messages
5874b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment1 = ProviderTestUtils.setupAttachment(message1Id, "file1", 100,
5884b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5894b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message2Id, "file2", 200,
5904b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5914b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message2Id, "file3", 100,
5924b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5934b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment4 = ProviderTestUtils.setupAttachment(message3Id, "file4", 100,
5944b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5954b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5964b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Create test files
5974b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment1.mId);
5984b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment2.mId);
5994b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment3.mId);
6004b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6014b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Confirm 3 attachment files found
6024b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        File attachmentsDir = AttachmentProvider.getAttachmentDirectory(mMockContext, account1.mId);
6034b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6044b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6054b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Command deletion of some files and check for results
6061d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
6074b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 4 has no attachments so no files should be deleted
6084b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        AttachmentProvider.deleteAllAttachmentFiles(mMockContext, account1.mId, message4Id);
6094b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6104b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6114b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 3 has no attachment files so no files should be deleted
6124b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        AttachmentProvider.deleteAllAttachmentFiles(mMockContext, account1.mId, message3Id);
6134b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
6144b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6154b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 2 has 2 attachment files so this should delete 2 files
6164b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        AttachmentProvider.deleteAllAttachmentFiles(mMockContext, account1.mId, message2Id);
6174b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
6184b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6194b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 1 has 1 attachment file so this should delete the last file
6204b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        AttachmentProvider.deleteAllAttachmentFiles(mMockContext, account1.mId, message1Id);
6214b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
6224b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    }
6234b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
6244b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    /**
62571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     * Test the functionality of deleting an entire mailbox's attachments.
62671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     */
62771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    public void testDeleteMailbox() throws IOException {
62871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-mbox-del", false, mMockContext);
62971754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.mCompatibilityUuid = "test-UUID";
63071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.save(mMockContext);
63171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long account1Id = account1.mId;
63271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
63371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox1Id = mailbox1.mId;
63471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
63571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox2Id = mailbox2.mId;
6361d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
637e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
638e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
639e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
64071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
64171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Confirm four attachment files found
64271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        File attachmentsDir = AttachmentProvider.getAttachmentDirectory(mMockContext, account1.mId);
64371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(4, attachmentsDir.listFiles().length);
64471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
64571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 1 - we should lose 3 attachment files
64671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        AttachmentProvider.deleteAllMailboxAttachmentFiles(mMockContext, account1Id, mailbox1Id);
64771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
64871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
64971754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 2 - we should lose 1 attachment file
65071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        AttachmentProvider.deleteAllMailboxAttachmentFiles(mMockContext, account1Id, mailbox2Id);
65171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
65271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    }
6531d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
654e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
655e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Test the functionality of deleting an entire account's attachments.
656e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
657e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testDeleteAccount() throws IOException {
658e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-acct-del1", false, mMockContext);
659e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.mCompatibilityUuid = "test-UUID";
660e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.save(mMockContext);
661e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
662e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
663e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox1Id = mailbox1.mId;
664e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
665e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox2Id = mailbox2.mId;
666e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
667e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Repeat for account #2
668e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account2 = ProviderTestUtils.setupAccount("attach-acct-del2", false, mMockContext);
669e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.mCompatibilityUuid = "test-UUID-2";
670e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.save(mMockContext);
671e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
672e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox3 = ProviderTestUtils.setupMailbox("mbox3", account2Id, true, mMockContext);
673e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox3Id = mailbox3.mId;
674e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox4 = ProviderTestUtils.setupMailbox("mbox4", account2Id, true, mMockContext);
675e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox4Id = mailbox4.mId;
676e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
677e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
678e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
679e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
680e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox3Id, 5);
681e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox4Id, 2);
682e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
683e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm eleven attachment files found
684e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        File directory1 = AttachmentProvider.getAttachmentDirectory(mMockContext, account1.mId);
685e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(4, directory1.listFiles().length);
686e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        File directory2 = AttachmentProvider.getAttachmentDirectory(mMockContext, account2.mId);
687e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
688e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
689e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 1 - we should lose 4 attachment files
690e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        AttachmentProvider.deleteAllAccountAttachmentFiles(mMockContext, account1Id);
691e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
692e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
693e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
694e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 2 - we should lose 7 attachment file
695e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        AttachmentProvider.deleteAllAccountAttachmentFiles(mMockContext, account2Id);
696e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
697e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory2.listFiles().length);
698e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
699e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
700e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
701e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Create a set of attachments for a given test account and mailbox.  Creates the following:
702e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Two messages per mailbox, one w/attachments, one w/o attachments
703e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Any number of attachments (on the first message)
704e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param account the account to populate
705e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param mailboxId the mailbox to populate
706e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param numAttachments how many attachments to create
707e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
708e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    private void populateAccountMailbox(Account account, long mailboxId, int numAttachments)
709e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            throws IOException {
710e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long accountId = account.mId;
711e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
712e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // two messages per mailbox, one w/attachments, one w/o attachments
713e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message1a = ProviderTestUtils.setupMessage(
714e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1a", accountId, mailboxId, false, true, mMockContext);
715e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        /* Message message1b = */ ProviderTestUtils.setupMessage(
716e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1b", accountId, mailboxId, false, true, mMockContext);
717e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
718e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Create attachment records & files
719e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        for (int count = 0; count < numAttachments; count++) {
720e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            Attachment newAttachment = ProviderTestUtils.setupAttachment(message1a.mId,
721e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                    "file" + count, 100 * count, true, mMockContext);
722e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            createAttachmentFile(account, newAttachment.mId);
723e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        }
724e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
72571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
72671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    /**
727301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Create an attachment by copying an image resource into a file.  Uses "real" resources
728301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * to get a real image from Email
729301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
730301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private String createAttachmentFile(Account forAccount, long id) throws IOException {
731301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        File outFile = getAttachmentFile(forAccount, id);
732301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),
73364ac7a6cc81ef6dc84354153b978bd5db944e8b0Todd Kennedy                R.drawable.ic_attachment_holo_light);
734301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        FileOutputStream out = new FileOutputStream(outFile);
735301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
736301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        out.close();
737301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
738301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        return outFile.getAbsolutePath();
739301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
740301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
741301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
742301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Record an attachment in the attachments database
743301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @return the id of the attachment just created
744301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
745301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private long addAttachmentToDb(Account forAccount, Attachment newAttachment) {
7467d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        newAttachment.save(mMockContext);
7477d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return newAttachment.mId;
748301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
749301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
750301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
751301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Map from account, attachment ID to attachment file
752301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
753301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private File getAttachmentFile(Account forAccount, long id) {
754301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        String idString = Long.toString(id);
7557d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        File attachmentsDir = mMockContext.getDatabasePath(forAccount.mId + ".db_att");
7567d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        if (!attachmentsDir.exists()) {
7577d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler            attachmentsDir.mkdirs();
758301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
7597d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return new File(attachmentsDir, idString);
760301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
761301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler}
762