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;
22f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
23a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
2653ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
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)
7131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank                .addProvider(EmailContent.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,
2382f6cbb021cd97e2450c29b72a27236ba4ef20823Marc Blank                    EmailContent.Attachment.PRECACHE_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,
2492f6cbb021cd97e2450c29b72a27236ba4ef20823Marc Blank                    EmailContent.Attachment.PRECACHE_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    /**
337301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
338301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - regular file
339301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - TODO: variations on the content URI
340301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
341301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenFile() throws MessagingException, IOException {
342301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-file", false, mMockContext);
343301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
344301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
345301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
346301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
347301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
348301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
349301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
350301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
351301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
352301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
3538a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri file1Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment1Id);
3548a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri file2Uri = AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id);
355301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
3567d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found
357301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        AssetFileDescriptor afd;
358301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
359301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
360301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment entry");
361301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
362301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
363301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
364301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
365301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
366301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
367301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
368301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
369301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
370301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
371301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
372301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        try {
373301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            afd = mMockResolver.openAssetFileDescriptor(file1Uri, "r");
374301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            fail("Should throw an exception on a missing attachment file");
375301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        } catch (FileNotFoundException fnf) {
376301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler            // expected
377301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
378301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
379301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
380301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
381301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
382301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
383301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
384301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
3858a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id)
3868a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                .toString();
387301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
388301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
389301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
390301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
391301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a file
392301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(file2Uri, "r");
393301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
394301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
395301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
396301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
397301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
398301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
399301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test openFile()
400301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - thumbnail
401301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @throws IOException
402301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *
403301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * TODO:  The thumbnail mode returns null for its failure cases (and in one case, throws
404301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * an SQLiteException).  The ContentResolver contract requires throwing FileNotFoundException
405301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * in all of the non-success cases, and the provider should be fixed for consistency.
406301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
407301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testOpenThumbnail() throws MessagingException, IOException {
408301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("open-thumbnail", false, mMockContext);
409301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
410301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
411301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
412301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment1Id = 1;
413301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        long attachment2Id = 2;
414301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
415301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Note:  There is an implicit assumption in this test sequence that the first
416301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // attachment we add will be id=1 and the 2nd will have id=2.  This could fail on
417301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // a legitimate implementation.  Asserts below will catch this and fail the test
418301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // if necessary.
4198a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri thumb1Uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId,
4208a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id, 62, 62);
4218a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri thumb2Uri = AttachmentUtilities.getAttachmentThumbnailUri(account1.mId,
4228a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment2Id, 62, 62);
423301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
424301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, but no attachment found
4257d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        AssetFileDescriptor afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
426301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
427301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
428301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Add an attachment (but no associated file)
429301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
430301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
431301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment1Id = addAttachmentToDb(account1, newAttachment);
432301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 1, attachment1Id);
433301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
434301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found, but no attachment found
435301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb1Uri, "r");
436301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNull(afd);
437301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
438301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Create an "attachment" by copying an image resource into a file
439301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        /* String fileName = */ createAttachmentFile(account1, attachment2Id);
440301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message1Id, "file", 100,
441301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                false, mMockContext);
442301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentId = null;
443301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mContentUri =
4448a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                AttachmentUtilities.getAttachmentUri(account1.mId, attachment2Id)
4458a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                .toString();
446301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        newAttachment2.mMimeType = "image/png";
447301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        attachment2Id = addAttachmentToDb(account1, newAttachment2);
448301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals("Broken test:  Unexpected id assignment", 2, attachment2Id);
449301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
450301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // Test with an attached database, attachment entry found - returns a thumbnail
451301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd = mMockResolver.openAssetFileDescriptor(thumb2Uri, "r");
452301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertNotNull(afd);
453301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // TODO: Confirm it's the "right" file?
454301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        afd.close();
455301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
456301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
4579ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    private Uri createAttachment(Account account, long messageId, String contentUriStr) {
4589ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Add an attachment entry.
4599ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        Attachment newAttachment = ProviderTestUtils.setupAttachment(messageId, "file", 100,
4609ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda                false, mMockContext);
4619ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        newAttachment.mContentUri = contentUriStr;
4629ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        long attachmentId = addAttachmentToDb(account, newAttachment);
4638a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri attachmentUri = AttachmentUtilities.getAttachmentUri(account.mId, attachmentId);
4649ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        return attachmentUri;
4659ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda    }
4669ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda
467301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
468301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * test resolveAttachmentIdToContentUri()
4699ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - without DB
470301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     *  - not in DB
4719ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with not-null contentUri
4729ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda     *  - in DB, with null contentUri
473301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
474301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    public void testResolveAttachmentIdToContentUri() throws MessagingException {
475301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
476301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
477301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        account1.save(mMockContext);
478301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        final long message1Id = 1;
4799ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We use attachmentId == 1 but any other id would do
4809ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        final long attachment1Id = 1;
4818a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        final Uri attachment1Uri = AttachmentUtilities.getAttachmentUri(account1.mId,
4828a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                attachment1Id);
483301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
4847d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        // Test with no attachment found - should return input
4859ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // We know that the attachmentId 1 does not exist because there are no attachments
4869ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // created at this point
4878a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        Uri result = AttachmentUtilities.resolveAttachmentIdToContentUri(
488301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler                mMockResolver, attachment1Uri);
489301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        assertEquals(attachment1Uri, result);
490301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
4919ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri != null
4929ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Note, resolveAttachmentIdToContentUri() just uses
493301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        // the DB, and does not sample the files, so we won't bother creating the files
4949ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
4959ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, "file:///path/to/file");
4968a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            Uri contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
4978a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                    mMockResolver, attachmentUri);
4989ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When the attachment is found, return the stored content_uri value
4999ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals("file:///path/to/file", contentUri.toString());
5009ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
501301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
5029ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        // Test with existing attachement and contentUri == null
5039ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        {
5049ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            Uri attachmentUri = createAttachment(account1, message1Id, null);
5058a574694606f0e5d781334d0d426fc379c51f3edMarc Blank            Uri contentUri = AttachmentUtilities.resolveAttachmentIdToContentUri(
5068a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                    mMockResolver, attachmentUri);
5079ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            // When contentUri is null should return input
5089ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda            assertEquals(attachmentUri, contentUri);
5099ef6f645f57d869a600113f555389b5d5e368c21Mihai Preda        }
510301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
511301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
512301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
5134b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     * Test the functionality of deleting all attachment files for a given message.
5144b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler     */
5154b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    public void testDeleteFiles() throws IOException {
5164b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attachment-query", false, mMockContext);
5174b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.mCompatibilityUuid = "test-UUID";
5184b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        account1.save(mMockContext);
5194b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message1Id = 1;      // 1 attachment, 1 file
5204b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message2Id = 2;      // 2 attachments, 2 files
5214b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message3Id = 3;      // 1 attachment, missing file
5224b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        final long message4Id = 4;      // no attachments
5234b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5244b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Add attachment entries for various test messages
5254b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment1 = ProviderTestUtils.setupAttachment(message1Id, "file1", 100,
5264b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5274b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment2 = ProviderTestUtils.setupAttachment(message2Id, "file2", 200,
5284b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5294b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment3 = ProviderTestUtils.setupAttachment(message2Id, "file3", 100,
5304b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5314b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        Attachment newAttachment4 = ProviderTestUtils.setupAttachment(message3Id, "file4", 100,
5324b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler                true, mMockContext);
5334b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5344b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Create test files
5354b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment1.mId);
5364b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment2.mId);
5374b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        createAttachmentFile(account1, newAttachment3.mId);
5384b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5394b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Confirm 3 attachment files found
5408a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File attachmentsDir = AttachmentUtilities.getAttachmentDirectory(mMockContext,
5418a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
5424b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
5434b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5444b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Command deletion of some files and check for results
5451d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
5464b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 4 has no attachments so no files should be deleted
5478a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
5488a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message4Id);
5494b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
5504b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5514b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 3 has no attachment files so no files should be deleted
5528a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
5538a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message3Id);
5544b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(3, attachmentsDir.listFiles().length);
5554b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5564b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 2 has 2 attachment files so this should delete 2 files
5578a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
5588a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message2Id);
5594b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
5604b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5614b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        // Message 1 has 1 attachment file so this should delete the last file
5628a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAttachmentFiles(mMockContext, account1.mId,
5638a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                message1Id);
5644b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
5654b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    }
5664b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler
5674b41bae270ea4c49ec8403084db43ee9b37cdda4Andrew Stadler    /**
56871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     * Test the functionality of deleting an entire mailbox's attachments.
56971754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler     */
57071754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    public void testDeleteMailbox() throws IOException {
57171754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-mbox-del", false, mMockContext);
57271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.mCompatibilityUuid = "test-UUID";
57371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        account1.save(mMockContext);
57471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long account1Id = account1.mId;
57571754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
57671754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox1Id = mailbox1.mId;
57771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
57871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        long mailbox2Id = mailbox2.mId;
5791d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
580e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
581e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
582e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
58371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
58471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Confirm four attachment files found
5858a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File attachmentsDir = AttachmentUtilities.getAttachmentDirectory(mMockContext,
5868a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
58771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(4, attachmentsDir.listFiles().length);
58871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
58971754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 1 - we should lose 3 attachment files
5908a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllMailboxAttachmentFiles(mMockContext, account1Id,
5918a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                mailbox1Id);
59271754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(1, attachmentsDir.listFiles().length);
59371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
59471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        // Command the deletion of mailbox 2 - we should lose 1 attachment file
5958a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllMailboxAttachmentFiles(mMockContext, account1Id,
5968a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                mailbox2Id);
59771754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler        assertEquals(0, attachmentsDir.listFiles().length);
59871754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    }
5991d0be30871745ef0e623d8bb5e2e433567541623Makoto Onuki
600e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
601e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Test the functionality of deleting an entire account's attachments.
602e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
603e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testDeleteAccount() throws IOException {
604e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account1 = ProviderTestUtils.setupAccount("attach-acct-del1", false, mMockContext);
605e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.mCompatibilityUuid = "test-UUID";
606e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account1.save(mMockContext);
607e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
608e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox1 = ProviderTestUtils.setupMailbox("mbox1", account1Id, true, mMockContext);
609e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox1Id = mailbox1.mId;
610e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox2 = ProviderTestUtils.setupMailbox("mbox2", account1Id, true, mMockContext);
611e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox2Id = mailbox2.mId;
612e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
613e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Repeat for account #2
614e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account2 = ProviderTestUtils.setupAccount("attach-acct-del2", false, mMockContext);
615e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.mCompatibilityUuid = "test-UUID-2";
616e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        account2.save(mMockContext);
617e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
618e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox3 = ProviderTestUtils.setupMailbox("mbox3", account2Id, true, mMockContext);
619e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox3Id = mailbox3.mId;
620e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox mailbox4 = ProviderTestUtils.setupMailbox("mbox4", account2Id, true, mMockContext);
621e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long mailbox4Id = mailbox4.mId;
622e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
623e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Fill each mailbox with messages & attachments
624e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox1Id, 3);
625e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account1, mailbox2Id, 1);
626e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox3Id, 5);
627e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        populateAccountMailbox(account2, mailbox4Id, 2);
628e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
629e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm eleven attachment files found
6308a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File directory1 = AttachmentUtilities.getAttachmentDirectory(mMockContext,
6318a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account1.mId);
632e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(4, directory1.listFiles().length);
6338a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        File directory2 = AttachmentUtilities.getAttachmentDirectory(mMockContext,
6348a574694606f0e5d781334d0d426fc379c51f3edMarc Blank                account2.mId);
635e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
636e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
637e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 1 - we should lose 4 attachment files
6388a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAccountAttachmentFiles(mMockContext, account1Id);
639e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
640e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(7, directory2.listFiles().length);
641e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
642e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Command the deletion of account 2 - we should lose 7 attachment file
6438a574694606f0e5d781334d0d426fc379c51f3edMarc Blank        AttachmentUtilities.deleteAllAccountAttachmentFiles(mMockContext, account2Id);
644e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory1.listFiles().length);
645e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertEquals(0, directory2.listFiles().length);
646e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
647e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
648e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
649e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Create a set of attachments for a given test account and mailbox.  Creates the following:
650e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Two messages per mailbox, one w/attachments, one w/o attachments
651e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  Any number of attachments (on the first message)
652e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param account the account to populate
653e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param mailboxId the mailbox to populate
654e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     *  @param numAttachments how many attachments to create
655e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
656e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    private void populateAccountMailbox(Account account, long mailboxId, int numAttachments)
657e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            throws IOException {
658e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long accountId = account.mId;
659e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
660e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // two messages per mailbox, one w/attachments, one w/o attachments
661e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message1a = ProviderTestUtils.setupMessage(
662e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1a", accountId, mailboxId, false, true, mMockContext);
663e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        /* Message message1b = */ ProviderTestUtils.setupMessage(
664e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                "msg1b", accountId, mailboxId, false, true, mMockContext);
665e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
666e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Create attachment records & files
667e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        for (int count = 0; count < numAttachments; count++) {
668e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            Attachment newAttachment = ProviderTestUtils.setupAttachment(message1a.mId,
669e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                    "file" + count, 100 * count, true, mMockContext);
670e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler            createAttachmentFile(account, newAttachment.mId);
671e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        }
672e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
67371754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler
67471754d3f940fe82e251c274e3e56781e702cfd6fAndrew Stadler    /**
675301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Create an attachment by copying an image resource into a file.  Uses "real" resources
676301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * to get a real image from Email
677301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
678301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private String createAttachmentFile(Account forAccount, long id) throws IOException {
679301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        File outFile = getAttachmentFile(forAccount, id);
680301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),
68164ac7a6cc81ef6dc84354153b978bd5db944e8b0Todd Kennedy                R.drawable.ic_attachment_holo_light);
682301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        FileOutputStream out = new FileOutputStream(outFile);
683301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
684301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        out.close();
685301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
686301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        return outFile.getAbsolutePath();
687301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
688301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
689301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
690301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Record an attachment in the attachments database
691301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * @return the id of the attachment just created
692301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
693301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private long addAttachmentToDb(Account forAccount, Attachment newAttachment) {
6947d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        newAttachment.save(mMockContext);
6957d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return newAttachment.mId;
696301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
697301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler
698301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    /**
699301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     * Map from account, attachment ID to attachment file
700301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler     */
701301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    private File getAttachmentFile(Account forAccount, long id) {
702301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        String idString = Long.toString(id);
7037d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        File attachmentsDir = mMockContext.getDatabasePath(forAccount.mId + ".db_att");
7047d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        if (!attachmentsDir.exists()) {
7057d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler            attachmentsDir.mkdirs();
706301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler        }
7077d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler        return new File(attachmentsDir, idString);
708301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler    }
709301ac18bb7f211b473c4f6fa6ec9bb276bbc6c10Andrew Stadler}
710