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