2014-01-25 00:43:36 +00:00
|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
|
2014-05-21 17:25:08 +00:00
|
|
|
import android.content.Context;
|
2014-01-25 00:43:36 +00:00
|
|
|
import android.test.AndroidTestCase;
|
2014-05-21 17:25:08 +00:00
|
|
|
import android.test.suitebuilder.annotation.SmallTest;
|
2014-01-25 00:43:36 +00:00
|
|
|
|
2014-05-21 17:25:08 +00:00
|
|
|
import com.android.emailcommon.TempDirectory;
|
2014-01-25 00:43:36 +00:00
|
|
|
import com.android.emailcommon.internet.MimeBodyPart;
|
|
|
|
import com.android.emailcommon.internet.MimeMessage;
|
2014-05-21 17:25:08 +00:00
|
|
|
import com.android.emailcommon.internet.MimeMultipart;
|
2014-01-25 00:43:36 +00:00
|
|
|
import com.android.emailcommon.mail.Address;
|
|
|
|
import com.android.emailcommon.mail.Message.RecipientType;
|
|
|
|
import com.android.emailcommon.mail.MessagingException;
|
2014-05-21 17:25:08 +00:00
|
|
|
import com.android.emailcommon.mail.Multipart;
|
2014-01-25 00:43:36 +00:00
|
|
|
import com.android.emailcommon.mail.Part;
|
|
|
|
import com.android.emailcommon.provider.EmailContent;
|
2014-05-21 17:25:08 +00:00
|
|
|
import com.android.emailcommon.provider.EmailContent.Attachment;
|
2014-01-25 00:43:36 +00:00
|
|
|
import com.android.emailcommon.utility.ConversionUtilities;
|
|
|
|
import com.android.emailcommon.utility.ConversionUtilities.BodyFieldData;
|
|
|
|
|
2014-05-21 17:25:08 +00:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.OutputStream;
|
2014-01-25 00:43:36 +00:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Date;
|
|
|
|
|
2014-05-21 17:25:08 +00:00
|
|
|
@SmallTest
|
2014-01-25 00:43:36 +00:00
|
|
|
public class LegacyConversionsTest extends AndroidTestCase {
|
|
|
|
|
2014-05-21 17:25:08 +00:00
|
|
|
@Override
|
|
|
|
protected void setUp() throws Exception {
|
|
|
|
super.setUp();
|
|
|
|
TempDirectory.setTempDirectory(getContext());
|
|
|
|
}
|
|
|
|
|
2014-01-25 00:43:36 +00:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
}
|
2014-05-21 17:25:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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");
|
|
|
|
}
|
2014-01-25 00:43:36 +00:00
|
|
|
}
|