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