| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.email; |
| |
| import android.content.Context; |
| import android.test.AndroidTestCase; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| import com.android.emailcommon.TempDirectory; |
| import com.android.emailcommon.internet.MimeBodyPart; |
| import com.android.emailcommon.internet.MimeMessage; |
| import com.android.emailcommon.internet.MimeMultipart; |
| import com.android.emailcommon.mail.Address; |
| import com.android.emailcommon.mail.Message.RecipientType; |
| import com.android.emailcommon.mail.MessagingException; |
| import com.android.emailcommon.mail.Multipart; |
| import com.android.emailcommon.mail.Part; |
| import com.android.emailcommon.provider.EmailContent; |
| import com.android.emailcommon.provider.EmailContent.Attachment; |
| import com.android.emailcommon.utility.ConversionUtilities; |
| import com.android.emailcommon.utility.ConversionUtilities.BodyFieldData; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.util.ArrayList; |
| import java.util.Date; |
| |
| @SmallTest |
| public class LegacyConversionsTest extends AndroidTestCase { |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| TempDirectory.setTempDirectory(getContext()); |
| } |
| |
| /** |
| * Test basic fields conversion from Store message to Provider message. |
| */ |
| public void testUpdateMessageFields_Basic() throws MessagingException { |
| final MimeMessage message = new MimeMessage(); |
| message.setUid("UID.12345678"); |
| message.setSentDate(new Date(1)); |
| message.setMessageId("Test-Message-ID"); |
| message.setSubject("This is the subject"); |
| |
| final EmailContent.Message localMessage = new EmailContent.Message(); |
| final boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); |
| assertTrue(result); |
| |
| assertEquals(message.getUid(), localMessage.mServerId); |
| assertEquals(message.getSubject(), localMessage.mSubject); |
| assertEquals(message.getMessageId(), localMessage.mMessageId); |
| assertEquals(message.getSentDate().getTime(), localMessage.mTimeStamp); |
| } |
| |
| /** |
| * Test the conversion of plain ASCII (not MIME-encoded) email addresses. |
| */ |
| public void testUpdateMessageFields_PlainAddresses() throws MessagingException { |
| // create plain ASCII email addresses |
| final String fromList = "Sender <sender@droid.com>"; |
| final String replyToList = "Reply1 <reply1@droid.com>,Reply2 <reply2@droid.com>"; |
| final String toList = "ToA <toA@droid.com>,ToB <toB@droid.com>"; |
| final String ccList = "CcA <ccA@droid.com>,CcB <ccB@droid.com>"; |
| final String bccList = "BccA <bccA@droid.com>,Bcc2 <bccB@droid.com>"; |
| |
| // parse the addresses |
| final Address from = Address.fromHeader(fromList)[0]; |
| final Address[] replies = Address.fromHeader(replyToList); |
| final Address[] tos = Address.fromHeader(toList); |
| final Address[] ccs = Address.fromHeader(ccList); |
| final Address[] bccs = Address.fromHeader(bccList); |
| |
| // make a message with the email addresses |
| final MimeMessage message = new MimeMessage(); |
| message.setFrom(from); |
| message.setReplyTo(replies); |
| message.setRecipients(RecipientType.TO, tos); |
| message.setRecipients(RecipientType.CC, ccs); |
| message.setRecipients(RecipientType.BCC, bccs); |
| |
| // convert the message to a local message using the conversation method |
| final EmailContent.Message localMessage = new EmailContent.Message(); |
| final boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); |
| assertTrue(result); |
| |
| // verify that we will store the email addresses in decoded form |
| assertEquals(fromList, localMessage.mFrom); |
| assertEquals(replyToList, localMessage.mReplyTo); |
| assertEquals(toList, localMessage.mTo); |
| assertEquals(ccList, localMessage.mCc); |
| assertEquals(bccList, localMessage.mBcc); |
| } |
| |
| /** |
| * Test the conversion of MIME-encoded non-ASCII email addresses. |
| */ |
| public void testUpdateMessageFields_EncodedAddresses() throws MessagingException { |
| final String e = "=?EUC-KR?B?uvG50Ln4yKO4pg==?="; // Mime Encoded value of 비밀번호를 |
| final String d = "\uBE44\uBC00\uBC88\uD638\uB97C"; // Mime Decoded value of e |
| |
| // create the email address in encoded form |
| String fromList = String.format("%s <sender@droid.com>", e); |
| String replyToList = String.format("%s <reply1@droid.com>,%s <reply2@droid.com>", e, e); |
| String toList = String.format("%s <toA@droid.com>,%s <toB@droid.com>", e, e); |
| String ccList = String.format("%s <ccA@droid.com>,%s <ccB@droid.com>", e, e); |
| String bccList = String.format("%s <bccA@droid.com>,%s <bccB@droid.com>", e, e); |
| |
| // parse the encoded addresses |
| final Address from = Address.fromHeader(fromList)[0]; |
| final Address[] replies = Address.fromHeader(replyToList); |
| final Address[] tos = Address.fromHeader(toList); |
| final Address[] ccs = Address.fromHeader(ccList); |
| final Address[] bccs = Address.fromHeader(bccList); |
| |
| // make a message with the email addresses |
| final MimeMessage message = new MimeMessage(); |
| message.setFrom(from); |
| message.setReplyTo(replies); |
| message.setRecipients(RecipientType.TO, tos); |
| message.setRecipients(RecipientType.CC, ccs); |
| message.setRecipients(RecipientType.BCC, bccs); |
| |
| // convert the message to a local message using the conversion method |
| final EmailContent.Message localMessage = new EmailContent.Message(); |
| final boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); |
| assertTrue(result); |
| |
| // verify that we will store the email addresses in decoded form |
| String decodedFrom = String.format("%s <sender@droid.com>", d); |
| String decodedReply = String.format("%s <reply1@droid.com>,%s <reply2@droid.com>", d, d); |
| String decodedTo = String.format("%s <toA@droid.com>,%s <toB@droid.com>", d, d); |
| String decodedCc = String.format("%s <ccA@droid.com>,%s <ccB@droid.com>", d, d); |
| String decodedBcc = String.format("%s <bccA@droid.com>,%s <bccB@droid.com>", d, d); |
| |
| assertEquals(decodedFrom, localMessage.mFrom); |
| assertEquals(decodedReply, localMessage.mReplyTo); |
| assertEquals(decodedTo, localMessage.mTo); |
| assertEquals(decodedCc, localMessage.mCc); |
| assertEquals(decodedBcc, localMessage.mBcc); |
| } |
| |
| /** |
| * Test basic conversion from Store message to Provider message, when the provider message |
| * does not have a proper message-id. |
| */ |
| public void testUpdateMessageFields_NoMessageId() throws MessagingException { |
| final MimeMessage message = new MimeMessage(); |
| // set, then remove the message id |
| message.setMessageId("Test-Message-ID"); |
| message.removeHeader("Message-ID"); |
| |
| // create a local message with an ID |
| final EmailContent.Message localMessage = new EmailContent.Message(); |
| localMessage.mMessageId = "Test-Message-ID-Second"; |
| |
| final boolean result = LegacyConversions.updateMessageFields(localMessage, message, 1, 1); |
| assertTrue(result); |
| assertEquals("Test-Message-ID-Second", localMessage.mMessageId); |
| } |
| |
| /** |
| * Basic test of body parts conversion from Store message to Provider message. |
| * This tests that a null body part simply results in null text, and does not crash |
| * or return "null". |
| */ |
| public void testUpdateBodyFieldsNullText() throws MessagingException { |
| ArrayList<Part> viewables = new ArrayList<Part>(); |
| viewables.add(new MimeBodyPart(null, "text/plain")); |
| |
| // a "null" body part of type text/plain should result in a null mTextContent |
| final BodyFieldData data = ConversionUtilities.parseBodyFields(viewables); |
| assertNull(data.textContent); |
| } |
| |
| /** |
| * Test adding an attachment to a message, and then parsing it back out. |
| * @throws MessagingException |
| */ |
| public void testAttachmentRoundTrip() throws Exception { |
| final Context context = getContext(); |
| final MimeMultipart mp = new MimeMultipart(); |
| mp.setSubType("mixed"); |
| |
| final long size; |
| |
| final File tempDir = context.getCacheDir(); |
| if (!tempDir.isDirectory() && !tempDir.mkdirs()) { |
| fail("Could not create temporary directory"); |
| } |
| |
| final File tempAttachmentFile = File.createTempFile("testAttachmentRoundTrip", ".txt", |
| tempDir); |
| |
| try { |
| final OutputStream attOut = new FileOutputStream(tempAttachmentFile); |
| try { |
| attOut.write("TestData".getBytes()); |
| } finally { |
| attOut.close(); |
| } |
| size = tempAttachmentFile.length(); |
| final InputStream attIn = new FileInputStream(tempAttachmentFile); |
| LegacyConversions.addAttachmentPart(mp, "text/plain", size, "test.txt", |
| "testContentId", attIn); |
| } finally { |
| if (!tempAttachmentFile.delete()) { |
| fail("Setup failure: Could not clean up temp file"); |
| } |
| } |
| |
| final MimeMessage outMessage = new MimeMessage(); |
| outMessage.setBody(mp); |
| |
| final MimeMessage inMessage; |
| |
| final File tempBodyFile = File.createTempFile("testAttachmentRoundTrip", ".eml", |
| context.getCacheDir()); |
| try { |
| final OutputStream bodyOut = new FileOutputStream(tempBodyFile); |
| try { |
| outMessage.writeTo(bodyOut); |
| } finally { |
| bodyOut.close(); |
| } |
| final InputStream bodyIn = new FileInputStream(tempBodyFile); |
| try { |
| inMessage = new MimeMessage(bodyIn); |
| } finally { |
| bodyIn.close(); |
| } |
| } finally { |
| if (!tempBodyFile.delete()) { |
| fail("Setup failure: Could not clean up temp file"); |
| } |
| } |
| final Multipart inBody = (Multipart) inMessage.getBody(); |
| final Part attPart = inBody.getBodyPart(0); |
| final Attachment att = LegacyConversions.mimePartToAttachment(attPart); |
| assertEquals(att.mFileName, "test.txt"); |
| assertEquals(att.mMimeType, "text/plain"); |
| assertEquals(att.mSize, size); |
| assertEquals(att.mContentId, "testContentId"); |
| } |
| } |