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