LegacyConversionsTests.java revision 7d51b7a05ba07377e3df0b07c2aaa430a8b5bc42
13f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler/* 23f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copyright (C) 2009 The Android Open Source Project 33f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 43f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 53f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * you may not use this file except in compliance with the License. 63f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * You may obtain a copy of the License at 73f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 83f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 93f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Unless required by applicable law or agreed to in writing, software 113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * See the License for the specific language governing permissions and 143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * limitations under the License. 153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpackage com.android.email; 183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 19c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadlerimport com.android.email.mail.Address; 203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.BodyPart; 21c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadlerimport com.android.email.mail.Flag; 2275a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.mail.Message; 23c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadlerimport com.android.email.mail.Message.RecipientType; 2475a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.mail.MessageTestUtils; 253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MessageBuilder; 263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MultipartBuilder; 2775a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.mail.MessagingException; 2875a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.mail.Part; 29b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadlerimport com.android.email.mail.internet.MimeBodyPart; 303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeHeader; 31c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadlerimport com.android.email.mail.internet.MimeMessage; 323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeUtility; 33eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadlerimport com.android.email.mail.internet.TextBody; 343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent; 353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.Attachment; 3675a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.provider.EmailProvider; 3775a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blankimport com.android.email.provider.ProviderTestUtils; 383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentUris; 403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.Context; 413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.database.Cursor; 423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.net.Uri; 433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.test.ProviderTestCase2; 443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.IOException; 463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.ArrayList; 47eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadlerimport java.util.Date; 483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler/** 503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Tests of the Legacy Conversions code (used by MessagingController). 513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * NOTE: It would probably make sense to rewrite this using a MockProvider, instead of the 533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * ProviderTestCase (which is a real provider running on a temp database). This would be more of 543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * a true "unit test". 553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * You can run this entire test case with: 573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * runtest -c com.android.email.LegacyConversionsTests email 583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpublic class LegacyConversionsTests extends ProviderTestCase2<EmailProvider> { 603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 61eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String UID = "UID.12345678"; 62eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String SENDER = "sender@android.com"; 63eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String RECIPIENT_TO = "recipient-to@android.com"; 64eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String RECIPIENT_CC = "recipient-cc@android.com"; 65eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String RECIPIENT_BCC = "recipient-bcc@android.com"; 66eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String REPLY_TO = "reply-to@android.com"; 67eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String SUBJECT = "This is the subject"; 68eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String MESSAGE_ID = "Test-Message-ID"; 69eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String MESSAGE_ID_2 = "Test-Message-ID-Second"; 70eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler EmailProvider mProvider; 723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Context mProviderContext; 733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Context mContext; 745e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler Account mLegacyAccount = null; 755e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler Preferences mPreferences = null; 763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public LegacyConversionsTests() { 783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY); 793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler @Override 823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void setUp() throws Exception { 833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super.setUp(); 843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler mProviderContext = getMockContext(); 853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler mContext = getContext(); 863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler @Override 893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void tearDown() throws Exception { 903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super.tearDown(); 915e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler if (mLegacyAccount != null) { 925e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.delete(mPreferences); 935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: basic Legacy -> Provider Message conversions 983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: basic Legacy -> Provider Body conversions 993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: rainy day tests of all kinds 1003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 103eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Test basic conversion from Store message to Provider message 104eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * 105eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * TODO: Not a complete test of all fields, and some fields need special tests (e.g. flags) 106eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * TODO: There are many special cases in the tested function, that need to be 107eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * tested here as well. 108eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 109eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler public void testUpdateMessageFields() throws MessagingException { 110eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC, 111eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler REPLY_TO, SENDER, SUBJECT, null); 112eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 113eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 114eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); 115eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertTrue(result); 116eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler checkProviderMessage("testUpdateMessageFields", message, localMessage); 117eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 118eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 119eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 120eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Test basic conversion from Store message to Provider message, when the provider message 121eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * does not have a proper message-id. 122eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 123eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler public void testUpdateMessageFieldsNoMessageId() throws MessagingException { 124eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC, 125eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler REPLY_TO, SENDER, SUBJECT, null); 126eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 127eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 128eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler // If the source message-id is null, the target should be left as-is 129eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler localMessage.mMessageId = MESSAGE_ID_2; 130eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.removeHeader("Message-ID"); 131eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 132eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); 133eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertTrue(result); 134eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(MESSAGE_ID_2, localMessage.mMessageId); 135eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 136eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 137eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 138eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Build a lightweight Store message with simple field population 139eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 140eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private MimeMessage buildTestMessage(String to, String cc, String bcc, String replyTo, 141eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler String sender, String subject, String content) throws MessagingException { 142eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = new MimeMessage(); 143eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 144eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (to != null) { 145eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(to); 146eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.TO, addresses); 147eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 148eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (cc != null) { 149eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(cc); 150eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.CC, addresses); 151eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 152eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (bcc != null) { 153eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(bcc); 154eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.BCC, addresses); 155eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 156eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (replyTo != null) { 157eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(replyTo); 158eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setReplyTo(addresses); 159eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 160eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (sender != null) { 161eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(sender); 1625e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler message.setFrom(addresses[0]); 163eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 164eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (subject != null) { 165eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setSubject(subject); 166eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 167eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (content != null) { 168eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler TextBody body = new TextBody(content); 169eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setBody(body); 170eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 171eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 172eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setUid(UID); 173eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setSentDate(new Date()); 174eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setInternalDate(new Date()); 175eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setMessageId(MESSAGE_ID); 176eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler return message; 177eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 178eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 179eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 180b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * Basic test of body parts conversion from Store message to Provider message. 181b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * This tests that a null body part simply results in null text, and does not crash 182b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * or return "null". 183b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * 184b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * TODO very incomplete, there are many permutations to be explored 185b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler */ 186b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler public void testUpdateBodyFieldsNullText() throws MessagingException { 187b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler EmailContent.Body localBody = new EmailContent.Body(); 188b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 189b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 190b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler Part emptyTextPart = new MimeBodyPart(null, "text/plain"); 191b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler viewables.add(emptyTextPart); 192b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler 193b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler // a "null" body part of type text/plain should result in a null mTextContent 194b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler boolean result = LegacyConversions.updateBodyFields(localBody, localMessage, viewables); 195b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler assertTrue(result); 196b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler assertNull(localBody.mTextContent); 197b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler } 198b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler 199b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler /** 2007d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler * Sunny day test of adding attachments from an IMAP/POP message. 2013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 2023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void testAddAttachments() throws MessagingException, IOException { 2033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Prepare a local message to add the attachments to 2043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final long accountId = 1; 2053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final long mailboxId = 1; 2067d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler 2077d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler // test 1: legacy message using content-type:name style for name 2083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final EmailContent.Message localMessage = ProviderTestUtils.setupMessage( 2093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 2107d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler final Message legacyMessage = prepareLegacyMessageWithAttachments(2, false); 2117d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler convertAndCheckcheckAddedAttachments(localMessage, legacyMessage); 2123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2137d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler // test 2: legacy message using content-disposition:filename style for name 2147d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler final EmailContent.Message localMessage2 = ProviderTestUtils.setupMessage( 2157d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 2167d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler final Message legacyMessage2 = prepareLegacyMessageWithAttachments(2, true); 2177d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler convertAndCheckcheckAddedAttachments(localMessage2, legacyMessage2); 2187d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler } 2193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2207d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler /** 2217d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler * Helper for testAddAttachments 2227d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler */ 2237d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler private void convertAndCheckcheckAddedAttachments(final EmailContent.Message localMessage, 2247d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler final Message legacyMessage) throws MessagingException, IOException { 2253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Now, convert from legacy to provider and see what happens 2263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 2273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 2283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 2297d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 2303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Read back all attachments for message and check field values 2323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId); 2333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Cursor c = mProviderContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION, 2343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler null, null, null); 2353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler try { 2363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(2, c.getCount()); 2373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler while (c.moveToNext()) { 2383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Attachment attachment = Attachment.getContent(c, Attachment.class); 239e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler if ("100".equals(attachment.mLocation)) { 24075a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank checkAttachment("attachment1Part", attachments.get(0), attachment, 24175a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank localMessage.mAccountKey); 242e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler } else if ("101".equals(attachment.mLocation)) { 24375a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank checkAttachment("attachment2Part", attachments.get(1), attachment, 24475a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank localMessage.mAccountKey); 2453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 2463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler fail("Unexpected attachment with location " + attachment.mLocation); 2473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } finally { 2503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler c.close(); 2513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 255e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler * Test that only "attachment" or "inline" attachments are captured and added. 256e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler * @throws MessagingException 257e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler * @throws IOException 258e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler */ 259e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler public void testAttachmentDispositions() throws MessagingException, IOException { 260e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // Prepare a local message to add the attachments to 261e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler final long accountId = 1; 262e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler final long mailboxId = 1; 263e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 264e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // Prepare the three attachments we want to test 265e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler BodyPart[] sourceAttachments = new BodyPart[3]; 266e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler BodyPart attachmentPart; 267e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 268e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // 1. Standard attachment 269e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart = MessageTestUtils.bodyPart("image/jpg", null); 270e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "image/jpg"); 271e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); 272e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, 273e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler "attachment;\n filename=\"file-1\";\n size=100"); 274e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "100"); 275e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler sourceAttachments[0] = attachmentPart; 276e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 277e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // 2. Inline attachment 278e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart = MessageTestUtils.bodyPart("image/gif", null); 279e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "image/gif"); 280e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); 281e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, 282e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler "inline;\n filename=\"file-2\";\n size=200"); 283e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "101"); 284e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler sourceAttachments[1] = attachmentPart; 285e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 286e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // 3. Neither (use VCALENDAR) 287e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart = MessageTestUtils.bodyPart("text/calendar", null); 288e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, 289e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler "text/calendar; charset=UTF-8; method=REQUEST"); 290e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "7bit"); 291e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "102"); 292e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler sourceAttachments[2] = attachmentPart; 293e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 294e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // Prepare local message (destination) and legacy message w/attachments (source) 295e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler final EmailContent.Message localMessage = ProviderTestUtils.setupMessage( 296e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 297e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler final Message legacyMessage = prepareLegacyMessageWithAttachments(sourceAttachments); 298e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler convertAndCheckcheckAddedAttachments(localMessage, legacyMessage); 299e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 300e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // Run the conversion and check for the converted attachments - this test asserts 301e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // that there are two attachments numbered 100 & 101 (so will fail if it finds 102) 302e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler convertAndCheckcheckAddedAttachments(localMessage, legacyMessage); 303e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler } 304e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 305e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler /** 3065b0a12c199198870161876996296b1262c17408eAndrew Stadler * Test that attachments aren't re-added in the DB. This supports the "partial download" 3075b0a12c199198870161876996296b1262c17408eAndrew Stadler * nature of POP messages. 3085b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 3095b0a12c199198870161876996296b1262c17408eAndrew Stadler public void testAddDuplicateAttachments() throws MessagingException, IOException { 3105b0a12c199198870161876996296b1262c17408eAndrew Stadler // Prepare a local message to add the attachments to 3115b0a12c199198870161876996296b1262c17408eAndrew Stadler final long accountId = 1; 3125b0a12c199198870161876996296b1262c17408eAndrew Stadler final long mailboxId = 1; 3135b0a12c199198870161876996296b1262c17408eAndrew Stadler final EmailContent.Message localMessage = ProviderTestUtils.setupMessage( 3145b0a12c199198870161876996296b1262c17408eAndrew Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 3155b0a12c199198870161876996296b1262c17408eAndrew Stadler 3165b0a12c199198870161876996296b1262c17408eAndrew Stadler // Prepare a legacy message with attachments 3177d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler Message legacyMessage = prepareLegacyMessageWithAttachments(2, false); 3185b0a12c199198870161876996296b1262c17408eAndrew Stadler 3195b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now, convert from legacy to provider and see what happens 3205b0a12c199198870161876996296b1262c17408eAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 3215b0a12c199198870161876996296b1262c17408eAndrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 3225b0a12c199198870161876996296b1262c17408eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 3237d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 3245b0a12c199198870161876996296b1262c17408eAndrew Stadler 3255b0a12c199198870161876996296b1262c17408eAndrew Stadler // Confirm two attachment objects created 3265b0a12c199198870161876996296b1262c17408eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId); 3275b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(2, EmailContent.count(mProviderContext, uri, null, null)); 3285b0a12c199198870161876996296b1262c17408eAndrew Stadler 3295b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now add the attachments again and confirm there are still only two 3307d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 3315b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(2, EmailContent.count(mProviderContext, uri, null, null)); 3325b0a12c199198870161876996296b1262c17408eAndrew Stadler 3335b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now add a 3rd & 4th attachment and make sure the total is 4, not 2 or 6 3347d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler legacyMessage = prepareLegacyMessageWithAttachments(4, false); 3355b0a12c199198870161876996296b1262c17408eAndrew Stadler viewables = new ArrayList<Part>(); 3365b0a12c199198870161876996296b1262c17408eAndrew Stadler attachments = new ArrayList<Part>(); 3375b0a12c199198870161876996296b1262c17408eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 3387d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 3395b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(4, EmailContent.count(mProviderContext, uri, null, null)); 3405b0a12c199198870161876996296b1262c17408eAndrew Stadler } 3415b0a12c199198870161876996296b1262c17408eAndrew Stadler 3425b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 3435b0a12c199198870161876996296b1262c17408eAndrew Stadler * Prepare a legacy message with 1+ attachments 344fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler * @param numAttachments how many attachments to add 3457d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler * @param filenameInDisposition False: attachment names are sent as content-type:name. True: 3467d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler * attachment names are sent as content-disposition:filename. 3475b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 3487d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler private Message prepareLegacyMessageWithAttachments(int numAttachments, 3497d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler boolean filenameInDisposition) throws MessagingException { 350e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler BodyPart[] attachmentParts = new BodyPart[numAttachments]; 351e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler for (int i = 0; i < numAttachments; ++i) { 3527d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler // construct parameter parts for content-type:name or content-disposition:filename. 3537d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String name = ""; 3547d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String filename = ""; 3557d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String quotedName = "\"test-attachment-" + i + "\""; 3567d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler if (filenameInDisposition) { 3577d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler filename = ";\n filename=" + quotedName; 3587d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler } else { 3597d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler name = ";\n name=" + quotedName; 3607d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler } 361fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler 3627d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler // generate an attachment that came from a server 3637d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler BodyPart attachmentPart = MessageTestUtils.bodyPart("image/jpg", null); 364fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler 3657d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler // name=attachmentN size=N00 location=10N 3667d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "image/jpg" + name); 3677d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); 3687d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, 3697d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler "attachment" + filename + ";\n size=" + (i+1) + "00"); 3707d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "10" + i); 3717d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler 3727d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler attachmentParts[i] = attachmentPart; 3735b0a12c199198870161876996296b1262c17408eAndrew Stadler } 3745b0a12c199198870161876996296b1262c17408eAndrew Stadler 375e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler return prepareLegacyMessageWithAttachments(attachmentParts); 376e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler } 377e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 378e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler /** 379e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler * Prepare a legacy message with 1+ attachments 380e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler * @param attachments array containing one or more attachments 381e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler */ 382e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler private Message prepareLegacyMessageWithAttachments(BodyPart[] attachments) 383e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler throws MessagingException { 384e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler // Build the multipart that holds the attachments 385e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler MultipartBuilder mpBuilder = new MultipartBuilder("multipart/mixed"); 386e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler for (int i = 0; i < attachments.length; ++i) { 387e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler mpBuilder.addBodyPart(attachments[i]); 388e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler } 389e3a17f1438e454518a58fc0841bb615344acf865Andy Stadler 3905b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now build a message with them 3915b0a12c199198870161876996296b1262c17408eAndrew Stadler final Message legacyMessage = new MessageBuilder() 3925b0a12c199198870161876996296b1262c17408eAndrew Stadler .setBody(new MultipartBuilder("multipart/mixed") 3935b0a12c199198870161876996296b1262c17408eAndrew Stadler .addBodyPart(MessageTestUtils.bodyPart("text/html", null)) 3945b0a12c199198870161876996296b1262c17408eAndrew Stadler .addBodyPart(mpBuilder.buildBodyPart()) 3955b0a12c199198870161876996296b1262c17408eAndrew Stadler .build()) 3965b0a12c199198870161876996296b1262c17408eAndrew Stadler .build(); 3975b0a12c199198870161876996296b1262c17408eAndrew Stadler 3985b0a12c199198870161876996296b1262c17408eAndrew Stadler return legacyMessage; 3995b0a12c199198870161876996296b1262c17408eAndrew Stadler } 4005b0a12c199198870161876996296b1262c17408eAndrew Stadler 4015b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 4025b0a12c199198870161876996296b1262c17408eAndrew Stadler * Test the stringInequal helper 4035b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 4045b0a12c199198870161876996296b1262c17408eAndrew Stadler public void testStringInequal() { 4055b0a12c199198870161876996296b1262c17408eAndrew Stadler // Pairs that are "equal" 4065b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual(null, null)); 4075b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual(null, "")); 4085b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("", null)); 4095b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("", "")); 4105b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("string-equal", "string-equal")); 4115b0a12c199198870161876996296b1262c17408eAndrew Stadler // Pairs that are "inequal" 4125b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual(null, "string-inequal")); 4135b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("", "string-inequal")); 4145b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal", null)); 4155b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal", "")); 4165b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal-a", "string-inequal-b")); 4175b0a12c199198870161876996296b1262c17408eAndrew Stadler } 4185b0a12c199198870161876996296b1262c17408eAndrew Stadler 4195b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 4203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Compare attachment that was converted from Part (expected) to Provider Attachment (actual) 4213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 4223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO content URI should only be set if we also saved a file 4233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO other data encodings 4243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 42575a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank private void checkAttachment(String tag, Part expected, EmailContent.Attachment actual, 42675a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank long accountKey) throws MessagingException { 4273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentType = MimeUtility.unfoldAndDecode(expected.getContentType()); 4287d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String contentTypeName = MimeUtility.getHeaderParameter(contentType, "name"); 4293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expected.getMimeType(), actual.mMimeType); 4303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String disposition = expected.getDisposition(); 4313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String sizeString = MimeUtility.getHeaderParameter(disposition, "size"); 4327d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String dispositionFilename = MimeUtility.getHeaderParameter(disposition, "filename"); 433fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler long expectedSize = (sizeString != null) ? Long.parseLong(sizeString) : 0; 4343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expectedSize, actual.mSize); 4353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expected.getContentId(), actual.mContentId); 436fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler 4377d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler // filename is either content-type:name or content-disposition:filename 4387d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler String expectedName = (contentTypeName != null) ? contentTypeName : dispositionFilename; 4397d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler assertEquals(tag, expectedName, actual.mFileName); 4407d738cb7e89353c51c567e466a135b54337f310dAndrew Stadler 4417d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler // content URI should be null 4427d51b7a05ba07377e3df0b07c2aaa430a8b5bc42Andy Stadler assertNull(tag, actual.mContentUri); 443fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler 4443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertTrue(tag, 0 != actual.mMessageKey); 445fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler 446fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler // location is either both null or both matching 447fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler String expectedPartId = null; 448fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler String[] storeData = expected.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA); 449fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler if (storeData != null && storeData.length > 0) { 450fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler expectedPartId = storeData[0]; 451fd249f61dd9c5fd1e7e0abffcb09b9e285d82baeAndrew Stadler } 4523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expectedPartId, actual.mLocation); 4533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, "B", actual.mEncoding); 45475a873be8420e50f0aeb5a77716358ee0ca66b01Marc Blank assertEquals(tag, accountKey, actual.mAccountKey); 4553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 4563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 4573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 4583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: Sunny day test of adding attachments from a POP message. 4593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 4603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 461c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler /** 462c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler * Sunny day tests of converting an original message to a legacy message 463c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler */ 464c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler public void testMakeLegacyMessage() throws MessagingException { 465c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Set up and store a message in the provider 466c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler long account1Id = 1; 467c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler long mailbox1Id = 1; 468c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 469c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 1: No body 470c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage1 = ProviderTestUtils.setupMessage("make-legacy", 471c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, false, true, mProviderContext); 472c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage1 = LegacyConversions.makeMessage(mProviderContext, localMessage1); 473c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("no body", localMessage1, getMessage1); 474c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 475c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 2: Simple body 476c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage2 = ProviderTestUtils.setupMessage("make-legacy", 477c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 478c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mTextReply = null; 479c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mHtmlReply = null; 480c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mIntroText = null; 481c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 482c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.save(mProviderContext); 483c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage2 = LegacyConversions.makeMessage(mProviderContext, localMessage2); 484c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("simple body", localMessage2, getMessage2); 485c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 486c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 3: Body + replied-to text 487c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage3 = ProviderTestUtils.setupMessage("make-legacy", 488c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 489c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 490c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.mFlags |= EmailContent.Message.FLAG_TYPE_REPLY; 491c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.save(mProviderContext); 492c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage3 = LegacyConversions.makeMessage(mProviderContext, localMessage3); 493c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("reply-to", localMessage3, getMessage3); 494c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 495c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 4: Body + forwarded text 496c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage4 = ProviderTestUtils.setupMessage("make-legacy", 497c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 498c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 499c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.mFlags |= EmailContent.Message.FLAG_TYPE_FORWARD; 500c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.save(mProviderContext); 501c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage4 = LegacyConversions.makeMessage(mProviderContext, localMessage4); 502c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("forwarding", localMessage4, getMessage4); 503c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 504c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 505c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler /** 506eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Check equality of a pair of converted messages 507eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 508eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private void checkProviderMessage(String tag, Message expect, EmailContent.Message actual) 509eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler throws MessagingException { 510eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getUid(), actual.mServerId); 511eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getSubject(), actual.mSubject); 512eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getFrom()), actual.mFrom); 513eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getSentDate().getTime(), actual.mTimeStamp); 514eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.TO)), actual.mTo); 515eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.CC)), actual.mCc); 516eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, ((MimeMessage)expect).getMessageId(), actual.mMessageId); 517eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.isSet(Flag.SEEN), actual.mFlagRead); 518eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.isSet(Flag.FLAGGED), actual.mFlagFavorite); 519eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 520eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 5215b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 522eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Check equality of a pair of converted messages 523c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler */ 524c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler private void checkLegacyMessage(String tag, EmailContent.Message expect, Message actual) 525c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler throws MessagingException { 526c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mServerId, actual.getUid()); 527eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mServerTimeStamp, actual.getInternalDate().getTime()); 528c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mSubject, actual.getSubject()); 529c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFrom, Address.pack(actual.getFrom())); 530c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTimeStamp, actual.getSentDate().getTime()); 531c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTo, Address.pack(actual.getRecipients(RecipientType.TO))); 532c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mCc, Address.pack(actual.getRecipients(RecipientType.CC))); 533eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mBcc, Address.pack(actual.getRecipients(RecipientType.BCC))); 534eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mReplyTo, Address.pack(actual.getReplyTo())); 535c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mMessageId, ((MimeMessage)actual).getMessageId()); 536c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // check flags 537c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFlagRead, actual.isSet(Flag.SEEN)); 538c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFlagFavorite, actual.isSet(Flag.FLAGGED)); 539c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 540c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Check the body of the message 541c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 542c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 543c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler MimeUtility.collectParts(actual, viewables, attachments); 544c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1Text = null; 545c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1Html = null; 546c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1TextReply = null; 547c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1HtmlReply = null; 548c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1TextIntro = null; 549c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler for (Part viewable : viewables) { 550c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String text = MimeUtility.getTextFromPart(viewable); 551c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isHtml = viewable.getMimeType().equalsIgnoreCase("text/html"); 552c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String[] headers = viewable.getHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART); 553c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (headers != null) { 554c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String header = headers[0]; 555c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isReply = LegacyConversions.BODY_QUOTED_PART_REPLY.equalsIgnoreCase(header); 556c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isFwd = LegacyConversions.BODY_QUOTED_PART_FORWARD.equalsIgnoreCase(header); 557c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isIntro = LegacyConversions.BODY_QUOTED_PART_INTRO.equalsIgnoreCase(header); 558c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isReply || isFwd) { 559c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isHtml) { 560c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1HtmlReply = text; 561c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 562c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1TextReply = text; 563c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 564c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else if (isIntro) { 565c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1TextIntro = text; 566c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 567c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Check flags 568c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler int replyTypeFlags = expect.mFlags & EmailContent.Message.FLAG_TYPE_MASK; 569c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isReply) { 570c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, EmailContent.Message.FLAG_TYPE_REPLY, replyTypeFlags); 571c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 572c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isFwd) { 573c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, EmailContent.Message.FLAG_TYPE_FORWARD, replyTypeFlags); 574c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 575c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 576c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isHtml) { 577c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1Html = text; 578c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 579c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1Text = text; 580c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 581c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 582c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 583c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mText, get1Text); 584c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mHtml, get1Html); 585c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTextReply, get1TextReply); 586c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mHtmlReply, get1HtmlReply); 587c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mIntroText, get1TextIntro); 588c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 589c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // TODO Check the attachments 590c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 591c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler// cv.put("attachment_count", attachments.size()); 592c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 5935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 5945e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler /** 5955e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Test conversion of a legacy account to a provider account 5965e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */ 5975e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler public void testMakeProviderAccount() throws MessagingException { 5985e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 5995e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler setupLegacyAccount("testMakeProviderAccount", true); 6005e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler EmailContent.Account toAccount = 6015e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler LegacyConversions.makeAccount(mProviderContext, mLegacyAccount); 6025e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler checkProviderAccount("testMakeProviderAccount", mLegacyAccount, toAccount); 6035e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 6045e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6055e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler /** 6065e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Test conversion of a provider account to a legacy account 6075e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */ 6085e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler public void testMakeLegacyAccount() throws MessagingException { 6095e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler EmailContent.Account fromAccount = ProviderTestUtils.setupAccount("convert-to-legacy", 6105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler false, mProviderContext); 6115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler fromAccount.mHostAuthRecv = 6125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler ProviderTestUtils.setupHostAuth("legacy-recv", 0, false, mProviderContext); 6135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler fromAccount.mHostAuthSend = 6145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler ProviderTestUtils.setupHostAuth("legacy-send", 0, false, mProviderContext); 6155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler fromAccount.save(mProviderContext); 6165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler Account toAccount = LegacyConversions.makeLegacyAccount(mProviderContext, fromAccount); 6185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler checkLegacyAccount("testMakeLegacyAccount", fromAccount, toAccount); 6195e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 6205e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler /** 6225e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Setup a legacy account in mLegacyAccount with many fields prefilled. 6235e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */ 6245e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler private void setupLegacyAccount(String name, boolean saveIt) { 6255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler // prefs & legacy account are saved for cleanup (it's stored in the real prefs file) 6265e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mPreferences = Preferences.getPreferences(mProviderContext); 6275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount = new Account(mProviderContext); 6285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler // fill in useful fields 6305e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mUuid = "test-uid-" + name; 6315e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mStoreUri = "store://test/" + name; 6325e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mLocalStoreUri = "local://localhost/" + name; 6335e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mSenderUri = "sender://test/" + name; 6345e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mDescription = "description " + name; 6355e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mName = "name " + name; 6365e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mEmail = "email " + name; 6375e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mAutomaticCheckIntervalMinutes = 100; 6385e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mLastAutomaticCheckTime = 200; 6395e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mNotifyNewMail = true; 6405e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mDraftsFolderName = "drafts " + name; 6415e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mSentFolderName = "sent " + name; 6425e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mTrashFolderName = "trash " + name; 6435e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mOutboxFolderName = "outbox " + name; 6445e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mAccountNumber = 300; 6455e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mVibrate = true; 6469e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma mLegacyAccount.mVibrateWhenSilent = false; 6475e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mRingtoneUri = "ringtone://test/" + name; 6485e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mSyncWindow = 400; 6495e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mBackupFlags = 0; 6505e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.mDeletePolicy = Account.DELETE_POLICY_NEVER; 651fc8d943a828cd79ff71c703ced37001bd5482173Andrew Stadler mLegacyAccount.mSecurityFlags = 500; 652345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler mLegacyAccount.mSignature = "signature " + name; 6535e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6545e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler if (saveIt) { 6555e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler mLegacyAccount.save(mPreferences); 6565e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 6575e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 6585e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6595e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler /** 6605e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Compare a provider account to the legacy account it was created from 6615e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */ 6625e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler private void checkProviderAccount(String tag, Account expect, EmailContent.Account actual) 6635e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler throws MessagingException { 6645e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " description", expect.getDescription(), actual.mDisplayName); 6655e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " email", expect.getEmail(), actual.mEmailAddress); 666d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler assertEquals(tag + " sync key", null, actual.mSyncKey); 6675e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " lookback", expect.getSyncWindow(), actual.mSyncLookback); 6685e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " sync intvl", expect.getAutomaticCheckIntervalMinutes(), 6695e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler actual.mSyncInterval); 6705e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler // These asserts are checking mHostAuthKeyRecv & mHostAuthKeySend 6715e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " store", expect.getStoreUri(), actual.getStoreUri(mProviderContext)); 6725e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " sender", expect.getSenderUri(), actual.getSenderUri(mProviderContext)); 6735e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler // Synthesize & check flags 6745e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler int expectFlags = 0; 6755e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler if (expect.mNotifyNewMail) expectFlags |= EmailContent.Account.FLAGS_NOTIFY_NEW_MAIL; 6769e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma if (expect.mVibrate) expectFlags |= EmailContent.Account.FLAGS_VIBRATE_ALWAYS; 6779e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma if (expect.mVibrateWhenSilent) 6789e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma expectFlags |= EmailContent.Account.FLAGS_VIBRATE_WHEN_SILENT; 6795e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler expectFlags |= 6805e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler (expect.mDeletePolicy << EmailContent.Account.FLAGS_DELETE_POLICY_SHIFT) 6815e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler & EmailContent.Account.FLAGS_DELETE_POLICY_MASK; 6825e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " flags", expectFlags, actual.mFlags); 6835e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " default", false, actual.mIsDefault); 6845e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " uuid", expect.getUuid(), actual.mCompatibilityUuid); 6855e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " name", expect.getName(), actual.mSenderName); 6865e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " ringtone", expect.getRingtone(), actual.mRingtoneUri); 6875e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " proto vers", expect.mProtocolVersion, actual.mProtocolVersion); 6885e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " new count", 0, actual.mNewMessageCount); 689fc8d943a828cd79ff71c703ced37001bd5482173Andrew Stadler assertEquals(tag + " security", expect.mSecurityFlags, actual.mSecurityFlags); 690345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(tag + " sec sync key", null, actual.mSecuritySyncKey); 691345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(tag + " signature", expect.mSignature, actual.mSignature); 6925e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 6935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 6945e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler /** 6955e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Compare a legacy account to the provider account it was created from 6965e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */ 6975e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler private void checkLegacyAccount(String tag, EmailContent.Account expect, Account actual) 6985e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler throws MessagingException { 6995e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler int expectFlags = expect.getFlags(); 7005e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler 7015e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " uuid", expect.mCompatibilityUuid, actual.mUuid); 7025e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " store", expect.getStoreUri(mProviderContext), actual.mStoreUri); 7035e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertTrue(actual.mLocalStoreUri.startsWith("local://localhost")); 7045e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " sender", expect.getSenderUri(mProviderContext), actual.mSenderUri); 7055e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " description", expect.getDisplayName(), actual.mDescription); 7065e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " name", expect.getSenderName(), actual.mName); 7075e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " email", expect.getEmailAddress(), actual.mEmail); 7085e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " checkintvl", expect.getSyncInterval(), 7095e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler actual.mAutomaticCheckIntervalMinutes); 7105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " checktime", 0, actual.mLastAutomaticCheckTime); 7115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " notify", 7125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler (expectFlags & EmailContent.Account.FLAGS_NOTIFY_NEW_MAIL) != 0, 7135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler actual.mNotifyNewMail); 7145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " drafts", null, actual.mDraftsFolderName); 7155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " sent", null, actual.mSentFolderName); 7165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " trash", null, actual.mTrashFolderName); 7175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " outbox", null, actual.mOutboxFolderName); 7185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " acct #", -1, actual.mAccountNumber); 7199e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma assertEquals(tag + " vibrate", 7209e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma (expectFlags & EmailContent.Account.FLAGS_VIBRATE_ALWAYS) != 0, 7215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler actual.mVibrate); 7229e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma assertEquals(tag + " vibrateSilent", 7239e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma (expectFlags & EmailContent.Account.FLAGS_VIBRATE_WHEN_SILENT) != 0, 7249e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma actual.mVibrateWhenSilent); 7255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " ", expect.getRingtone(), actual.mRingtoneUri); 7265e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " sync window", expect.getSyncLookback(), actual.mSyncWindow); 7275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " backup flags", 0, actual.mBackupFlags); 7285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " proto vers", expect.mProtocolVersion, actual.mProtocolVersion); 7295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler assertEquals(tag + " delete policy", expect.getDeletePolicy(), actual.getDeletePolicy()); 730fc8d943a828cd79ff71c703ced37001bd5482173Andrew Stadler assertEquals(tag + " security", expect.mSecurityFlags, actual.mSecurityFlags); 731345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(tag + " signature", expect.mSignature, actual.mSignature); 7325e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler } 7333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler} 734