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