Rfc822OutputTests.java revision 0d49ef78ebc1b0d65c31241f5b38f95397eebe34
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 1731d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankpackage com.android.emailcommon.internet; 18f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 1980ee607a7cc784993a48741d0dfbd132cd546985Marc Blankimport com.android.email.R; 200ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport com.android.email.provider.EmailProvider; 2131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.internet.Rfc822Output; 222193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.MessagingException; 2331d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.provider.EmailContent; 24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment; 25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message; 26f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.field.Field; 288546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedyimport org.apache.james.mime4j.message.BodyPart; 290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Entity; 300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Header; 310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Multipart; 320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.content.Context; 340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.test.ProviderTestCase2; 350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayInputStream; 370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayOutputStream; 380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.IOException; 390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.ArrayList; 400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.List; 410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 42f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 43f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank/** 44f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Tests of the Rfc822Output (used for sending mail) 45f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * 46f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * You can run this entire test case with: 47f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * runtest -c com.android.email.mail.transport.Rfc822OutputTests email 48f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */ 490ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankpublic class Rfc822OutputTests extends ProviderTestCase2<EmailProvider> { 50f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String SENDER = "sender@android.com"; 51f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String RECIPIENT_TO = "recipient-to@android.com"; 52f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String RECIPIENT_CC = "recipient-cc@android.com"; 53f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String SUBJECT = "This is the subject"; 54f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank private static final String BODY = "This is the body. This is also the body."; 551d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank private static final String TEXT = "Here is some new text."; 56f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 570ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank private Context mMockContext; 5880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank private String mForwardIntro; 5980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank private String mReplyIntro; 600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public Rfc822OutputTests () { 6231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank super(EmailProvider.class, EmailContent.AUTHORITY); 630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 640ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank @Override 660ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void setUp() throws Exception { 670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank super.setUp(); 680ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank mMockContext = getMockContext(); 6980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank mForwardIntro = mMockContext.getString(R.string.message_compose_fwd_header_fmt, SUBJECT, 7080ee607a7cc784993a48741d0dfbd132cd546985Marc Blank SENDER, RECIPIENT_TO, RECIPIENT_CC); 7180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank mReplyIntro = mMockContext.getString(R.string.message_compose_reply_header_fmt, SENDER); 720ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 730ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 74f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // TODO Create more tests here. Specifically, we should test to make sure that forward works 75f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // properly instead of just reply 76f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 772d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank // TODO Write test that ensures that bcc is handled properly (i.e. sent/not send depending 782d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank // on the flag passed to writeTo 792d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank 80f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank /** 81f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Test for buildBodyText(). 82f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Compare with expected values. 83f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Also test the situation where the message has no body. 84f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */ 850d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy public void testBuildBodyText() { 860d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy // Test sending a message *without* using smart reply 870d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy Message message1 = new Message(); 880d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mText = ""; 890d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mFrom = SENDER; 900d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mFlags = Message.FLAG_TYPE_REPLY; 910d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mTextReply = BODY; 920d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mIntroText = mReplyIntro; 930d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.save(mMockContext); 940d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy 950d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy String body1 = Rfc822Output.buildBodyText(mMockContext, message1, false); 960d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(mReplyIntro + ">" + BODY, body1); 970d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy 980d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mId = -1; 990d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mText = TEXT; 1000d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.save(mMockContext); 101f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 1020d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy body1 = Rfc822Output.buildBodyText(mMockContext, message1, false); 1030d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(TEXT + mReplyIntro + ">" + BODY, body1); 104f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank 105f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank // Save a different message with no reply body (so we reset the id) 1060d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mId = -1; 1070d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.mTextReply = null; 1080d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message1.save(mMockContext); 1090d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy body1 = Rfc822Output.buildBodyText(mMockContext, message1, false); 1100d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(TEXT + mReplyIntro, body1); 1111d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1120d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy // Test sending a message *with* using smart reply 1130d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy Message message2 = new Message(); 1140d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mText = ""; 1150d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mFrom = SENDER; 1160d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mFlags = Message.FLAG_TYPE_REPLY; 1170d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mTextReply = BODY; 1180d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mIntroText = mReplyIntro; 1190d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.save(mMockContext); 1201d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1210d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy String body2 = Rfc822Output.buildBodyText(mMockContext, message2, true); 1220d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(mReplyIntro, body2); 1230d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy 1240d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mId = -1; 1250d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mText = TEXT; 1260d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.save(mMockContext); 1270d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy 1280d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy body2 = Rfc822Output.buildBodyText(mMockContext, message2, true); 1290d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(TEXT + mReplyIntro, body2); 1301d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank 1311d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank // Save a different message with no reply body (so we reset the id) 1320d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mId = -1; 1330d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.mTextReply = null; 1340d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy message2.save(mMockContext); 1350d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy body2 = Rfc822Output.buildBodyText(mMockContext, message2, true); 1360d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy assertEquals(TEXT + mReplyIntro, body2); 13780ee607a7cc784993a48741d0dfbd132cd546985Marc Blank } 13880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank 13980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank /** 14080ee607a7cc784993a48741d0dfbd132cd546985Marc Blank * Test for buildBodyText(). 14180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank * Compare with expected values. 14280ee607a7cc784993a48741d0dfbd132cd546985Marc Blank */ 14380ee607a7cc784993a48741d0dfbd132cd546985Marc Blank public void testBuildBodyTextWithForward() { 14480ee607a7cc784993a48741d0dfbd132cd546985Marc Blank Message msg = new Message(); 14580ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mText = TEXT; 14680ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mFrom = SENDER; 14780ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mTo = RECIPIENT_TO; 14880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mCc = RECIPIENT_CC; 14980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mSubject = SUBJECT; 15080ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mFlags = Message.FLAG_TYPE_FORWARD; 15180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mTextReply = BODY; 15280ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.mIntroText = mForwardIntro; 15380ee607a7cc784993a48741d0dfbd132cd546985Marc Blank msg.save(mMockContext); 1540d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy String body = Rfc822Output.buildBodyText(mMockContext, msg, false); 15580ee607a7cc784993a48741d0dfbd132cd546985Marc Blank assertEquals(TEXT + mForwardIntro + BODY, body); 1561d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank } 1570ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1580ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToText() throws IOException, MessagingException { 1590ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a simple text message 1600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 1610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 1620ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 1630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 1640ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1660ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 1670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 1680d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false); 1690ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1700ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 1710ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 1720ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 1730ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 1740ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 1750ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 1760ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1770ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 1786bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler checkMimeVersion(mimeMessage); 1790ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertFalse(mimeMessage.isMultipart()); 1800ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", mimeMessage.getMimeType()); 1810ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 1820ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 1830ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank @SuppressWarnings("unchecked") 1840ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToAlternativePart() throws IOException, MessagingException { 1850ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a message with alternative part 1860ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 1870ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 1880ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 1890ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments = new ArrayList<Attachment>(); 1900ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Attach a meeting invitation, which needs to be sent as multipart/alternative 1910ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Attachment att = new Attachment(); 1920ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mContentBytes = "__CONTENT__".getBytes("UTF-8"); 1930ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFlags = Attachment.FLAG_ICS_ALTERNATIVE_PART; 1940ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mMimeType = "text/calendar"; 1950ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFileName = "invite.ics"; 1960ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments.add(att); 1970ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 1980ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 1990ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2000ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 2010ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 2020d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false); 2030ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2040ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 2050ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 2060ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 2070ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 2080ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 2090ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 2100ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2110ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 2126bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler checkMimeVersion(mimeMessage); 2130ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(mimeMessage.isMultipart()); 2140ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Header header = mimeMessage.getHeader(); 2150ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Field contentType = header.getField("content-type"); 2160ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(contentType.getBody().contains("multipart/alternative")); 2170ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Multipart multipart = (Multipart)mimeMessage.getBody(); 2188546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy List<BodyPart> partList = multipart.getBodyParts(); 2190ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals(2, partList.size()); 2208546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy Entity part = partList.get(0); 2210ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", part.getMimeType()); 2228546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy part = partList.get(1); 2230ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/calendar", part.getMimeType()); 2240ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank header = part.getHeader(); 2250ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertNull(header.getField("content-disposition")); 2260ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 2270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 22880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank @SuppressWarnings("unchecked") 2290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank public void testWriteToMixedPart() throws IOException, MessagingException { 2300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Create a message with a mixed part 2310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Message msg = new Message(); 2320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mText = TEXT; 2330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mFrom = SENDER; 2340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments = new ArrayList<Attachment>(); 2350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Attach a simple html "file" 2360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Attachment att = new Attachment(); 2370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mContentBytes = "<html>Hi</html>".getBytes("UTF-8"); 2380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mMimeType = "text/html"; 2390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank att.mFileName = "test.html"; 2400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.mAttachments.add(att); 2410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Save this away 2420ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank msg.save(mMockContext); 2430ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2440ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Write out an Rfc822 message 2450ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 2460d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false); 2470ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2480ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Get the message and create a mime4j message from it 2490ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // We'll take advantage of its parsing capabilities 2500ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank ByteArrayInputStream messageInputStream = 2510ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new ByteArrayInputStream(byteStream.toByteArray()); 2520ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank org.apache.james.mime4j.message.Message mimeMessage = 2530ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank new org.apache.james.mime4j.message.Message(messageInputStream); 2540ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank 2550ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank // Make sure its structure is correct 2566bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler checkMimeVersion(mimeMessage); 2570ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(mimeMessage.isMultipart()); 2580ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Header header = mimeMessage.getHeader(); 2590ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Field contentType = header.getField("content-type"); 2600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertTrue(contentType.getBody().contains("multipart/mixed")); 2610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank Multipart multipart = (Multipart)mimeMessage.getBody(); 2628546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy List<BodyPart> partList = multipart.getBodyParts(); 2630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals(2, partList.size()); 2648546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy Entity part = partList.get(0); 2650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/plain", part.getMimeType()); 2668546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy part = partList.get(1); 2670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertEquals("text/html", part.getMimeType()); 2680ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank header = part.getHeader(); 2690ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank assertNotNull(header.getField("content-disposition")); 2700ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank } 2716bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler 2726bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler /** 2736bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler * Confirm that the constructed message includes "MIME-VERSION: 1.0" 2746bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler */ 2756bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler private void checkMimeVersion(org.apache.james.mime4j.message.Message mimeMessage) { 2766bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler Header header = mimeMessage.getHeader(); 2776bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler Field contentType = header.getField("MIME-VERSION"); 2786bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler assertTrue(contentType.getBody().equals("1.0")); 2796bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler } 2800ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank} 281