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