FileDocCategorySizeDatePackage
AddFooterTest.javaAPI DocApache James 2.3.113138Fri Jan 12 12:56:36 GMT 2007org.apache.james.transport.mailets

AddFooterTest.java

/****************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one   *
 * or more contributor license agreements.  See the NOTICE file *
 * distributed with this work for additional information        *
 * regarding copyright ownership.  The ASF licenses this file   *
 * to you under the Apache License, Version 2.0 (the            *
 * "License"); you may not use this file except in compliance   *
 * with the License.  You may obtain a copy of the License at   *
 *                                                              *
 *   http://www.apache.org/licenses/LICENSE-2.0                 *
 *                                                              *
 * Unless required by applicable law or agreed to in writing,   *
 * software distributed under the License is distributed on an  *
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
 * KIND, either express or implied.  See the License for the    *
 * specific language governing permissions and limitations      *
 * under the License.                                           *
 ****************************************************************/
package org.apache.james.transport.mailets;

import org.apache.james.core.MailImpl;
import org.apache.james.test.mock.mailet.MockMailContext;
import org.apache.james.test.mock.mailet.MockMailetConfig;
import org.apache.mailet.Mail;
import org.apache.mailet.Mailet;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import junit.framework.TestCase;

/**
 * Test encoding issues
 * 
 * This test should also be run with the following JVM options to be sure it tests:
 * "-Dfile.encoding=ASCII -Dmail.mime.charset=ANSI_X3.4-1968"
 */
public class AddFooterTest extends TestCase {

    public AddFooterTest(String arg0) throws UnsupportedEncodingException {
        super(arg0);
        
        /*
        
        String encoding = (new InputStreamReader(System.in)).getEncoding();
        System.out.println("System Encoding: "+encoding);
        System.out.println("Default Java Charset:"+MimeUtility.getDefaultJavaCharset());
        System.out.println("---------");
        String a = "\u20AC\u00E0"; // euro char followed by an italian a with an accent System.out.println(debugString(a,"UTF-8"));
        System.out.println(debugString(a,"UTF8"));
        System.out.println(debugString(a,"UTF-16"));
        System.out.println(debugString(a,"UNICODE"));
        System.out.println(debugString(a,"ISO-8859-15"));
        System.out.println(debugString(a,"ISO-8859-1"));
        System.out.println(debugString(a,"CP1252"));
        System.out.println(debugString(a,"ANSI_X3.4-1968"));
         
         */
    }

    private final static char[] hexchars = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

