/**************************************************************** * 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.mime4j.message; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.TimeZone; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.field.AbstractField; import org.apache.james.mime4j.field.address.Group; import org.apache.james.mime4j.field.address.Mailbox; public class MessageTest extends TestCase { private Header headerTextPlain = null; private Header headerMessageRFC822 = null; private Header headerEmpty = null; private Header headerMultipartMixed = null; private Header headerMultipartDigest = null; @Override public void setUp() throws Exception { headerTextPlain = new Header(); headerMessageRFC822 = new Header(); headerEmpty = new Header(); headerMultipartMixed = new Header(); headerMultipartDigest = new Header(); headerTextPlain.addField( AbstractField.parse("Content-Type: text/plain")); headerMessageRFC822.addField( AbstractField.parse("Content-Type: message/RFC822")); headerMultipartMixed.addField( AbstractField.parse("Content-Type: multipart/mixed; boundary=foo")); headerMultipartDigest.addField( AbstractField.parse("Content-Type: multipart/digest; boundary=foo")); } public void testGetMimeType() { Message parent = null; Message child = null; parent = new Message(); child = new Message(); child.setParent(parent); parent.setHeader(headerMultipartDigest); child.setHeader(headerEmpty); assertEquals("multipart/digest, empty", "message/rfc822", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("multipart/digest, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("multipart/digest, message/rfc822", "message/rfc822", child.getMimeType()); parent = new Message(); child = new Message(); child.setParent(parent); parent.setHeader(headerMultipartMixed); child.setHeader(headerEmpty); assertEquals("multipart/mixed, empty", "text/plain", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("multipart/mixed, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("multipart/mixed, message/rfc822", "message/rfc822", child.getMimeType()); child = new Message(); child.setHeader(headerEmpty); assertEquals("null, empty", "text/plain", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("null, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("null, message/rfc822", "message/rfc822", child.getMimeType()); } public void testIsMultipart() { Message m = new Message(); m.setHeader(headerEmpty); assertTrue("empty", !m.isMultipart()); m.setHeader(headerTextPlain); assertTrue("text/plain", !m.isMultipart()); m.setHeader(headerMultipartDigest); assertTrue("multipart/digest", m.isMultipart()); m.setHeader(headerMultipartMixed); assertTrue("multipart/mixed", m.isMultipart()); } public void testWriteTo() throws Exception { byte[] inputByte = getRawMessageAsByteArray(); Message m = new Message(new ByteArrayInputStream(inputByte)); ByteArrayOutputStream out = new ByteArrayOutputStream(); m.writeTo(out); InputStream output = new ByteArrayInputStream(out.toByteArray()); int b = -1; int i = 0; while ((b = output.read()) != -1) { assertEquals("same byte", b, inputByte[i]); i++; } } public void testAddHeaderWriteTo() throws Exception { String headerName = "testheader"; String headerValue = "testvalue"; String testheader = headerName + ": " + headerValue; byte[] inputByte = getRawMessageAsByteArray(); Message m = new Message(new ByteArrayInputStream(inputByte)); m.getHeader().addField(AbstractField.parse(testheader)); assertEquals("header added", m.getHeader().getField(headerName) .getBody(), headerValue); ByteArrayOutputStream out = new ByteArrayOutputStream(); m.writeTo(out); List<?> lines = IOUtils.readLines((new BufferedReader( new InputStreamReader(new ByteArrayInputStream(out .toByteArray()))))); assertTrue("header added", lines.contains(testheader)); } public void testGetMessageId() throws Exception { Message m = new Message(); assertNull(m.getMessageId()); String id = "<msg17@localhost>"; Header header = new Header(); header.setField(AbstractField.parse("Message-ID: " + id)); m.setHeader(header); assertEquals(id, m.getMessageId()); } public void testCreateMessageId() throws Exception { Message m = new Message(); m.createMessageId("hostname"); String id = m.getMessageId(); assertNotNull(id); assertTrue(id.startsWith("<Mime4j.")); assertTrue(id.endsWith("@hostname>")); } public void testGetSubject() throws Exception { Message m = new Message(); assertNull(m.getSubject()); String subject = "testing 1 2"; Header header = new Header(); header.setField(AbstractField.parse("Subject: " + subject)); m.setHeader(header); assertEquals(subject, m.getSubject()); header.setField(AbstractField.parse("Subject: =?windows-1252?Q?99_=80?=")); assertEquals("99 \u20ac", m.getSubject()); } public void testSetSubject() throws Exception { Message m = new Message(); m.setSubject("Semmelbr\366sel"); assertEquals("Semmelbr\366sel", m.getSubject()); assertEquals("=?ISO-8859-1?Q?Semmelbr=F6sel?=", m.getHeader().getField( "Subject").getBody()); m.setSubject(null); assertNull(m.getHeader().getField("Subject")); } public void testGetDate() throws Exception { Message m = new Message(); assertNull(m.getDate()); Header header = new Header(); header.setField(AbstractField.parse("Date: Thu, 1 Jan 1970 05:30:00 +0530")); m.setHeader(header); assertEquals(new Date(0), m.getDate()); } public void testSetDate() throws Exception { Message m = new Message(); m.setDate(new Date(86400000), TimeZone.getTimeZone("GMT")); assertEquals(new Date(86400000), m.getDate()); assertEquals("Fri, 2 Jan 1970 00:00:00 +0000", m.getHeader().getField( "Date").getBody()); m.setDate(null); assertNull(m.getHeader().getField("Date")); } public void testGetSender() throws Exception { Message m = new Message(); assertNull(m.getSender()); Header header = new Header(); header.setField(AbstractField.parse("Sender: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", m.getSender().getAddress()); } public void testSetSender() throws Exception { Message m = new Message(); m.setSender(Mailbox.parse("john.doe@example.net")); assertEquals("john.doe@example.net", m.getHeader().getField("Sender") .getBody()); m.setSender(null); assertNull(m.getHeader().getField("Sender")); } public void testGetFrom() throws Exception { Message m = new Message(); assertNull(m.getFrom()); Header header = new Header(); header.setField(AbstractField.parse("From: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", m.getFrom().get(0).getAddress()); } public void testSetFrom() throws Exception { Message m = new Message(); Mailbox mailbox1 = Mailbox.parse("john.doe@example.net"); Mailbox mailbox2 = Mailbox.parse("jane.doe@example.net"); m.setFrom(mailbox1); assertEquals("john.doe@example.net", m.getHeader().getField("From") .getBody()); m.setFrom(mailbox1, mailbox2); assertEquals("john.doe@example.net, jane.doe@example.net", m .getHeader().getField("From").getBody()); m.setFrom(Arrays.asList(mailbox1, mailbox2)); assertEquals("john.doe@example.net, jane.doe@example.net", m .getHeader().getField("From").getBody()); m.setFrom((Mailbox) null); assertNull(m.getHeader().getField("From")); } public void testGetTo() throws Exception { Message m = new Message(); assertNull(m.getTo()); Header header = new Header(); header.setField(AbstractField.parse("To: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getTo().get(0)) .getAddress()); } public void testSetTo() throws Exception { Message m = new Message(); Mailbox mailbox1 = Mailbox.parse("john.doe@example.net"); Mailbox mailbox2 = Mailbox.parse("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = Mailbox.parse("Mary Smith <mary@example.net>"); m.setTo(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("To").getBody()); m.setTo(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField("To") .getBody()); m.setTo(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField("To") .getBody()); m.setTo((Mailbox) null); assertNull(m.getHeader().getField("To")); } public void testGetCc() throws Exception { Message m = new Message(); assertNull(m.getCc()); Header header = new Header(); header.setField(AbstractField.parse("Cc: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getCc().get(0)) .getAddress()); } public void testSetCc() throws Exception { Message m = new Message(); Mailbox mailbox1 = Mailbox.parse("john.doe@example.net"); Mailbox mailbox2 = Mailbox.parse("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = Mailbox.parse("Mary Smith <mary@example.net>"); m.setCc(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Cc").getBody()); m.setCc(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField("Cc") .getBody()); m.setCc(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField("Cc") .getBody()); m.setCc((Mailbox) null); assertNull(m.getHeader().getField("Cc")); } public void testGetBcc() throws Exception { Message m = new Message(); assertNull(m.getBcc()); Header header = new Header(); header.setField(AbstractField.parse("Bcc: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getBcc().get(0)) .getAddress()); } public void testSetBcc() throws Exception { Message m = new Message(); Mailbox mailbox1 = Mailbox.parse("john.doe@example.net"); Mailbox mailbox2 = Mailbox.parse("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = Mailbox.parse("Mary Smith <mary@example.net>"); m.setBcc(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Bcc").getBody()); m.setBcc(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader() .getField("Bcc").getBody()); m.setBcc(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader() .getField("Bcc").getBody()); m.setBcc((Mailbox) null); assertNull(m.getHeader().getField("Bcc")); } public void testGetReplyTo() throws Exception { Message m = new Message(); assertNull(m.getReplyTo()); Header header = new Header(); header.setField(AbstractField.parse("Reply-To: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getReplyTo().get(0)) .getAddress()); } public void testSetReplyTo() throws Exception { Message m = new Message(); Mailbox mailbox1 = Mailbox.parse("john.doe@example.net"); Mailbox mailbox2 = Mailbox.parse("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = Mailbox.parse("Mary Smith <mary@example.net>"); m.setReplyTo(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Reply-To").getBody()); m.setReplyTo(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField( "Reply-To").getBody()); m.setReplyTo(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith <mary@example.net>", m.getHeader().getField( "Reply-To").getBody()); m.setReplyTo((Mailbox) null); assertNull(m.getHeader().getField("Reply-To")); } public void testDisposeGetsPropagatedToBody() throws Exception { DummyBody body1 = new DummyBody(); BodyPart part1 = new BodyPart(); part1.setHeader(headerEmpty); part1.setBody(body1); DummyBody body2 = new DummyBody(); BodyPart part2 = new BodyPart(); part2.setHeader(headerEmpty); part2.setBody(body2); Multipart mp = new Multipart("mixed"); mp.addBodyPart(part1); mp.addBodyPart(part2); Message m = new Message(); m.setHeader(headerMultipartMixed); m.setBody(mp); assertFalse(body1.disposed); assertFalse(body2.disposed); m.dispose(); assertTrue(body1.disposed); assertTrue(body2.disposed); } private byte[] getRawMessageAsByteArray() { StringBuilder header = new StringBuilder(); StringBuilder body = new StringBuilder(); StringBuilder complete = new StringBuilder(); header.append("Date: Wed, 21 Feb 2007 11:09:27 +0100\r\n"); header.append("From: Test <test@test>\r\n"); header.append("To: Norman Maurer <nm@byteaction.de>\r\n"); header.append("Subject: Testmail\r\n"); header .append("Content-Type: text/plain; charset=ISO-8859-15; format=flowed\r\n"); header.append("Content-Transfer-Encoding: 8bit\r\n\r\n"); body.append("testbody\r\n"); complete.append(header); complete.append(body); return complete.toString().getBytes(); } private static final class DummyBody extends SingleBody { public boolean disposed = false; @Override public void writeTo(OutputStream out) throws IOException { out.write("dummy".getBytes("US-ASCII")); } @Override public void dispose() { disposed = true; } } }