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;
259cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedyimport com.android.emailcommon.provider.EmailContent.Body;
26a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
27f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
280ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.field.Field;
298546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedyimport org.apache.james.mime4j.message.BodyPart;
300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Entity;
310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Header;
320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport org.apache.james.mime4j.message.Multipart;
330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.content.Context;
350ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport android.test.ProviderTestCase2;
360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayInputStream;
380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.ByteArrayOutputStream;
390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.io.IOException;
400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.ArrayList;
410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankimport java.util.List;
420ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
43f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
44f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank/**
45f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * Tests of the Rfc822Output (used for sending mail)
46f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank *
47f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank * You can run this entire test case with:
48f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank *   runtest -c com.android.email.mail.transport.Rfc822OutputTests email
49f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank */
500ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blankpublic class Rfc822OutputTests extends ProviderTestCase2<EmailProvider> {
51f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    private static final String SENDER = "sender@android.com";
52f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    private static final String RECIPIENT_TO = "recipient-to@android.com";
53f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    private static final String RECIPIENT_CC = "recipient-cc@android.com";
54f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    private static final String SUBJECT = "This is the subject";
559cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static final String REPLY_TEXT_BODY = "This is the body.  This is also the body.";
569cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    /** HTML reply body */
579cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static final String BODY_HTML_REPLY =
589cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            "<a href=\"m.google.com\">This</a> is the body.<br>This is also the body.";
599cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    /** Text-only version of the HTML reply body */
609cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static final String BODY_TEXT_REPLY_HTML =
619cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        ">This is the body.\n>This is also the body.";
621d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank    private static final String TEXT = "Here is some new text.";
63f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
649cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    // Full HTML document
659cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_FULL_BODY = "<html><head><title>MyTitle</title></head>"
669cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            + "<body bgcolor=\"#ffffff\" text=\"#000000\">"
679cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            + "<a href=\"google.com\">test1</a></body></html>";
689cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_FULL_RESULT = "<a href=\"google.com\">test1</a>";
699cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    // <body/> element w/ content
709cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_BODY_BODY =
719cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            "<body bgcolor=\"#ffffff\" text=\"#000000\"><a href=\"google.com\">test2</a></body>";
729cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_BODY_RESULT = "<a href=\"google.com\">test2</a>";
739cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    // No <body/> tag; just content
749cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_NO_BODY_BODY =
759cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            "<a href=\"google.com\">test3</a>";
769cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String HTML_NO_BODY_RESULT = "<a href=\"google.com\">test3</a>";
779cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
789cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String REPLY_INTRO_TEXT = "\n\n" + SENDER + " wrote:\n\n";
799cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private static String REPLY_INTRO_HTML = "<br><br>" + SENDER + " wrote:<br><br>";
800ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    private Context mMockContext;
8180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank    private String mForwardIntro;
820ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
830ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    public Rfc822OutputTests () {
8431d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
850ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    }
860ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
870ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    @Override
880ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    public void setUp() throws Exception {
890ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        super.setUp();
900ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        mMockContext = getMockContext();
9180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        mForwardIntro = mMockContext.getString(R.string.message_compose_fwd_header_fmt, SUBJECT,
9280ee607a7cc784993a48741d0dfbd132cd546985Marc Blank                SENDER, RECIPIENT_TO, RECIPIENT_CC);
930ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    }
940ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
95f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    // TODO Create more tests here.  Specifically, we should test to make sure that forward works
96f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    // properly instead of just reply
97f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
982d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank    // TODO Write test that ensures that bcc is handled properly (i.e. sent/not send depending
992d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank    // on the flag passed to writeTo
1002d5691cac1874eb3491353ab608a84c2a75e2b62Marc Blank
1019cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private Message createTestMessage(String text, boolean save) {
1029cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Message message = new Message();
1039cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mText = text;
1049cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mFrom = SENDER;
1059cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mFlags = Message.FLAG_TYPE_REPLY;
1069cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mTextReply = REPLY_TEXT_BODY;
1079cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mHtmlReply = BODY_HTML_REPLY;
1089cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mIntroText = REPLY_INTRO_TEXT;
1099cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        if (save) {
1109cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            message.save(mMockContext);
1119cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        }
1129cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        return message;
1139cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
1149cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1159cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private Body createTestBody(Message message) {
1169cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Body body = Body.restoreBodyWithMessageId(mMockContext, message.mId);
1179cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        return body;
1189cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
1199cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
120f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank    /**
121f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank     * Test for buildBodyText().
122f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank     * Compare with expected values.
123f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank     * Also test the situation where the message has no body.
124f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank     */
1250d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy    public void testBuildBodyText() {
1260d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        // Test sending a message *without* using smart reply
1279cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Message message1 = createTestMessage("", true);
1289cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Body body1 = createTestBody(message1);
1299cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        String[] bodyParts;
1300d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy
1319cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body1, message1.mFlags, false);
1329cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(REPLY_INTRO_TEXT + ">" + REPLY_TEXT_BODY, bodyParts[0]);
1330d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy
1349cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message1.mId = -1;        // Changing the message; need to reset the id
1350d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message1.mText = TEXT;
1360d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message1.save(mMockContext);
1379cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body1 = createTestBody(message1);
138f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
1399cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body1, message1.mFlags, false);
1409cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT + ">" + REPLY_TEXT_BODY, bodyParts[0]);
141f2dded3a2fba83dd3f0d14cce6abe467a4ab66ebMarc Blank
1429cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // We have an HTML reply and no text reply; use the HTML reply
1439cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message1.mId = -1;        // Changing the message; need to reset the id
1440d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message1.mTextReply = null;
1450d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message1.save(mMockContext);
1469cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body1 = createTestBody(message1);
1479cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1489cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body1, message1.mFlags, false);
1499cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT + BODY_TEXT_REPLY_HTML, bodyParts[0]);
1509cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1519cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // We have no HTML or text reply; use nothing
1529cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message1.mId = -1;        // Changing the message; need to reset the id
1539cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message1.mHtmlReply = null;
1549cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message1.save(mMockContext);
1559cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body1 = createTestBody(message1);
1569cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1579cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body1, message1.mFlags, false);
1589cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT, bodyParts[0]);
1591d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank
1600d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        // Test sending a message *with* using smart reply
1619cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Message message2 = createTestMessage("", true);
1629cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Body body2 = createTestBody(message2);
1631d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank
1649cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body2, message2.mFlags, true);
1659cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(REPLY_INTRO_TEXT, bodyParts[0]);
1660d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy
1679cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.mId = -1;        // Changing the message; need to reset the id
1680d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message2.mText = TEXT;
1690d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message2.save(mMockContext);
1709cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body2 = createTestBody(message2);
1710d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy
1729cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body2, message2.mFlags, true);
1739cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT, bodyParts[0]);
1741d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank
1759cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // We have an HTML reply and no text reply; use nothing (smart reply)
1769cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.mId = -1;        // Changing the message; need to reset the id
1770d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message2.mTextReply = null;
1780d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        message2.save(mMockContext);
1799cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body2 = createTestBody(message2);
1809cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1819cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body2, message2.mFlags, true);
1829cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT, bodyParts[0]);
1839cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1849cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // We have no HTML or text reply; use nothing
1859cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.mId = -1;        // Changing the message; need to reset the id
1869cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.mTextReply = null;
1879cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.mHtmlReply = null;
1889cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message2.save(mMockContext);
1899cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body2 = createTestBody(message2);
1909cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
1919cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        bodyParts = Rfc822Output.buildBodyText(body2, message2.mFlags, true);
1929cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_TEXT, bodyParts[0]);
19380ee607a7cc784993a48741d0dfbd132cd546985Marc Blank    }
19480ee607a7cc784993a48741d0dfbd132cd546985Marc Blank
19580ee607a7cc784993a48741d0dfbd132cd546985Marc Blank    /**
19680ee607a7cc784993a48741d0dfbd132cd546985Marc Blank     * Test for buildBodyText().
19780ee607a7cc784993a48741d0dfbd132cd546985Marc Blank     * Compare with expected values.
19880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank     */
19980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank    public void testBuildBodyTextWithForward() {
20080ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        Message msg = new Message();
20180ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mText = TEXT;
20280ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mFrom = SENDER;
20380ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mTo = RECIPIENT_TO;
20480ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mCc = RECIPIENT_CC;
20580ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mSubject = SUBJECT;
20680ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mFlags = Message.FLAG_TYPE_FORWARD;
2079cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        msg.mTextReply = REPLY_TEXT_BODY;
20880ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.mIntroText = mForwardIntro;
20980ee607a7cc784993a48741d0dfbd132cd546985Marc Blank        msg.save(mMockContext);
2109cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Body body = createTestBody(msg);
2119cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        String[] bodyParts = Rfc822Output.buildBodyText(body, msg.mFlags, false);
2129cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + mForwardIntro + REPLY_TEXT_BODY, bodyParts[0]);
2131d98989222f2d023ddb08a70d5abb850029f95dcMarc Blank    }
2140ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2150ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    public void testWriteToText() throws IOException, MessagingException {
2160ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Create a simple text message
2170ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Message msg = new Message();
2180ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mText = TEXT;
2190ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mFrom = SENDER;
2200ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Save this away
2210ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.save(mMockContext);
2220ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2230ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Write out an Rfc822 message
2240ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
2250d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false);
2260ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Get the message and create a mime4j message from it
2280ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // We'll take advantage of its parsing capabilities
2290ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayInputStream messageInputStream =
2300ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new ByteArrayInputStream(byteStream.toByteArray());
2310ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        org.apache.james.mime4j.message.Message mimeMessage =
2320ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new org.apache.james.mime4j.message.Message(messageInputStream);
2330ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2340ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Make sure its structure is correct
2356bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        checkMimeVersion(mimeMessage);
2360ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertFalse(mimeMessage.isMultipart());
2370ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals("text/plain", mimeMessage.getMimeType());
2380ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    }
2390ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2400ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    @SuppressWarnings("unchecked")
2410ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    public void testWriteToAlternativePart() throws IOException, MessagingException {
2420ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Create a message with alternative part
2430ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Message msg = new Message();
2440ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mText = TEXT;
2450ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mFrom = SENDER;
2460ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mAttachments = new ArrayList<Attachment>();
2470ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Attach a meeting invitation, which needs to be sent as multipart/alternative
2480ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Attachment att = new Attachment();
2490ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mContentBytes = "__CONTENT__".getBytes("UTF-8");
2500ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mFlags = Attachment.FLAG_ICS_ALTERNATIVE_PART;
2510ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mMimeType = "text/calendar";
2520ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mFileName = "invite.ics";
2530ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mAttachments.add(att);
2540ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Save this away
2550ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.save(mMockContext);
2560ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2570ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Write out an Rfc822 message
2580ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
2590d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false);
2600ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2610ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Get the message and create a mime4j message from it
2620ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // We'll take advantage of its parsing capabilities
2630ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayInputStream messageInputStream =
2640ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new ByteArrayInputStream(byteStream.toByteArray());
2650ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        org.apache.james.mime4j.message.Message mimeMessage =
2660ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new org.apache.james.mime4j.message.Message(messageInputStream);
2670ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
2680ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Make sure its structure is correct
2696bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        checkMimeVersion(mimeMessage);
2700ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertTrue(mimeMessage.isMultipart());
2710ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Header header = mimeMessage.getHeader();
2720ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Field contentType = header.getField("content-type");
2730ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertTrue(contentType.getBody().contains("multipart/alternative"));
2740ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Multipart multipart = (Multipart)mimeMessage.getBody();
2758546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        List<BodyPart> partList = multipart.getBodyParts();
2760ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals(2, partList.size());
2778546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        Entity part = partList.get(0);
2780ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals("text/plain", part.getMimeType());
2798546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        part = partList.get(1);
2800ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals("text/calendar", part.getMimeType());
2810ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        header = part.getHeader();
2820ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertNull(header.getField("content-disposition"));
2830ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    }
2840ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
28580ee607a7cc784993a48741d0dfbd132cd546985Marc Blank    @SuppressWarnings("unchecked")
2860ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    public void testWriteToMixedPart() throws IOException, MessagingException {
2870ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Create a message with a mixed part
2880ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Message msg = new Message();
2890ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mText = TEXT;
2900ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mFrom = SENDER;
2910ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mAttachments = new ArrayList<Attachment>();
2920ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Attach a simple html "file"
2930ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Attachment att = new Attachment();
2940ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mContentBytes = "<html>Hi</html>".getBytes("UTF-8");
2950ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mMimeType = "text/html";
2960ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        att.mFileName = "test.html";
2970ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.mAttachments.add(att);
2980ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Save this away
2990ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        msg.save(mMockContext);
3000ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
3010ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Write out an Rfc822 message
3020ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
3030d49ef78ebc1b0d65c31241f5b38f95397eebe34Todd Kennedy        Rfc822Output.writeTo(mMockContext, msg.mId, byteStream, true, false);
3040ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
3050ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Get the message and create a mime4j message from it
3060ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // We'll take advantage of its parsing capabilities
3070ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        ByteArrayInputStream messageInputStream =
3080ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new ByteArrayInputStream(byteStream.toByteArray());
3090ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        org.apache.james.mime4j.message.Message mimeMessage =
3100ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank            new org.apache.james.mime4j.message.Message(messageInputStream);
3110ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank
3120ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        // Make sure its structure is correct
3136bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        checkMimeVersion(mimeMessage);
3140ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertTrue(mimeMessage.isMultipart());
3150ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Header header = mimeMessage.getHeader();
3160ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Field contentType = header.getField("content-type");
3170ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertTrue(contentType.getBody().contains("multipart/mixed"));
3180ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        Multipart multipart = (Multipart)mimeMessage.getBody();
3198546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        List<BodyPart> partList = multipart.getBodyParts();
3200ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals(2, partList.size());
3218546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        Entity part = partList.get(0);
3220ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals("text/plain", part.getMimeType());
3238546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        part = partList.get(1);
3240ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertEquals("text/html", part.getMimeType());
3250ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        header = part.getHeader();
3260ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank        assertNotNull(header.getField("content-disposition"));
3270ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank    }
3286bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler
3296bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler    /**
3309cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * Tests various types of HTML reply text -- with full <html/> tags,
3319cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * with just the <body/> tags and without any surrounding tags.
3329cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     */
3339cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    public void testGetHtmlBody() {
3349cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        String actual;
3359cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        actual = Rfc822Output.getHtmlBody(HTML_FULL_BODY);
3369cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(HTML_FULL_RESULT, actual);
3379cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        actual = Rfc822Output.getHtmlBody(HTML_BODY_BODY);
3389cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(HTML_BODY_RESULT, actual);
3399cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        actual = Rfc822Output.getHtmlBody(HTML_NO_BODY_BODY);
3409cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(HTML_NO_BODY_RESULT, actual);
3419cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
3429cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
3439cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    /**
3449cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * Tests that the entire HTML alternate string is valid for text entered by
3459cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * the user. We don't test all permutations of forwarded HTML here because
3469cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * that is verified by testGetHtmlBody().
3479cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     */
3489cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    public void testGetHtmlAlternate() {
3499cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Message message = createTestMessage(TEXT, true);
3509cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Body body = createTestBody(message);
3519cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        String html;
3529cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
353de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        // Generic case
354de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        html = Rfc822Output.getHtmlAlternate(body, false);
3559cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_HTML + BODY_HTML_REPLY, html);
3569cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
357de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        // "smart reply" enabled; html body should not be added
358de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        html = Rfc822Output.getHtmlAlternate(body, true);
359de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        assertEquals(TEXT + REPLY_INTRO_HTML, html);
360de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy
3619cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // HTML special characters; dependent upon TextUtils#htmlEncode()
3629cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mId = -1;          // Changing the message; need to reset the id
3639cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mText = "<>&'\"";
3649cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.save(mMockContext);
3659cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body = createTestBody(message);
3669cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
367de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        html = Rfc822Output.getHtmlAlternate(body, false);
3689cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals("&lt;&gt;&amp;&apos;&quot;" + REPLY_INTRO_HTML + BODY_HTML_REPLY, html);
3699cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
3709cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // Newlines in user text
3719cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mId = -1;          // Changing the message; need to reset the id
3729cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mText = "dos\r\nunix\nthree\r\n\n\n";
3739cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.save(mMockContext);
3749cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body = createTestBody(message);
3759cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
376de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        html = Rfc822Output.getHtmlAlternate(body, false);
3779cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals("dos<br>unix<br>three<br><br><br>" + REPLY_INTRO_HTML + BODY_HTML_REPLY, html);
3789cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
3799cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // Null HTML reply
3809cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mId = -1;        // Changing the message; need to reset the id
3819cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.mHtmlReply = null;
3829cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        message.save(mMockContext);
3839cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        body = createTestBody(message);
3849cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
385de70ee5f7868ede7a738fbeb8ba9f9fe3558aefbTodd Kennedy        html = Rfc822Output.getHtmlAlternate(body, false);
3869cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertNull(html);
3879cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
3889cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
3899cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    /**
3909cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     * Test the boundary digit. We modify it indirectly.
3919cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy     */
3929cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    public void testBoundaryDigit() {
3939cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        // Use getBoundary() to update the boundary digit
3949cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.sBoundaryDigit = 0; // ensure it starts at a known value
3959cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
3969cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
3979cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(1, Rfc822Output.sBoundaryDigit);
3989cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
3999cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(2, Rfc822Output.sBoundaryDigit);
4009cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4019cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(3, Rfc822Output.sBoundaryDigit);
4029cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4039cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(4, Rfc822Output.sBoundaryDigit);
4049cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4059cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(5, Rfc822Output.sBoundaryDigit);
4069cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4079cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(6, Rfc822Output.sBoundaryDigit);
4089cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4099cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(7, Rfc822Output.sBoundaryDigit);
4109cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4119cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(8, Rfc822Output.sBoundaryDigit);
4129cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary();
4139cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(9, Rfc822Output.sBoundaryDigit);
4149cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        Rfc822Output.getNextBoundary(); // roll over
4159cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        assertEquals(0, Rfc822Output.sBoundaryDigit);
4169cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
4179cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
4189cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    private final int BOUNDARY_COUNT = 12;
4199cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    public void testGetNextBoundary() {
4209cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        String[] resultArray = new String[BOUNDARY_COUNT];
4219cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        for (int i = 0; i < BOUNDARY_COUNT; i++) {
4229cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            resultArray[i] = Rfc822Output.getNextBoundary();
4239cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        }
4249cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        for (int i = 0; i < BOUNDARY_COUNT; i++) {
4259cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            final String result1 = resultArray[i];
4269cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            for (int j = 0; j < BOUNDARY_COUNT; j++) {
4279cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy                if (i == j) {
4289cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy                    continue; // Don't verify the same result
4299cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy                }
4309cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy                final String result2 = resultArray[j];
4319cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy                assertFalse(result1.equals(result2));
4329cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy            }
4339cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy        }
4349cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    }
4359cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy
4369cc51b72c6902b95f65857af64eb38063aa4a42bTodd Kennedy    /**
4376bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler     * Confirm that the constructed message includes "MIME-VERSION: 1.0"
4386bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler     */
4396bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler    private void checkMimeVersion(org.apache.james.mime4j.message.Message mimeMessage) {
4406bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        Header header = mimeMessage.getHeader();
4416bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        Field contentType = header.getField("MIME-VERSION");
4426bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler        assertTrue(contentType.getBody().equals("1.0"));
4436bcccf628413d40696980d0d86c7ab2b4f831952Andrew Stadler    }
4440ed690bfb4fdfa86cb6f75c19e24b8ff39a1756cMarc Blank}
445