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