LegacyConversionsTests.java revision 3f1ac4da947f426775c9546f2e37206f58ce1a6e
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
193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.BodyPart;
203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Message;
213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils;
223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessagingException;
233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Part;
243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MessageBuilder;
253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessageTestUtils.MultipartBuilder;
263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeHeader;
273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeUtility;
283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent;
293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailProvider;
303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.ProviderTestUtils;
313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.Attachment;
323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentUris;
343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.Context;
353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.database.Cursor;
363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.net.Uri;
373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.test.ProviderTestCase2;
383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.IOException;
403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.ArrayList;
413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler/**
433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Tests of the Legacy Conversions code (used by MessagingController).
443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler *
453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * NOTE:  It would probably make sense to rewrite this using a MockProvider, instead of the
463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * ProviderTestCase (which is a real provider running on a temp database).  This would be more of
473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * a true "unit test".
483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler *
493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * You can run this entire test case with:
503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler *   runtest -c com.android.email.LegacyConversionsTests email
513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */
523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpublic class LegacyConversionsTests extends ProviderTestCase2<EmailProvider> {
533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    EmailProvider mProvider;
553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    Context mProviderContext;
563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    Context mContext;
573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    public LegacyConversionsTests() {
593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY);
603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    }
613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    @Override
633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    public void setUp() throws Exception {
643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        super.setUp();
653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        mProviderContext = getMockContext();
663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        mContext = getContext();
673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    }
683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    @Override
703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    public void tearDown() throws Exception {
713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        super.tearDown();
723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    }
733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    /**
753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO: basic Legacy -> Provider Message conversions
763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO: basic Legacy -> Provider Body conversions
773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO: rainy day tests of all kinds
783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     */
793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    /**
813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * Sunny day test of adding attachments from an IMAP message.
823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     */
833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    public void testAddAttachments() throws MessagingException, IOException {
843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        // Prepare a local message to add the attachments to
853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        final long accountId = 1;
863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        final long mailboxId = 1;
873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        final EmailContent.Message localMessage = ProviderTestUtils.setupMessage(
883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                "local-message", accountId, mailboxId, false, true, mProviderContext);
893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        // Prepare a legacy message with attachments
913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        Part attachment1Part = MessageTestUtils.bodyPart("image/gif", null);
923f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment1Part.setHeader(MimeHeader.HEADER_CONTENT_TYPE,
933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                "image/gif;\n name=\"attachment1\"");
943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment1Part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment1Part.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION,
963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                "attachment;\n filename=\"attachment1\";\n size=100");
973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment1Part.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "101");
983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        Part attachment2Part = MessageTestUtils.bodyPart("image/jpg", null);
1003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment2Part.setHeader(MimeHeader.HEADER_CONTENT_TYPE,
1013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                "image/jpg;\n name=\"attachment2\"");
1023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment2Part.setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64");
1033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment2Part.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION,
1043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                "attachment;\n filename=\"attachment2\";\n size=200");
1053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        attachment2Part.setHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA, "102");
1063f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1073f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        final Message legacyMessage = new MessageBuilder()
1083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            .setBody(new MultipartBuilder("multipart/mixed")
1093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                     .addBodyPart(MessageTestUtils.bodyPart("text/html", null))
1103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                     .addBodyPart(new MultipartBuilder("multipart/mixed")
1113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                             .addBodyPart((BodyPart)attachment1Part)
1123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                             .addBodyPart((BodyPart)attachment2Part)
1133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                             .buildBodyPart())
1143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                     .build())
1153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                .build();
1163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        // Now, convert from legacy to provider and see what happens
1183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        ArrayList<Part> viewables = new ArrayList<Part>();
1193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        ArrayList<Part> attachments = new ArrayList<Part>();
1203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        MimeUtility.collectParts(legacyMessage, viewables, attachments);
1213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        LegacyConversions.updateAttachments(mProviderContext, localMessage, attachments);
1223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        // Read back all attachments for message and check field values
1243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
1253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        Cursor c = mProviderContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
1263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                null, null, null);
1273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        try {
1283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            assertEquals(2, c.getCount());
1293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            while (c.moveToNext()) {
1303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                Attachment attachment = Attachment.getContent(c, Attachment.class);
1313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                if ("101".equals(attachment.mLocation)) {
1323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                    checkAttachment("attachment1Part", attachment1Part, attachment);
1333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                } else if ("102".equals(attachment.mLocation)) {
1343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                    checkAttachment("attachment2Part", attachment2Part, attachment);
1353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                } else {
1363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                    fail("Unexpected attachment with location " + attachment.mLocation);
1373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler                }
1383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            }
1393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        } finally {
1403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            c.close();
1413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        }
1423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    }
1433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    /**
1453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * Compare attachment that was converted from Part (expected) to Provider Attachment (actual)
1463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     *
1473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO content URI should only be set if we also saved a file
1483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO other data encodings
1493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     */
1503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    private void checkAttachment(String tag, Part expected, EmailContent.Attachment actual)
1513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            throws MessagingException {
1523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        String contentType = MimeUtility.unfoldAndDecode(expected.getContentType());
1533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        String expectedName = MimeUtility.getHeaderParameter(contentType, "name");
1543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, expectedName, actual.mFileName);
1553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, expected.getMimeType(), actual.mMimeType);
1563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        String disposition = expected.getDisposition();
1573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        String sizeString = MimeUtility.getHeaderParameter(disposition, "size");
1583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        long expectedSize = Long.parseLong(sizeString);
1593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, expectedSize, actual.mSize);
1603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, expected.getContentId(), actual.mContentId);
1613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertNull(tag, actual.mContentUri);
1623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertTrue(tag, 0 != actual.mMessageKey);
1633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        String expectedPartId =
1643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler            expected.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA)[0];
1653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, expectedPartId, actual.mLocation);
1663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler        assertEquals(tag, "B", actual.mEncoding);
1673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    }
1683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler    /**
1703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     * TODO: Sunny day test of adding attachments from a POP message.
1713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler     */
1723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler
1733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler}
174