LegacyConversionsTests.java revision 5e91cccd4b530eb2aeace5c5bf4f3328a5b5d69d
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.email;
18
19import com.android.email.Account;
20import com.android.email.mail.Address;
21import com.android.email.mail.BodyPart;
22import com.android.email.mail.Flag;
23import com.android.email.mail.Message;
24import com.android.email.mail.MessageTestUtils;
25import com.android.email.mail.MessagingException;
26import com.android.email.mail.Part;
27import com.android.email.mail.Message.RecipientType;
28import com.android.email.mail.MessageTestUtils.MessageBuilder;
29import com.android.email.mail.MessageTestUtils.MultipartBuilder;
30import com.android.email.mail.internet.MimeBodyPart;
31import com.android.email.mail.internet.MimeHeader;
32import com.android.email.mail.internet.MimeMessage;
33import com.android.email.mail.internet.MimeUtility;
34import com.android.email.mail.internet.TextBody;
35import com.android.email.provider.EmailContent;
36import com.android.email.provider.EmailProvider;
37import com.android.email.provider.ProviderTestUtils;
38import com.android.email.provider.EmailContent.Attachment;
39
40import android.content.ContentUris;
41import android.content.Context;
42import android.database.Cursor;
43import android.net.Uri;
44import android.test.ProviderTestCase2;
45
46import java.io.IOException;
47import java.util.ArrayList;
48import java.util.Date;
49
50/**
51 * Tests of the Legacy Conversions code (used by MessagingController).
52 *
53 * NOTE:  It would probably make sense to rewrite this using a MockProvider, instead of the
54 * ProviderTestCase (which is a real provider running on a temp database).  This would be more of
55 * a true "unit test".
56 *
57 * You can run this entire test case with:
58 *   runtest -c com.android.email.LegacyConversionsTests email
59 */
60public class LegacyConversionsTests extends ProviderTestCase2<EmailProvider> {
61
62    private static final String UID = "UID.12345678";
63    private static final String SENDER = "sender@android.com";
64    private static final String RECIPIENT_TO = "recipient-to@android.com";
65    private static final String RECIPIENT_CC = "recipient-cc@android.com";
66    private static final String RECIPIENT_BCC = "recipient-bcc@android.com";
67    private static final String REPLY_TO = "reply-to@android.com";
68    private static final String SUBJECT = "This is the subject";
69    private static final String MESSAGE_ID = "Test-Message-ID";
70    private static final String MESSAGE_ID_2 = "Test-Message-ID-Second";
71
72    EmailProvider mProvider;
73    Context mProviderContext;
74    Context mContext;
75    Account mLegacyAccount = null;
76    Preferences mPreferences = null;
77
78    public LegacyConversionsTests() {
79        super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY);
80    }
81
82    @Override
83    public void setUp() throws Exception {
84        super.setUp();
85        mProviderContext = getMockContext();
86        mContext = getContext();
87    }
88
89    @Override
90    public void tearDown() throws Exception {
91        super.tearDown();
92        if (mLegacyAccount != null) {
93            mLegacyAccount.delete(mPreferences);
94        }
95    }
96
97    /**
98     * TODO: basic Legacy -> Provider Message conversions
99     * TODO: basic Legacy -> Provider Body conversions
100     * TODO: rainy day tests of all kinds
101     */
102
103    /**
104     * Test basic conversion from Store message to Provider message
105     *
106     * TODO: Not a complete test of all fields, and some fields need special tests (e.g. flags)
107     * TODO: There are many special cases in the tested function, that need to be
108     * tested here as well.
109     */
110    public void testUpdateMessageFields() throws MessagingException {
111        MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC,
112                REPLY_TO, SENDER, SUBJECT, null);
113        EmailContent.Message localMessage = new EmailContent.Message();
114
115        boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1);
116        assertTrue(result);
117        checkProviderMessage("testUpdateMessageFields", message, localMessage);
118    }
119
120    /**
121     * Test basic conversion from Store message to Provider message, when the provider message
122     * does not have a proper message-id.
123     */
124    public void testUpdateMessageFieldsNoMessageId() throws MessagingException {
125        MimeMessage message = buildTestMessage(RECIPIENT_TO, RECIPIENT_CC, RECIPIENT_BCC,
126                REPLY_TO, SENDER, SUBJECT, null);
127        EmailContent.Message localMessage = new EmailContent.Message();
128
129        // If the source message-id is null, the target should be left as-is
130        localMessage.mMessageId = MESSAGE_ID_2;
131        message.removeHeader("Message-ID");
132
133        boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1);
134        assertTrue(result);
135        assertEquals(MESSAGE_ID_2, localMessage.mMessageId);
136    }
137
138    /**
139     * Build a lightweight Store message with simple field population
140     */
141    private MimeMessage buildTestMessage(String to, String cc, String bcc, String replyTo,
142            String sender, String subject, String content) throws MessagingException {
143        MimeMessage message = new MimeMessage();
144
145        if (to != null) {
146            Address[] addresses = Address.parse(to);
147            message.setRecipients(RecipientType.TO, addresses);
148        }
149        if (cc != null) {
150            Address[] addresses = Address.parse(cc);
151            message.setRecipients(RecipientType.CC, addresses);
152        }
153        if (bcc != null) {
154            Address[] addresses = Address.parse(bcc);
155            message.setRecipients(RecipientType.BCC, addresses);
156        }
157        if (replyTo != null) {
158            Address[] addresses = Address.parse(replyTo);
159            message.setReplyTo(addresses);
160        }
161        if (sender != null) {
162            Address[] addresses = Address.parse(sender);
163            message.setFrom(addresses[0]);
164        }
165        if (subject != null) {
166            message.setSubject(subject);
167        }
168        if (content != null) {
169            TextBody body = new TextBody(content);
170            message.setBody(body);
171        }
172
173        message.setUid(UID);
174        message.setSentDate(new Date());
175        message.setInternalDate(new Date());
176        message.setMessageId(MESSAGE_ID);
177        return message;
178    }
179
180    /**
181     * Basic test of body parts conversion from Store message to Provider message.
182     * This tests that a null body part simply results in null text, and does not crash
183     * or return "null".
184     *
185     * TODO very incomplete, there are many permutations to be explored
186     */
187    public void testUpdateBodyFieldsNullText() throws MessagingException {
188        EmailContent.Body localBody = new EmailContent.Body();
189        EmailContent.Message localMessage = new EmailContent.Message();
190        ArrayList<Part> viewables = new ArrayList<Part>();
191        Part emptyTextPart = new MimeBodyPart(null, "text/plain");
192        viewables.add(emptyTextPart);
193
194        // a "null" body part of type text/plain should result in a null mTextContent
195        boolean result = LegacyConversions.updateBodyFields(localBody, localMessage, viewables);
196        assertTrue(result);
197        assertNull(localBody.mTextContent);
198    }
199
200    /**
201     * Sunny day test of adding attachments from an IMAP message.
202     */
203    public void testAddAttachments() throws MessagingException, IOException {
204        // Prepare a local message to add the attachments to
205        final long accountId = 1;
206        final long mailboxId = 1;
207        final EmailContent.Message localMessage = ProviderTestUtils.setupMessage(
208                "local-message", accountId, mailboxId, false, true, mProviderContext);
209
210        // Prepare a legacy message with attachments
211        final Message legacyMessage = prepareLegacyMessageWithAttachments(2);
212
213        // Now, convert from legacy to provider and see what happens
214        ArrayList<Part> viewables = new ArrayList<Part>();
215        ArrayList<Part> attachments = new ArrayList<Part>();
216        MimeUtility.collectParts(legacyMessage, viewables, attachments);
217        LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments);
218
219        // Read back all attachments for message and check field values
220        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
221        Cursor c = mProviderContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
222                null, null, null);
223        try {
224            assertEquals(2, c.getCount());
225            while (c.moveToNext()) {
226                Attachment attachment = Attachment.getContent(c, Attachment.class);
227                if ("101".equals(attachment.mLocation)) {
228                    checkAttachment("attachment1Part", attachments.get(0), attachment);
229                } else if ("102".equals(attachment.mLocation)) {
230                    checkAttachment("attachment2Part", attachments.get(1), attachment);
231                } else {
232                    fail("Unexpected attachment with location " + attachment.mLocation);
233                }
234            }
235        } finally {
236            c.close();
237        }
238    }
239
240    /**
241     * Test that attachments aren't re-added in the DB.  This supports the "partial download"
242     * nature of POP messages.
243     */
244    public void testAddDuplicateAttachments() throws MessagingException, IOException {
245        // Prepare a local message to add the attachments to
246        final long accountId = 1;
247        final long mailboxId = 1;
248        final EmailContent.Message localMessage = ProviderTestUtils.setupMessage(
249                "local-message", accountId, mailboxId, false, true, mProviderContext);
250
251        // Prepare a legacy message with attachments
252        Message legacyMessage = prepareLegacyMessageWithAttachments(2);
253
254        // Now, convert from legacy to provider and see what happens
255        ArrayList<Part> viewables = new ArrayList<Part>();
256        ArrayList<Part> attachments = new ArrayList<Part>();
257        MimeUtility.collectParts(legacyMessage, viewables, attachments);
258        LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments);
259
260        // Confirm two attachment objects created
261        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
262        assertEquals(2, EmailContent.count(mProviderContext, uri, null, null));
263
264        // Now add the attachments again and confirm there are still only two
265        LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments);
266        assertEquals(2, EmailContent.count(mProviderContext, uri, null, null));
267
268        // Now add a 3rd & 4th attachment and make sure the total is 4, not 2 or 6
269        legacyMessage = prepareLegacyMessageWithAttachments(4);
270        viewables = new ArrayList<Part>();
271        attachments = new ArrayList<Part>();
272        MimeUtility.collectParts(legacyMessage, viewables, attachments);
273        LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments);
274        assertEquals(4, EmailContent.count(mProviderContext, uri, null, null));
275    }
276
277    /**
278     * Prepare a legacy message with 1+ attachments
279     */
280    private static Message prepareLegacyMessageWithAttachments(int numAttachments)
281            throws MessagingException {
282        // First, build one or more attachment parts
283        MultipartBuilder mpBuilder = new MultipartBuilder("multipart/mixed");
284        for (int i = 1; i <= numAttachments; ++i) {
285            BodyPart attachmentPart = MessageTestUtils.bodyPart("image/jpg", null);
286
287            // name=attachmentN size=N00 location=10N
288            attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE,
289                    "image/jpg;\n name=\"attachment" + i + "\"");
290            attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
291            attachmentPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION,
292                    "attachment;\n filename=\"attachment2\";\n size=" + i + "00");
293            attachmentPart.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "10" + i);
294
295            mpBuilder.addBodyPart(attachmentPart);
296        }
297
298        // Now build a message with them
299        final Message legacyMessage = new MessageBuilder()
300            .setBody(new MultipartBuilder("multipart/mixed")
301                     .addBodyPart(MessageTestUtils.bodyPart("text/html", null))
302                     .addBodyPart(mpBuilder.buildBodyPart())
303                     .build())
304                .build();
305
306        return legacyMessage;
307    }
308
309    /**
310     * Test the stringInequal helper
311     */
312    public void testStringInequal() {
313        // Pairs that are "equal"
314        assertFalse(LegacyConversions.stringNotEqual(null, null));
315        assertFalse(LegacyConversions.stringNotEqual(null, ""));
316        assertFalse(LegacyConversions.stringNotEqual("", null));
317        assertFalse(LegacyConversions.stringNotEqual("", ""));
318        assertFalse(LegacyConversions.stringNotEqual("string-equal", "string-equal"));
319        // Pairs that are "inequal"
320        assertTrue(LegacyConversions.stringNotEqual(null, "string-inequal"));
321        assertTrue(LegacyConversions.stringNotEqual("", "string-inequal"));
322        assertTrue(LegacyConversions.stringNotEqual("string-inequal", null));
323        assertTrue(LegacyConversions.stringNotEqual("string-inequal", ""));
324        assertTrue(LegacyConversions.stringNotEqual("string-inequal-a", "string-inequal-b"));
325    }
326
327    /**
328     * Compare attachment that was converted from Part (expected) to Provider Attachment (actual)
329     *
330     * TODO content URI should only be set if we also saved a file
331     * TODO other data encodings
332     */
333    private void checkAttachment(String tag, Part expected, EmailContent.Attachment actual)
334            throws MessagingException {
335        String contentType = MimeUtility.unfoldAndDecode(expected.getContentType());
336        String expectedName = MimeUtility.getHeaderParameter(contentType, "name");
337        assertEquals(tag, expectedName, actual.mFileName);
338        assertEquals(tag, expected.getMimeType(), actual.mMimeType);
339        String disposition = expected.getDisposition();
340        String sizeString = MimeUtility.getHeaderParameter(disposition, "size");
341        long expectedSize = Long.parseLong(sizeString);
342        assertEquals(tag, expectedSize, actual.mSize);
343        assertEquals(tag, expected.getContentId(), actual.mContentId);
344        assertNull(tag, actual.mContentUri);
345        assertTrue(tag, 0 != actual.mMessageKey);
346        String expectedPartId =
347            expected.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA)[0];
348        assertEquals(tag, expectedPartId, actual.mLocation);
349        assertEquals(tag, "B", actual.mEncoding);
350    }
351
352    /**
353     * TODO: Sunny day test of adding attachments from a POP message.
354     */
355
356    /**
357     * Sunny day tests of converting an original message to a legacy message
358     */
359    public void testMakeLegacyMessage() throws MessagingException {
360        // Set up and store a message in the provider
361        long account1Id = 1;
362        long mailbox1Id = 1;
363
364        // Test message 1: No body
365        EmailContent.Message localMessage1 = ProviderTestUtils.setupMessage("make-legacy",
366                account1Id, mailbox1Id, false, true, mProviderContext);
367        Message getMessage1 = LegacyConversions.makeMessage(mProviderContext, localMessage1);
368        checkLegacyMessage("no body", localMessage1, getMessage1);
369
370        // Test message 2: Simple body
371        EmailContent.Message localMessage2 = ProviderTestUtils.setupMessage("make-legacy",
372                account1Id, mailbox1Id, true, false, mProviderContext);
373        localMessage2.mTextReply = null;
374        localMessage2.mHtmlReply = null;
375        localMessage2.mIntroText = null;
376        localMessage2.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK;
377        localMessage2.save(mProviderContext);
378        Message getMessage2 = LegacyConversions.makeMessage(mProviderContext, localMessage2);
379        checkLegacyMessage("simple body", localMessage2, getMessage2);
380
381        // Test message 3: Body + replied-to text
382        EmailContent.Message localMessage3 = ProviderTestUtils.setupMessage("make-legacy",
383                account1Id, mailbox1Id, true, false, mProviderContext);
384        localMessage3.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK;
385        localMessage3.mFlags |= EmailContent.Message.FLAG_TYPE_REPLY;
386        localMessage3.save(mProviderContext);
387        Message getMessage3 = LegacyConversions.makeMessage(mProviderContext, localMessage3);
388        checkLegacyMessage("reply-to", localMessage3, getMessage3);
389
390        // Test message 4: Body + forwarded text
391        EmailContent.Message localMessage4 = ProviderTestUtils.setupMessage("make-legacy",
392                account1Id, mailbox1Id, true, false, mProviderContext);
393        localMessage4.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK;
394        localMessage4.mFlags |= EmailContent.Message.FLAG_TYPE_FORWARD;
395        localMessage4.save(mProviderContext);
396        Message getMessage4 = LegacyConversions.makeMessage(mProviderContext, localMessage4);
397        checkLegacyMessage("forwarding", localMessage4, getMessage4);
398    }
399
400    /**
401     * Check equality of a pair of converted messages
402     */
403    private void checkProviderMessage(String tag, Message expect, EmailContent.Message actual)
404            throws MessagingException {
405        assertEquals(tag, expect.getUid(), actual.mServerId);
406        assertEquals(tag, expect.getSubject(), actual.mSubject);
407        assertEquals(tag, Address.pack(expect.getFrom()), actual.mFrom);
408        assertEquals(tag, expect.getSentDate().getTime(), actual.mTimeStamp);
409        assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.TO)), actual.mTo);
410        assertEquals(tag, Address.pack(expect.getRecipients(RecipientType.CC)), actual.mCc);
411        assertEquals(tag, ((MimeMessage)expect).getMessageId(), actual.mMessageId);
412        assertEquals(tag, expect.isSet(Flag.SEEN), actual.mFlagRead);
413        assertEquals(tag, expect.isSet(Flag.FLAGGED), actual.mFlagFavorite);
414    }
415
416    /**
417     * Check equality of a pair of converted messages
418     */
419    private void checkLegacyMessage(String tag, EmailContent.Message expect, Message actual)
420            throws MessagingException {
421        assertEquals(tag, expect.mServerId, actual.getUid());
422        assertEquals(tag, expect.mServerTimeStamp, actual.getInternalDate().getTime());
423        assertEquals(tag, expect.mSubject, actual.getSubject());
424        assertEquals(tag, expect.mFrom, Address.pack(actual.getFrom()));
425        assertEquals(tag, expect.mTimeStamp, actual.getSentDate().getTime());
426        assertEquals(tag, expect.mTo, Address.pack(actual.getRecipients(RecipientType.TO)));
427        assertEquals(tag, expect.mCc, Address.pack(actual.getRecipients(RecipientType.CC)));
428        assertEquals(tag, expect.mBcc, Address.pack(actual.getRecipients(RecipientType.BCC)));
429        assertEquals(tag, expect.mReplyTo, Address.pack(actual.getReplyTo()));
430        assertEquals(tag, expect.mMessageId, ((MimeMessage)actual).getMessageId());
431        // check flags
432        assertEquals(tag, expect.mFlagRead, actual.isSet(Flag.SEEN));
433        assertEquals(tag, expect.mFlagFavorite, actual.isSet(Flag.FLAGGED));
434
435        // Check the body of the message
436        ArrayList<Part> viewables = new ArrayList<Part>();
437        ArrayList<Part> attachments = new ArrayList<Part>();
438        MimeUtility.collectParts(actual, viewables, attachments);
439        String get1Text = null;
440        String get1Html = null;
441        String get1TextReply = null;
442        String get1HtmlReply = null;
443        String get1TextIntro = null;
444        for (Part viewable : viewables) {
445            String text = MimeUtility.getTextFromPart(viewable);
446            boolean isHtml = viewable.getMimeType().equalsIgnoreCase("text/html");
447            String[] headers = viewable.getHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART);
448            if (headers != null) {
449                String header = headers[0];
450                boolean isReply = LegacyConversions.BODY_QUOTED_PART_REPLY.equalsIgnoreCase(header);
451                boolean isFwd = LegacyConversions.BODY_QUOTED_PART_FORWARD.equalsIgnoreCase(header);
452                boolean isIntro = LegacyConversions.BODY_QUOTED_PART_INTRO.equalsIgnoreCase(header);
453                if (isReply || isFwd) {
454                    if (isHtml) {
455                        get1HtmlReply = text;
456                    } else {
457                        get1TextReply = text;
458                    }
459                } else if (isIntro) {
460                    get1TextIntro = text;
461                }
462                // Check flags
463                int replyTypeFlags = expect.mFlags & EmailContent.Message.FLAG_TYPE_MASK;
464                if (isReply) {
465                    assertEquals(tag, EmailContent.Message.FLAG_TYPE_REPLY, replyTypeFlags);
466                }
467                if (isFwd) {
468                    assertEquals(tag, EmailContent.Message.FLAG_TYPE_FORWARD, replyTypeFlags);
469                }
470            } else {
471                if (isHtml) {
472                    get1Html = text;
473                } else {
474                    get1Text = text;
475                }
476            }
477        }
478        assertEquals(tag, expect.mText, get1Text);
479        assertEquals(tag, expect.mHtml, get1Html);
480        assertEquals(tag, expect.mTextReply, get1TextReply);
481        assertEquals(tag, expect.mHtmlReply, get1HtmlReply);
482        assertEquals(tag, expect.mIntroText, get1TextIntro);
483
484        // TODO Check the attachments
485
486//      cv.put("attachment_count", attachments.size());
487    }
488
489    /**
490     * Test conversion of a legacy account to a provider account
491     */
492    public void testMakeProviderAccount() throws MessagingException {
493
494        setupLegacyAccount("testMakeProviderAccount", true);
495        EmailContent.Account toAccount =
496            LegacyConversions.makeAccount(mProviderContext, mLegacyAccount);
497        checkProviderAccount("testMakeProviderAccount", mLegacyAccount, toAccount);
498    }
499
500    /**
501     * Test conversion of a provider account to a legacy account
502     */
503    public void testMakeLegacyAccount() throws MessagingException {
504        EmailContent.Account fromAccount = ProviderTestUtils.setupAccount("convert-to-legacy",
505                false, mProviderContext);
506        fromAccount.mHostAuthRecv =
507            ProviderTestUtils.setupHostAuth("legacy-recv", 0, false, mProviderContext);
508        fromAccount.mHostAuthSend =
509            ProviderTestUtils.setupHostAuth("legacy-send", 0, false, mProviderContext);
510        fromAccount.save(mProviderContext);
511
512        Account toAccount = LegacyConversions.makeLegacyAccount(mProviderContext, fromAccount);
513        checkLegacyAccount("testMakeLegacyAccount", fromAccount, toAccount);
514    }
515
516    /**
517     * Setup a legacy account in mLegacyAccount with many fields prefilled.
518     */
519    private void setupLegacyAccount(String name, boolean saveIt) {
520        // prefs & legacy account are saved for cleanup (it's stored in the real prefs file)
521        mPreferences = Preferences.getPreferences(mProviderContext);
522        mLegacyAccount = new Account(mProviderContext);
523
524        // fill in useful fields
525        mLegacyAccount.mUuid = "test-uid-" + name;
526        mLegacyAccount.mStoreUri = "store://test/" + name;
527        mLegacyAccount.mLocalStoreUri = "local://localhost/" + name;
528        mLegacyAccount.mSenderUri = "sender://test/" + name;
529        mLegacyAccount.mDescription = "description " + name;
530        mLegacyAccount.mName = "name " + name;
531        mLegacyAccount.mEmail = "email " + name;
532        mLegacyAccount.mAutomaticCheckIntervalMinutes = 100;
533        mLegacyAccount.mLastAutomaticCheckTime = 200;
534        mLegacyAccount.mNotifyNewMail = true;
535        mLegacyAccount.mDraftsFolderName = "drafts " + name;
536        mLegacyAccount.mSentFolderName = "sent " + name;
537        mLegacyAccount.mTrashFolderName = "trash " + name;
538        mLegacyAccount.mOutboxFolderName = "outbox " + name;
539        mLegacyAccount.mAccountNumber = 300;
540        mLegacyAccount.mVibrate = true;
541        mLegacyAccount.mRingtoneUri = "ringtone://test/" + name;
542        mLegacyAccount.mSyncWindow = 400;
543        mLegacyAccount.mBackupFlags = 0;
544        mLegacyAccount.mDeletePolicy = Account.DELETE_POLICY_NEVER;
545
546        if (saveIt) {
547            mLegacyAccount.save(mPreferences);
548        }
549    }
550
551    /**
552     * Compare a provider account to the legacy account it was created from
553     */
554    private void checkProviderAccount(String tag, Account expect, EmailContent.Account actual)
555            throws MessagingException {
556        assertEquals(tag + " description", expect.getDescription(), actual.mDisplayName);
557        assertEquals(tag + " email", expect.getEmail(), actual.mEmailAddress);
558        assertEquals(tag + " sync key", "", actual.mSyncKey);
559        assertEquals(tag + " lookback", expect.getSyncWindow(), actual.mSyncLookback);
560        assertEquals(tag + " sync intvl", expect.getAutomaticCheckIntervalMinutes(),
561                actual.mSyncInterval);
562        // These asserts are checking mHostAuthKeyRecv & mHostAuthKeySend
563        assertEquals(tag + " store", expect.getStoreUri(), actual.getStoreUri(mProviderContext));
564        assertEquals(tag + " sender", expect.getSenderUri(), actual.getSenderUri(mProviderContext));
565        // Synthesize & check flags
566        int expectFlags = 0;
567        if (expect.mNotifyNewMail) expectFlags |= EmailContent.Account.FLAGS_NOTIFY_NEW_MAIL;
568        if (expect.mVibrate) expectFlags |= EmailContent.Account.FLAGS_VIBRATE;
569        expectFlags |=
570            (expect.mDeletePolicy << EmailContent.Account.FLAGS_DELETE_POLICY_SHIFT)
571                & EmailContent.Account.FLAGS_DELETE_POLICY_MASK;
572        assertEquals(tag + " flags", expectFlags, actual.mFlags);
573        assertEquals(tag + " default", false, actual.mIsDefault);
574        assertEquals(tag + " uuid", expect.getUuid(), actual.mCompatibilityUuid);
575        assertEquals(tag + " name", expect.getName(), actual.mSenderName);
576        assertEquals(tag + " ringtone", expect.getRingtone(), actual.mRingtoneUri);
577        assertEquals(tag + " proto vers", expect.mProtocolVersion, actual.mProtocolVersion);
578        assertEquals(tag + " new count", 0, actual.mNewMessageCount);
579    }
580
581    /**
582     * Compare a legacy account to the provider account it was created from
583     */
584    private void checkLegacyAccount(String tag, EmailContent.Account expect, Account actual)
585            throws MessagingException {
586        int expectFlags = expect.getFlags();
587
588        assertEquals(tag + " uuid", expect.mCompatibilityUuid, actual.mUuid);
589        assertEquals(tag + " store", expect.getStoreUri(mProviderContext), actual.mStoreUri);
590        assertTrue(actual.mLocalStoreUri.startsWith("local://localhost"));
591        assertEquals(tag + " sender", expect.getSenderUri(mProviderContext), actual.mSenderUri);
592        assertEquals(tag + " description", expect.getDisplayName(), actual.mDescription);
593        assertEquals(tag + " name", expect.getSenderName(), actual.mName);
594        assertEquals(tag + " email", expect.getEmailAddress(), actual.mEmail);
595        assertEquals(tag + " checkintvl", expect.getSyncInterval(),
596                actual.mAutomaticCheckIntervalMinutes);
597        assertEquals(tag + " checktime", 0, actual.mLastAutomaticCheckTime);
598        assertEquals(tag + " notify",
599                (expectFlags & EmailContent.Account.FLAGS_NOTIFY_NEW_MAIL) != 0,
600                actual.mNotifyNewMail);
601        assertEquals(tag + " drafts", null, actual.mDraftsFolderName);
602        assertEquals(tag + " sent", null, actual.mSentFolderName);
603        assertEquals(tag + " trash", null, actual.mTrashFolderName);
604        assertEquals(tag + " outbox", null, actual.mOutboxFolderName);
605        assertEquals(tag + " acct #", -1, actual.mAccountNumber);
606        assertEquals(tag + " vibrate", (expectFlags & EmailContent.Account.FLAGS_VIBRATE) != 0,
607                actual.mVibrate);
608        assertEquals(tag + " ", expect.getRingtone(), actual.mRingtoneUri);
609        assertEquals(tag + " sync window", expect.getSyncLookback(), actual.mSyncWindow);
610        assertEquals(tag + " backup flags", 0, actual.mBackupFlags);
611        assertEquals(tag + " proto vers", expect.mProtocolVersion, actual.mProtocolVersion);
612        assertEquals(tag + " delete policy", expect.getDeletePolicy(), actual.getDeletePolicy());
613    }
614}
615