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("<>&'"" + 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