Rfc822OutputTests.java revision 0ed690bfb4fdfa86cb6f75c19e24b8ff39a1756c
1f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank/* 2f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Copyright (C) 2009 The Android Open Source Project 3f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * 4f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 5f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * you may not use this file except in compliance with the License. 6f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * You may obtain a copy of the License at 7f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * 8f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * http://www.apache.org/licenses/LICENSE-2.0 9f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * 10f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Unless required by applicable law or agreed to in writing, software 11f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * distributed under the License is distributed on an "AS IS" BASIS, 12f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * See the License for the specific language governing permissions and 14f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * limitations under the License. 15f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */ 16f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 17f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blankpackage com.android.email.mail.transport; 18f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 190ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport com.android.email.mail.MessagingException; 200ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport com.android.email.provider.EmailProvider; 210ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport com.android.email.provider.EmailContent.Attachment; 22f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blankimport com.android.email.provider.EmailContent.Message; 23f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 240ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.field.Field; 250ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Body; 260ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Entity; 270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Header; 280ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Multipart; 290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.content.Context; 310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.test.ProviderTestCase2; 320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayInputStream; 340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayOutputStream; 350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.IOException; 360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.ArrayList; 370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.List; 380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 39f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 40f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank/** 41f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Tests of the Rfc822Output (used for sending mail) 42f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * 43f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * You can run this entire test case with: 44f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * runtest -c com.android.email.mail.transport.Rfc822OutputTests email 45f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */ 460ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankpublic class Rfc822OutputTests extends ProviderTestCase2<EmailProvider> { 47f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String SENDER = "sender@android.com"; 48f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String REPLYTO = "replyto@android.com"; 49f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String RECIPIENT_TO = "recipient-to@android.com"; 50f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String RECIPIENT_CC = "recipient-cc@android.com"; 51f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String RECIPIENT_BCC = "recipient-bcc@android.com"; 52f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String SUBJECT = "This is the subject"; 53f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String BODY = "This is the body. This is also the body."; 541d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank private static final String TEXT = "Here is some new text."; 55f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String REPLY_BODY_SHORT = "\n\n" + SENDER + " wrote:\n\n"; 56f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String REPLY_BODY = REPLY_BODY_SHORT + ">" + BODY; 57f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 580ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank private Context mMockContext; 590ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public Rfc822OutputTests () { 610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY); 620ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 640ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank @Override 650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void setUp() throws Exception { 660ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank super.setUp(); 670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank mMockContext = getMockContext(); 680ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 690ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 70f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // TODO Create more tests here. Specifically, we should test to make sure that forward works 71f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // properly instead of just reply 72f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 732d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank // TODO Write test that ensures that bcc is handled properly (i.e. sent/not send depending 742d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank // on the flag passed to writeTo 752d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank 761d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank // TODO Localize the following test, which will not work properly in other than English 771d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank // speaking locales! 782d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank 79f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank /** 80f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Test for buildBodyText(). 81f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Compare with expected values. 82f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Also test the situation where the message has no body. 831d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * 841d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * WARNING: This test is NOT localized, so it will fail if run on a device in a 851d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * non-English speaking locale! 86f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */ 871d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank public void testBuildBodyTextWithReply() { 88f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // Create the least necessary; sender, flags, and the body of the reply 89f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank Message msg = new Message(); 90f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mText = ""; 91f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mFrom = SENDER; 92f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mFlags = Message.FLAG_TYPE_REPLY; 93f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mTextReply = BODY; 945fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank msg.mIntroText = REPLY_BODY_SHORT; 950ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 96f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 970ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank String body = Rfc822Output.buildBodyText(mMockContext, msg, true); 98f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank assertEquals(REPLY_BODY, body); 99f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 100f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // Save a different message with no reply body (so we reset the id) 101f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mId = -1; 102f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank msg.mTextReply = null; 1030ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1040ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank body = Rfc822Output.buildBodyText(mMockContext, msg, true); 105f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank assertEquals(REPLY_BODY_SHORT, body); 106f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank } 1071d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1081d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank /** 1091d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * Test for buildBodyText(). 1101d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * Compare with expected values. 1111d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank * Also test the situation where the message has no body. 1121d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank */ 1131d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank public void testBuildBodyTextWithoutReply() { 1141d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank // Create the least necessary; sender, flags, and the body of the reply 1151d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank Message msg = new Message(); 1161d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mText = TEXT; 1171d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mFrom = SENDER; 1181d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mFlags = Message.FLAG_TYPE_REPLY; 1191d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mTextReply = BODY; 1205fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank msg.mIntroText = REPLY_BODY_SHORT; 1210ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1221d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1230ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank String body = Rfc822Output.buildBodyText(mMockContext, msg, false); 124e47033245651fb2b9c4bed92f04f3c0e1e824eceMarc Blank assertEquals(TEXT + REPLY_BODY_SHORT, body); 1251d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1261d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank // Save a different message with no reply body (so we reset the id) 1271d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mId = -1; 1281d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank msg.mTextReply = null; 1290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank body = Rfc822Output.buildBodyText(mMockContext, msg, false); 131e47033245651fb2b9c4bed92f04f3c0e1e824eceMarc Blank assertEquals(TEXT + REPLY_BODY_SHORT, body); 1321d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank } 1330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToText() throws IOException, MessagingException { 1350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a simple text message 1360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 1370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 1380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 1390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 1400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1420ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 1430ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 1440ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, false, false); 1450ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1460ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 1470ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 1480ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 1490ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 1500ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 1510ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 1520ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1530ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 1540ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertFalse(mimeMessage.isMultipart()); 1550ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", mimeMessage.getMimeType()); 1560ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 1570ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1580ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank @SuppressWarnings("unchecked") 1590ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToAlternativePart() throws IOException, MessagingException { 1600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a message with alternative part 1610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 1620ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 1630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 1640ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments = new ArrayList<Attachment>(); 1650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Attach a meeting invitation, which needs to be sent as multipart/alternative 1660ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Attachment att = new Attachment(); 1670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mContentBytes = "__CONTENT__".getBytes("UTF-8"); 1680ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFlags = Attachment.FLAG_ICS_ALTERNATIVE_PART; 1690ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mMimeType = "text/calendar"; 1700ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFileName = "invite.ics"; 1710ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments.add(att); 1720ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 1730ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1740ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1750ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 1760ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 1770ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, false, false); 1780ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1790ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 1800ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 1810ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 1820ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 1830ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 1840ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 1850ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1860ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 1870ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(mimeMessage.isMultipart()); 1880ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Header header = mimeMessage.getHeader(); 1890ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Field contentType = header.getField("content-type"); 1900ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(contentType.getBody().contains("multipart/alternative")); 1910ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Multipart multipart = (Multipart)mimeMessage.getBody(); 1920ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank List<Body> partList = multipart.getBodyParts(); 1930ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals(2, partList.size()); 1940ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Entity part = (Entity)partList.get(0); 1950ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", part.getMimeType()); 1960ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank part = (Entity)partList.get(1); 1970ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/calendar", part.getMimeType()); 1980ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank header = part.getHeader(); 1990ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertNull(header.getField("content-disposition")); 2000ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 2010ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2020ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToMixedPart() throws IOException, MessagingException { 2030ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a message with a mixed part 2040ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 2050ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 2060ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 2070ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments = new ArrayList<Attachment>(); 2080ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Attach a simple html "file" 2090ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Attachment att = new Attachment(); 2100ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mContentBytes = "<html>Hi</html>".getBytes("UTF-8"); 2110ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mMimeType = "text/html"; 2120ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFileName = "test.html"; 2130ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments.add(att); 2140ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 2150ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 2160ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2170ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 2180ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 2190ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, false, false); 2200ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2210ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 2220ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 2230ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 2240ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 2250ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 2260ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 2270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2280ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 2290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(mimeMessage.isMultipart()); 2300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Header header = mimeMessage.getHeader(); 2310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Field contentType = header.getField("content-type"); 2320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(contentType.getBody().contains("multipart/mixed")); 2330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Multipart multipart = (Multipart)mimeMessage.getBody(); 2340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank List<Body> partList = multipart.getBodyParts(); 2350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals(2, partList.size()); 2360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Entity part = (Entity)partList.get(0); 2370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", part.getMimeType()); 2380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank part = (Entity)partList.get(1); 2390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/html", part.getMimeType()); 2400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank header = part.getHeader(); 2410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertNotNull(header.getField("content-disposition")); 2420ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 2430ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank} 244