LegacyConversionsTests.java revision 5b0a12c199198870161876996296b1262c17408e
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; 223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Message; 233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils; 243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessagingException; 253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Part; 26c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadlerimport com.android.email.mail.Message.RecipientType; 273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MessageBuilder; 283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MultipartBuilder; 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.EmailProvider; 363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.ProviderTestUtils; 373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.Attachment; 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 BODY = "This is the body. This is also the body."; 69eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String MESSAGE_ID = "Test-Message-ID"; 70eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private static final String MESSAGE_ID_2 = "Test-Message-ID-Second"; 71eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler EmailProvider mProvider; 733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Context mProviderContext; 743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Context mContext; 753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public LegacyConversionsTests() { 773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY); 783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler @Override 813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void setUp() throws Exception { 823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super.setUp(); 833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler mProviderContext = getMockContext(); 843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler mContext = getContext(); 853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler @Override 883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void tearDown() throws Exception { 893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler super.tearDown(); 903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 923f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: basic Legacy -> Provider Message conversions 943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: basic Legacy -> Provider Body conversions 953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: rainy day tests of all kinds 963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 99eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Test basic conversion from Store message to Provider message 100eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * 101eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * TODO: Not a complete test of all fields, and some fields need special tests (e.g. flags) 102eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * TODO: There are many special cases in the tested function, that need to be 103eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * tested here as well. 104eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 105eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler public void testUpdateMessageFields() throws MessagingException { 106eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC, 107eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler REPLY_TO, SENDER, SUBJECT, null); 108eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 109eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 110eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); 111eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertTrue(result); 112eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler checkProviderMessage("testUpdateMessageFields", message, localMessage); 113eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 114eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 115eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 116eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Test basic conversion from Store message to Provider message, when the provider message 117eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * does not have a proper message-id. 118eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 119eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler public void testUpdateMessageFieldsNoMessageId() throws MessagingException { 120eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC, 121eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler REPLY_TO, SENDER, SUBJECT, null); 122eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 123eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 124eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler // If the source message-id is null, the target should be left as-is 125eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler localMessage.mMessageId = MESSAGE_ID_2; 126eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.removeHeader("Message-ID"); 127eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 128eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); 129eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertTrue(result); 130eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(MESSAGE_ID_2, localMessage.mMessageId); 131eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 132eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 133eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 134eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Build a lightweight Store message with simple field population 135eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 136eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private MimeMessage buildTestMessage(String to, String cc, String bcc, String replyTo, 137eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler String sender, String subject, String content) throws MessagingException { 138eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler MimeMessage message = new MimeMessage(); 139eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 140eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (to != null) { 141eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(to); 142eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.TO, addresses); 143eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 144eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (cc != null) { 145eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(cc); 146eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.CC, addresses); 147eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 148eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (bcc != null) { 149eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(bcc); 150eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setRecipients(RecipientType.BCC, addresses); 151eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 152eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (replyTo != null) { 153eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(replyTo); 154eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setReplyTo(addresses); 155eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 156eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (sender != null) { 157eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler Address[] addresses = Address.parse(sender); 158eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setFrom(Address.parse(sender)[0]); 159eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 160eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (subject != null) { 161eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setSubject(subject); 162eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 163eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler if (content != null) { 164eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler TextBody body = new TextBody(content); 165eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setBody(body); 166eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 167eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 168eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setUid(UID); 169eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setSentDate(new Date()); 170eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setInternalDate(new Date()); 171eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler message.setMessageId(MESSAGE_ID); 172eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler return message; 173eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 174eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 175eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler /** 176b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * Basic test of body parts conversion from Store message to Provider message. 177b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * This tests that a null body part simply results in null text, and does not crash 178b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * or return "null". 179b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * 180b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler * TODO very incomplete, there are many permutations to be explored 181b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler */ 182b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler public void testUpdateBodyFieldsNullText() throws MessagingException { 183b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler EmailContent.Body localBody = new EmailContent.Body(); 184b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler EmailContent.Message localMessage = new EmailContent.Message(); 185b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 186b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler Part emptyTextPart = new MimeBodyPart(null, "text/plain"); 187b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler viewables.add(emptyTextPart); 188b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler 189b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler // a "null" body part of type text/plain should result in a null mTextContent 190b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler boolean result = LegacyConversions.updateBodyFields(localBody, localMessage, viewables); 191b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler assertTrue(result); 192b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler assertNull(localBody.mTextContent); 193b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler } 194b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler 195b6756688b1bf07c50b999c9d30dd6cb224d3812bAndrew Stadler /** 1963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Sunny day test of adding attachments from an IMAP message. 1973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public void testAddAttachments() throws MessagingException, IOException { 1993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Prepare a local message to add the attachments to 2003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final long accountId = 1; 2013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final long mailboxId = 1; 2023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler final EmailContent.Message localMessage = ProviderTestUtils.setupMessage( 2033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 2043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Prepare a legacy message with attachments 2065b0a12c199198870161876996296b1262c17408eAndrew Stadler final Message legacyMessage = prepareLegacyMessageWithAttachments(2); 2073f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Now, convert from legacy to provider and see what happens 2093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 2103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 2113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 2123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 2133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Read back all attachments for message and check field values 2153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId); 2163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Cursor c = mProviderContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION, 2173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler null, null, null); 2183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler try { 2193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(2, c.getCount()); 2203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler while (c.moveToNext()) { 2213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Attachment attachment = Attachment.getContent(c, Attachment.class); 2223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if ("101".equals(attachment.mLocation)) { 2235b0a12c199198870161876996296b1262c17408eAndrew Stadler checkAttachment("attachment1Part", attachments.get(0), attachment); 2243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else if ("102".equals(attachment.mLocation)) { 2255b0a12c199198870161876996296b1262c17408eAndrew Stadler checkAttachment("attachment2Part", attachments.get(1), attachment); 2263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 2273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler fail("Unexpected attachment with location " + attachment.mLocation); 2283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } finally { 2313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler c.close(); 2323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 2365b0a12c199198870161876996296b1262c17408eAndrew Stadler * Test that attachments aren't re-added in the DB. This supports the "partial download" 2375b0a12c199198870161876996296b1262c17408eAndrew Stadler * nature of POP messages. 2385b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 2395b0a12c199198870161876996296b1262c17408eAndrew Stadler public void testAddDuplicateAttachments() throws MessagingException, IOException { 2405b0a12c199198870161876996296b1262c17408eAndrew Stadler // Prepare a local message to add the attachments to 2415b0a12c199198870161876996296b1262c17408eAndrew Stadler final long accountId = 1; 2425b0a12c199198870161876996296b1262c17408eAndrew Stadler final long mailboxId = 1; 2435b0a12c199198870161876996296b1262c17408eAndrew Stadler final EmailContent.Message localMessage = ProviderTestUtils.setupMessage( 2445b0a12c199198870161876996296b1262c17408eAndrew Stadler "local-message", accountId, mailboxId, false, true, mProviderContext); 2455b0a12c199198870161876996296b1262c17408eAndrew Stadler 2465b0a12c199198870161876996296b1262c17408eAndrew Stadler // Prepare a legacy message with attachments 2475b0a12c199198870161876996296b1262c17408eAndrew Stadler Message legacyMessage = prepareLegacyMessageWithAttachments(2); 2485b0a12c199198870161876996296b1262c17408eAndrew Stadler 2495b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now, convert from legacy to provider and see what happens 2505b0a12c199198870161876996296b1262c17408eAndrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 2515b0a12c199198870161876996296b1262c17408eAndrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 2525b0a12c199198870161876996296b1262c17408eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 2535b0a12c199198870161876996296b1262c17408eAndrew Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 2545b0a12c199198870161876996296b1262c17408eAndrew Stadler 2555b0a12c199198870161876996296b1262c17408eAndrew Stadler // Confirm two attachment objects created 2565b0a12c199198870161876996296b1262c17408eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId); 2575b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(2, EmailContent.count(mProviderContext, uri, null, null)); 2585b0a12c199198870161876996296b1262c17408eAndrew Stadler 2595b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now add the attachments again and confirm there are still only two 2605b0a12c199198870161876996296b1262c17408eAndrew Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 2615b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(2, EmailContent.count(mProviderContext, uri, null, null)); 2625b0a12c199198870161876996296b1262c17408eAndrew Stadler 2635b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now add a 3rd & 4th attachment and make sure the total is 4, not 2 or 6 2645b0a12c199198870161876996296b1262c17408eAndrew Stadler legacyMessage = prepareLegacyMessageWithAttachments(4); 2655b0a12c199198870161876996296b1262c17408eAndrew Stadler viewables = new ArrayList<Part>(); 2665b0a12c199198870161876996296b1262c17408eAndrew Stadler attachments = new ArrayList<Part>(); 2675b0a12c199198870161876996296b1262c17408eAndrew Stadler MimeUtility.collectParts(legacyMessage, viewables, attachments); 2685b0a12c199198870161876996296b1262c17408eAndrew Stadler LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments); 2695b0a12c199198870161876996296b1262c17408eAndrew Stadler assertEquals(4, EmailContent.count(mProviderContext, uri, null, null)); 2705b0a12c199198870161876996296b1262c17408eAndrew Stadler } 2715b0a12c199198870161876996296b1262c17408eAndrew Stadler 2725b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 2735b0a12c199198870161876996296b1262c17408eAndrew Stadler * Prepare a legacy message with 1+ attachments 2745b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 2755b0a12c199198870161876996296b1262c17408eAndrew Stadler private static Message prepareLegacyMessageWithAttachments(int numAttachments) 2765b0a12c199198870161876996296b1262c17408eAndrew Stadler throws MessagingException { 2775b0a12c199198870161876996296b1262c17408eAndrew Stadler // First, build one or more attachment parts 2785b0a12c199198870161876996296b1262c17408eAndrew Stadler MultipartBuilder mpBuilder = new MultipartBuilder("multipart/mixed"); 2795b0a12c199198870161876996296b1262c17408eAndrew Stadler for (int i = 1; i <= numAttachments; ++i) { 2805b0a12c199198870161876996296b1262c17408eAndrew Stadler BodyPart attachmentPart = MessageTestUtils.bodyPart("image/jpg", null); 2815b0a12c199198870161876996296b1262c17408eAndrew Stadler 2825b0a12c199198870161876996296b1262c17408eAndrew Stadler // name=attachmentN size=N00 location=10N 2835b0a12c199198870161876996296b1262c17408eAndrew Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, 2845b0a12c199198870161876996296b1262c17408eAndrew Stadler "image/jpg;\n name=\"attachment" + i + "\""); 2855b0a12c199198870161876996296b1262c17408eAndrew Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); 2865b0a12c199198870161876996296b1262c17408eAndrew Stadler attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, 2875b0a12c199198870161876996296b1262c17408eAndrew Stadler "attachment;\n filename=\"attachment2\";\n size=" + i + "00"); 2885b0a12c199198870161876996296b1262c17408eAndrew Stadler attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "10" + i); 2895b0a12c199198870161876996296b1262c17408eAndrew Stadler 2905b0a12c199198870161876996296b1262c17408eAndrew Stadler mpBuilder.addBodyPart(attachmentPart); 2915b0a12c199198870161876996296b1262c17408eAndrew Stadler } 2925b0a12c199198870161876996296b1262c17408eAndrew Stadler 2935b0a12c199198870161876996296b1262c17408eAndrew Stadler // Now build a message with them 2945b0a12c199198870161876996296b1262c17408eAndrew Stadler final Message legacyMessage = new MessageBuilder() 2955b0a12c199198870161876996296b1262c17408eAndrew Stadler .setBody(new MultipartBuilder("multipart/mixed") 2965b0a12c199198870161876996296b1262c17408eAndrew Stadler .addBodyPart(MessageTestUtils.bodyPart("text/html", null)) 2975b0a12c199198870161876996296b1262c17408eAndrew Stadler .addBodyPart(mpBuilder.buildBodyPart()) 2985b0a12c199198870161876996296b1262c17408eAndrew Stadler .build()) 2995b0a12c199198870161876996296b1262c17408eAndrew Stadler .build(); 3005b0a12c199198870161876996296b1262c17408eAndrew Stadler 3015b0a12c199198870161876996296b1262c17408eAndrew Stadler return legacyMessage; 3025b0a12c199198870161876996296b1262c17408eAndrew Stadler } 3035b0a12c199198870161876996296b1262c17408eAndrew Stadler 3045b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 3055b0a12c199198870161876996296b1262c17408eAndrew Stadler * Test the stringInequal helper 3065b0a12c199198870161876996296b1262c17408eAndrew Stadler */ 3075b0a12c199198870161876996296b1262c17408eAndrew Stadler public void testStringInequal() { 3085b0a12c199198870161876996296b1262c17408eAndrew Stadler // Pairs that are "equal" 3095b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual(null, null)); 3105b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual(null, "")); 3115b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("", null)); 3125b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("", "")); 3135b0a12c199198870161876996296b1262c17408eAndrew Stadler assertFalse(LegacyConversions.stringNotEqual("string-equal", "string-equal")); 3145b0a12c199198870161876996296b1262c17408eAndrew Stadler // Pairs that are "inequal" 3155b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual(null, "string-inequal")); 3165b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("", "string-inequal")); 3175b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal", null)); 3185b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal", "")); 3195b0a12c199198870161876996296b1262c17408eAndrew Stadler assertTrue(LegacyConversions.stringNotEqual("string-inequal-a", "string-inequal-b")); 3205b0a12c199198870161876996296b1262c17408eAndrew Stadler } 3215b0a12c199198870161876996296b1262c17408eAndrew Stadler 3225b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 3233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Compare attachment that was converted from Part (expected) to Provider Attachment (actual) 3243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 3253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO content URI should only be set if we also saved a file 3263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO other data encodings 3273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 3283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler private void checkAttachment(String tag, Part expected, EmailContent.Attachment actual) 3293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler throws MessagingException { 3303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentType = MimeUtility.unfoldAndDecode(expected.getContentType()); 3313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String expectedName = MimeUtility.getHeaderParameter(contentType, "name"); 3323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expectedName, actual.mFileName); 3333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expected.getMimeType(), actual.mMimeType); 3343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String disposition = expected.getDisposition(); 3353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String sizeString = MimeUtility.getHeaderParameter(disposition, "size"); 3363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long expectedSize = Long.parseLong(sizeString); 3373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expectedSize, actual.mSize); 3383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expected.getContentId(), actual.mContentId); 3393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertNull(tag, actual.mContentUri); 3403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertTrue(tag, 0 != actual.mMessageKey); 3413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String expectedPartId = 3423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler expected.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA)[0]; 3433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, expectedPartId, actual.mLocation); 3443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler assertEquals(tag, "B", actual.mEncoding); 3453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 3463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 3473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 3483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: Sunny day test of adding attachments from a POP message. 3493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 3503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 351c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler /** 352c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler * Sunny day tests of converting an original message to a legacy message 353c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler */ 354c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler public void testMakeLegacyMessage() throws MessagingException { 355c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Set up and store a message in the provider 356c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler long account1Id = 1; 357c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler long mailbox1Id = 1; 358c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 359c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 1: No body 360c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage1 = ProviderTestUtils.setupMessage("make-legacy", 361c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, false, true, mProviderContext); 362c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage1 = LegacyConversions.makeMessage(mProviderContext, localMessage1); 363c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("no body", localMessage1, getMessage1); 364c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 365c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 2: Simple body 366c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage2 = ProviderTestUtils.setupMessage("make-legacy", 367c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 368c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mTextReply = null; 369c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mHtmlReply = null; 370c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mIntroText = null; 371c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 372c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage2.save(mProviderContext); 373c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage2 = LegacyConversions.makeMessage(mProviderContext, localMessage2); 374c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("simple body", localMessage2, getMessage2); 375c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 376c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 3: Body + replied-to text 377c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage3 = ProviderTestUtils.setupMessage("make-legacy", 378c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 379c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 380c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.mFlags |= EmailContent.Message.FLAG_TYPE_REPLY; 381c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage3.save(mProviderContext); 382c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage3 = LegacyConversions.makeMessage(mProviderContext, localMessage3); 383c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("reply-to", localMessage3, getMessage3); 384c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 385c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Test message 4: Body + forwarded text 386c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler EmailContent.Message localMessage4 = ProviderTestUtils.setupMessage("make-legacy", 387c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler account1Id, mailbox1Id, true, false, mProviderContext); 388c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK; 389c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.mFlags |= EmailContent.Message.FLAG_TYPE_FORWARD; 390c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler localMessage4.save(mProviderContext); 391c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler Message getMessage4 = LegacyConversions.makeMessage(mProviderContext, localMessage4); 392c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler checkLegacyMessage("forwarding", localMessage4, getMessage4); 393c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 394c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 395c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler /** 396eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Check equality of a pair of converted messages 397eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler */ 398eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler private void checkProviderMessage(String tag, Message expect, EmailContent.Message actual) 399eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler throws MessagingException { 400eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getUid(), actual.mServerId); 401eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getSubject(), actual.mSubject); 402eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getFrom()), actual.mFrom); 403eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.getSentDate().getTime(), actual.mTimeStamp); 404eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.TO)), actual.mTo); 405eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.CC)), actual.mCc); 406eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, ((MimeMessage)expect).getMessageId(), actual.mMessageId); 407eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.isSet(Flag.SEEN), actual.mFlagRead); 408eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.isSet(Flag.FLAGGED), actual.mFlagFavorite); 409eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler } 410eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler 4115b0a12c199198870161876996296b1262c17408eAndrew Stadler /** 412eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler * Check equality of a pair of converted messages 413c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler */ 414c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler private void checkLegacyMessage(String tag, EmailContent.Message expect, Message actual) 415c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler throws MessagingException { 416c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mServerId, actual.getUid()); 417eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mServerTimeStamp, actual.getInternalDate().getTime()); 418c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mSubject, actual.getSubject()); 419c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFrom, Address.pack(actual.getFrom())); 420c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTimeStamp, actual.getSentDate().getTime()); 421c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTo, Address.pack(actual.getRecipients(RecipientType.TO))); 422c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mCc, Address.pack(actual.getRecipients(RecipientType.CC))); 423eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mBcc, Address.pack(actual.getRecipients(RecipientType.BCC))); 424eb7752bf695b2a93854e0bb89ddbbc2236bb9aeaAndrew Stadler assertEquals(tag, expect.mReplyTo, Address.pack(actual.getReplyTo())); 425c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mMessageId, ((MimeMessage)actual).getMessageId()); 426c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // check flags 427c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFlagRead, actual.isSet(Flag.SEEN)); 428c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mFlagFavorite, actual.isSet(Flag.FLAGGED)); 429c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 430c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Check the body of the message 431c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler ArrayList<Part> viewables = new ArrayList<Part>(); 432c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler ArrayList<Part> attachments = new ArrayList<Part>(); 433c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler MimeUtility.collectParts(actual, viewables, attachments); 434c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1Text = null; 435c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1Html = null; 436c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1TextReply = null; 437c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1HtmlReply = null; 438c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String get1TextIntro = null; 439c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler for (Part viewable : viewables) { 440c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String text = MimeUtility.getTextFromPart(viewable); 441c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isHtml = viewable.getMimeType().equalsIgnoreCase("text/html"); 442c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String[] headers = viewable.getHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART); 443c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (headers != null) { 444c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler String header = headers[0]; 445c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isReply = LegacyConversions.BODY_QUOTED_PART_REPLY.equalsIgnoreCase(header); 446c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isFwd = LegacyConversions.BODY_QUOTED_PART_FORWARD.equalsIgnoreCase(header); 447c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler boolean isIntro = LegacyConversions.BODY_QUOTED_PART_INTRO.equalsIgnoreCase(header); 448c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isReply || isFwd) { 449c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isHtml) { 450c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1HtmlReply = text; 451c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 452c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1TextReply = text; 453c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 454c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else if (isIntro) { 455c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1TextIntro = text; 456c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 457c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // Check flags 458c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler int replyTypeFlags = expect.mFlags & EmailContent.Message.FLAG_TYPE_MASK; 459c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isReply) { 460c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, EmailContent.Message.FLAG_TYPE_REPLY, replyTypeFlags); 461c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 462c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isFwd) { 463c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, EmailContent.Message.FLAG_TYPE_FORWARD, replyTypeFlags); 464c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 465c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 466c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler if (isHtml) { 467c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1Html = text; 468c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } else { 469c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler get1Text = text; 470c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 471c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 472c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 473c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mText, get1Text); 474c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mHtml, get1Html); 475c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mTextReply, get1TextReply); 476c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mHtmlReply, get1HtmlReply); 477c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler assertEquals(tag, expect.mIntroText, get1TextIntro); 478c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 479c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler // TODO Check the attachments 480c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler 481c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler// cv.put("attachment_count", attachments.size()); 482c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler } 4833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler} 484