    public String debugString(String a, String charset)
            throws UnsupportedEncodingException {
        byte[] bytes = a.getBytes(charset);
        StringBuffer res = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            if (i > 0)
                res.append("-");
            res.append(hexchars[((bytes[i] + 256) % 256) / 16]);
            res.append(hexchars[((bytes[i] + 256) % 256) % 16]);
        }
        res.append(" (");
        res.append(MimeUtility.mimeCharset(charset));
        res.append(" / ");
        res.append(MimeUtility.javaCharset(charset));
        res.append(")");
        return res.toString();
    }

    /*
     * Class under test for String getSubject()
     */
    public void testAddFooterTextPlain() throws MessagingException, IOException {

        // quoted printable mimemessage text/plain
        String asciisource = "Subject: test\r\nContent-Type: text/plain; charset=ISO-8859-15\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and one\r\n";

        String iso885915qpheader = "------ my footer =E0/=A4 ------";
        String footer = "------ my footer \u00E0/\u20AC ------";

        String res = processAddFooter(asciisource, footer);

        assertEquals(asciisource + iso885915qpheader, res);

    }

    public void testUnsupportedEncoding() throws MessagingException, IOException {

        // quoted printable mimemessage text/plain
        String asciisource = "Subject: test\r\nContent-Type: text/plain; charset=UNSUPPORTED_ENCODING\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and one\r\n";

        String footer = "------ my footer \u00E0/\u20AC ------";

        try {
            String res = processAddFooter(asciisource, footer);
            assertEquals(asciisource, res);
        } catch (Exception e) {
            fail("should not throw an exception: "+e.getMessage());
        }


    }

    /*
     * Test for      JAMES-443
     * This should not add the header and should leave the multipart/mixed Content-Type intact
     */
    public void testAddFooterMimeNestedUnsupportedMultipart() throws MessagingException, IOException {

        // quoted printable mimemessage text/plain
        String asciisource = "MIME-Version: 1.0\r\n"
            +"Content-Type: multipart/mixed; boundary=\"===============0204599088==\"\r\n"
                +"\r\n"
                +"This is a cryptographically signed message in MIME format.\r\n"
                +"\r\n"
                +"--===============0204599088==\r\n"
                +"Content-Type: multipart/unsupported; boundary=\"------------ms050404020900070803030808\"\r\n"
                +"\r\n"
                +"--------------ms050404020900070803030808\r\n"
                +"Content-Type: text/plain; charset=ISO-8859-1\r\n"
                +"\r\n"
                +"test\r\n"
                +"\r\n"
                +"--------------ms050404020900070803030808--\r\n"
                +"\r\n"
                +"--===============0204599088==--\r\n";
        // String asciisource = "Subject: test\r\nContent-Type: multipart/mixed; boundary=\"===============0204599088==\"\r\nMIME-Version: 1.0\r\n\r\nThis is a cryptographically signed message in MIME format.\r\n\r\n--===============0204599088==\r\nContent-Type: text/plain\r\n\r\ntest\r\n--===============0204599088==\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\nContent-Disposition: inline\r\n\r\ntest\r\n--===============0204599088==--\r\n";

        String footer = "------ my footer \u00E0/\u20AC ------";

        String res = processAddFooter(asciisource, footer);

        assertEquals(asciisource, res);

    }
    
    /*
     * Test for      JAMES-368
     * AddFooter couldn't process mails which MimeType is multipart/related
     */
    public void testAddFooterMultipartRelated() throws MessagingException, IOException {

        // quoted printable mimemessage text/plain
        String asciisource = "MIME-Version: 1.0\r\n"
            +"Subject: test\r\n"
            +"Content-Type: multipart/related;\r\n"
            +"  boundary=\"------------050206010102010306090507\"\r\n"
            +"\r\n"
            +"--------------050206010102010306090507\r\n"
            +"Content-Type: text/html; charset=ISO-8859-15\r\n"
            +"Content-Transfer-Encoding: quoted-printable\r\n"
            +"\r\n"
            +"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n"
            +"<html>\r\n"
            +"<head>\r\n"
            +"<meta content=3D\"text/html;charset=3DISO-8859-15\" http-equiv=3D\"Content-Typ=\r\n"
            +"e\">\r\n"
            +"</head>\r\n"
            +"<body bgcolor=3D\"#ffffff\" text=3D\"#000000\">\r\n"
            +"<br>\r\n"
            +"<div class=3D\"moz-signature\">-- <br>\r\n"
            +"<img src=3D\"cid:part1.02060605.123@zzz.com\" border=3D\"0\"></div>\r\n";
        String asciifoot = "</body>\r\n"
            +"</html>\r\n"
            +"\r\n"
            +"--------------050206010102010306090507\r\n"
            +"Content-Type: image/gif\r\n"
            +"Content-Transfer-Encoding: base64\r\n"
            +"Content-ID: <part1.02060605.123@zzz.com>\r\n"
            +"Content-Disposition: inline;\r\n"
            +"\r\n"
            +"YQ==\r\n"
            +"--------------050206010102010306090507--\r\n";

        // String asciisource = "Subject: test\r\nContent-Type: multipart/mixed; boundary=\"===============0204599088==\"\r\nMIME-Version: 1.0\r\n\r\nThis is a cryptographically signed message in MIME format.\r\n\r\n--===============0204599088==\r\nContent-Type: text/plain\r\n\r\ntest\r\n--===============0204599088==\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\nContent-Disposition: inline\r\n\r\ntest\r\n--===============0204599088==--\r\n";

        String footer = "------ my footer \u00E0/\u20AC ------";
        String expectedFooter = "<br>------ my footer =E0/=A4 ------";

        String res = processAddFooter(asciisource+asciifoot, footer);

        assertEquals(asciisource+expectedFooter+asciifoot, res);

    }
    
    

    /*
     * Class under test for String getSubject()
     */
    public void testAddFooterTextPlainISO8859() throws MessagingException, IOException {

        // quoted printable mimemessage text/plain
        String asciisource = "Subject: test\r\nContent-Type: text/plain; charset=iso-8859-15\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and one =A4\r\n";

        String iso885915qpheader = "------ my footer =E0/=A4 ------";
        String footer = "------ my footer \u00E0/\u20AC ------";

        String res = processAddFooter(asciisource, footer);

        assertEquals(asciisource + iso885915qpheader, res);

    }

    /*
     * Class under test for String getSubject()
     */
    public void testAddFooterMultipartAlternative() throws MessagingException,
            IOException {

        String sep = "--==--";
        String head = "Subject: test\r\nContent-Type: multipart/alternative;\r\n    boundary=\""
                + sep
                + "\"\r\nMIME-Version: 1.0\r\n";
        String content1 = "Content-Type: text/plain;\r\n    charset=\"ISO-8859-15\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and @=80";
        String c2h = "Content-Type: text/html;\r\n    charset=\"CP1252\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n";
        String c2pre = "<html><body>test =80 ss";
        String c2post = "</body></html>";

        StringBuffer asciisource = new StringBuffer();
        asciisource.append(head);
        asciisource.append("\r\n--");
        asciisource.append(sep);
        asciisource.append("\r\n");
        asciisource.append(content1);
        asciisource.append("\r\n--");
        asciisource.append(sep);
        asciisource.append("\r\n");
        asciisource.append(c2h);
        asciisource.append(c2pre);
        asciisource.append(c2post);
        asciisource.append("\r\n--");
        asciisource.append(sep);
        asciisource.append("--\r\n");

        String iso885915qpheader = "------ my footer =E0/=A4 ------";
        String cp1252qpfooter = "------ my footer =E0/=80 ------";
        String footer = "------ my footer \u00E0/\u20AC ------";

        StringBuffer expected = new StringBuffer();
        expected.append(head);
        expected.append("\r\n--");
        expected.append(sep);
        expected.append("\r\n");
        expected.append(content1);
        expected.append("\r\n");
        expected.append(iso885915qpheader);
        expected.append("\r\n--");
        expected.append(sep);
        expected.append("\r\n");
        expected.append(c2h);
        expected.append(c2pre);
        expected.append("<br>");
        expected.append(cp1252qpfooter);
        expected.append(c2post);
        expected.append("\r\n--");
        expected.append(sep);
        expected.append("--\r\n");
        
        String res = processAddFooter(asciisource.toString(), footer);

        assertEquals(expected.toString(), res);

    }

    private String processAddFooter(String asciisource, String footer)
            throws MessagingException, IOException {
        Mailet mailet = new AddFooter();

        MockMailetConfig mci = new MockMailetConfig("Test",new MockMailContext());
        mci.setProperty("text",footer);

        mailet.init(mci);

        Mail mail = new MailImpl(new MimeMessage(Session
                .getDefaultInstance(new Properties()),
                new ByteArrayInputStream(asciisource.getBytes())));

        mailet.service(mail);

        ByteArrayOutputStream rawMessage = new ByteArrayOutputStream();
        mail.getMessage().writeTo(
                rawMessage,
                new String[] { "Bcc", "Content-Length", "Message-ID" });
        String res = rawMessage.toString();
        return res;
    }

}