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