blob: 07254f35a7ad705aa45f9a3d3e496800f796b67d [file] [log] [blame]
/****************************************************************
* 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.field;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import org.apache.james.mime4j.dom.address.Group;
import org.apache.james.mime4j.dom.address.Mailbox;
import org.apache.james.mime4j.dom.field.AddressListField;
import org.apache.james.mime4j.dom.field.ContentDispositionField;
import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
import org.apache.james.mime4j.dom.field.ContentTypeField;
import org.apache.james.mime4j.dom.field.DateTimeField;
import org.apache.james.mime4j.dom.field.MailboxField;
import org.apache.james.mime4j.dom.field.MailboxListField;
import org.apache.james.mime4j.field.address.DefaultAddressParser;
import org.apache.james.mime4j.stream.Field;
import org.apache.james.mime4j.util.ByteSequence;
import org.apache.james.mime4j.util.ContentUtil;
import org.apache.james.mime4j.util.MimeUtil;
import org.junit.Assert;
import org.junit.Test;
public class FieldsTest {
@Test
public void testContentTypeString() throws Exception {
ContentTypeField field = Fields.contentType("multipart/mixed; "
+ "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c"
+ ".2dce5678cbc933d5=-\"");
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Type: multipart/mixed;\r\n "
+ "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c"
+ ".2dce5678cbc933d5=-\"";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testContentTypeStringParameters() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("boundary",
"-=Part.0.37877968dd4f6595.11eccf0271c.2dce5678cbc933d5=-");
ContentTypeField field = Fields.contentType("multipart/mixed",
parameters);
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Type: multipart/mixed;\r\n "
+ "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c"
+ ".2dce5678cbc933d5=-\"";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testContentTypeStringParametersWithSpaces() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("param", "value with space chars");
ContentTypeField field = Fields.contentType("multipart/mixed",
parameters);
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Type: multipart/mixed; "
+ "param=\"value with space chars\"";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testContentTypeStringNullParameters() throws Exception {
ContentTypeField field = Fields.contentType("text/plain", (Map<String, String>) null);
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Type: text/plain";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testInvalidContentType() throws Exception {
ContentTypeField field = Fields.contentType("multipart/mixed; "
+ "boundary=-=Part.0.37877968dd4f6595.11eccf0271c"
+ ".2dce5678cbc933d5=-");
Assert.assertFalse(field.isValidField());
Assert.assertEquals("multipart/mixed", field.getMimeType());
}
@Test
public void testContentTransferEncoding() throws Exception {
ContentTransferEncodingField field = Fields
.contentTransferEncoding("base64");
Assert.assertTrue(field.isValidField());
Assert.assertEquals("Content-Transfer-Encoding: base64",
decode(field));
}
@Test
public void testContentDispositionString() throws Exception {
ContentDispositionField field = Fields.contentDisposition("inline; "
+ "filename=\"testing 1 2.dat\"; size=12345; "
+ "creation-date=\"Thu, 1 Jan 1970 00:00:00 +0000\"");
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Disposition: inline; filename="
+ "\"testing 1 2.dat\"; size=12345;\r\n creation-date="
+ "\"Thu, 1 Jan 1970 00:00:00 +0000\"";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testContentDispositionStringParameters() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("creation-date", MimeUtil.formatDate(new Date(0),
TimeZone.getTimeZone("GMT")));
ContentDispositionField field = Fields.contentDisposition("attachment",
parameters);
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Disposition: attachment; "
+ "creation-date=\"Thu, 1 Jan 1970 00:00:00\r\n +0000\"";
Assert.assertEquals(expectedRaw, decode(field));
Assert.assertEquals(new Date(0), field.getCreationDate());
}
@Test
public void testContentDispositionStringNullParameters() throws Exception {
ContentDispositionField field = Fields.contentDisposition("inline",
(Map<String, String>) null);
Assert.assertTrue(field.isValidField());
String expectedRaw = "Content-Disposition: inline";
Assert.assertEquals(expectedRaw, decode(field));
}
@Test
public void testContentDispositionFilename() throws Exception {
ContentDispositionField field = Fields.contentDisposition("attachment",
"some file.dat");
Assert.assertTrue(field.isValidField());
Assert.assertEquals("attachment", field.getDispositionType());
Assert.assertEquals("some file.dat", field.getFilename());
}
@Test
public void testContentDispositionFilenameSize() throws Exception {
ContentDispositionField field = Fields.contentDisposition("attachment",
"some file.dat", 300);
Assert.assertTrue(field.isValidField());
Assert.assertEquals("attachment", field.getDispositionType());
Assert.assertEquals("some file.dat", field.getFilename());
Assert.assertEquals(300, field.getSize());
}
@Test
public void testContentDispositionFilenameSizeDate() throws Exception {
ContentDispositionField field = Fields.contentDisposition("attachment",
"some file.dat", 300, new Date(1000), new Date(2000), new Date(
3000));
Assert.assertTrue(field.isValidField());
Assert.assertEquals("attachment", field.getDispositionType());
Assert.assertEquals("some file.dat", field.getFilename());
Assert.assertEquals(300, field.getSize());
Assert.assertEquals(new Date(1000), field.getCreationDate());
Assert.assertEquals(new Date(2000), field.getModificationDate());
Assert.assertEquals(new Date(3000), field.getReadDate());
}
@Test
public void testInvalidContentDisposition() throws Exception {
ContentDispositionField field = Fields.contentDisposition("inline; "
+ "filename=some file.dat");
Assert.assertFalse(field.isValidField());
Assert.assertEquals("inline", field.getDispositionType());
}
@Test
public void testDateStringDateTimeZone() throws Exception {
DateTimeField field = Fields.date("Date", new Date(0), TimeZone
.getTimeZone("GMT"));
Assert.assertTrue(field.isValidField());
Assert.assertEquals("Date: Thu, 1 Jan 1970 00:00:00 +0000", decode(field
));
Assert.assertEquals(new Date(0), field.getDate());
field = Fields.date("Resent-Date", new Date(0), TimeZone
.getTimeZone("GMT+1"));
Assert.assertTrue(field.isValidField());
Assert.assertEquals("Resent-Date: Thu, 1 Jan 1970 01:00:00 +0100",
decode(field));
Assert.assertEquals(new Date(0), field.getDate());
}
@Test
public void testDateDST() throws Exception {
long millis = 1216221153000l;
DateTimeField field = Fields.date("Date", new Date(millis), TimeZone
.getTimeZone("CET"));
Assert.assertTrue(field.isValidField());
Assert.assertEquals("Date: Wed, 16 Jul 2008 17:12:33 +0200", decode(field
));
Assert.assertEquals(new Date(millis), field.getDate());
}
@Test
public void testMessageId() throws Exception {
Field messageId = Fields.generateMessageId("acme.org");
String raw = decode(messageId);
Assert.assertTrue(raw.startsWith("Message-ID: <Mime4j."));
Assert.assertTrue(raw.endsWith("@acme.org>"));
}
@Test
public void testSubject() throws Exception {
Assert.assertEquals("Subject: ", decode(Fields.subject("")));
Assert.assertEquals("Subject: test", decode(Fields.subject("test")));
Assert.assertEquals("Subject: =?ISO-8859-1?Q?Sm=F8rebr=F8d?=", decode(Fields
.subject("Sm\370rebr\370d")));
String seventyEight = "12345678901234567890123456789012345678901234567890123456789012345678";
Assert.assertEquals("Subject:\r\n " + seventyEight, decode(Fields.subject(
seventyEight)));
String seventyNine = seventyEight + "9";
String expected = "Subject: =?US-ASCII?Q?1234567890123456789012345678901234?="
+ "\r\n =?US-ASCII?Q?56789012345678901234567890123456789?=";
Assert.assertEquals(expected, decode(Fields.subject(seventyNine)));
}
@Test
public void testSender() throws Exception {
MailboxField field = Fields.sender(DefaultAddressParser.DEFAULT
.parseMailbox("JD <john.doe@acme.org>"));
Assert.assertEquals("Sender: JD <john.doe@acme.org>", decode(field));
}
@Test
public void testFrom() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
MailboxListField field = Fields.from(mailbox1);
Assert.assertEquals("From: JD <john.doe@acme.org>", decode(field));
field = Fields.from(mailbox1, mailbox2);
Assert.assertEquals("From: JD <john.doe@acme.org>, "
+ "Mary Smith <mary@example.net>", decode(field));
field = Fields.from(Arrays.asList(mailbox1, mailbox2));
Assert.assertEquals("From: JD <john.doe@acme.org>, "
+ "Mary Smith <mary@example.net>", decode(field));
}
@Test
public void testTo() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("jane.doe@example.org");
Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
Group group = new Group("The Does", mailbox1, mailbox2);
AddressListField field = Fields.to(group);
Assert.assertEquals("To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;", decode(field));
field = Fields.to(group, mailbox3);
Assert.assertEquals("To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
field = Fields.to(Arrays.asList(group, mailbox3));
Assert.assertEquals("To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
}
@Test
public void testCc() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("jane.doe@example.org");
Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
Group group = new Group("The Does", mailbox1, mailbox2);
AddressListField field = Fields.cc(group);
Assert.assertEquals("Cc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;", decode(field));
field = Fields.cc(group, mailbox3);
Assert.assertEquals("Cc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
field = Fields.cc(Arrays.asList(group, mailbox3));
Assert.assertEquals("Cc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
}
@Test
public void testBcc() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("jane.doe@example.org");
Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
Group group = new Group("The Does", mailbox1, mailbox2);
AddressListField field = Fields.bcc(group);
Assert.assertEquals("Bcc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;", decode(field));
field = Fields.bcc(group, mailbox3);
Assert.assertEquals("Bcc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
field = Fields.bcc(Arrays.asList(group, mailbox3));
Assert.assertEquals("Bcc: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary Smith\r\n <mary@example.net>",
decode(field));
}
@Test
public void testReplyTo() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("jane.doe@example.org");
Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
Group group = new Group("The Does", mailbox1, mailbox2);
AddressListField field = Fields.replyTo(group);
Assert.assertEquals("Reply-To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;", decode(field));
field = Fields.replyTo(group, mailbox3);
Assert.assertEquals("Reply-To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary\r\n Smith <mary@example.net>",
decode(field));
field = Fields.replyTo(Arrays.asList(group, mailbox3));
Assert.assertEquals("Reply-To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary\r\n Smith <mary@example.net>",
decode(field));
}
@Test
public void testMailbox() throws Exception {
MailboxField field = Fields.mailbox("Resent-Sender", DefaultAddressParser.DEFAULT
.parseMailbox("JD <john.doe@acme.org>"));
Assert.assertEquals("Resent-Sender: JD <john.doe@acme.org>", decode(field));
}
@Test
public void testMailboxList() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
MailboxListField field = Fields.mailboxList("Resent-From", Arrays
.asList(mailbox1, mailbox2));
Assert.assertEquals("Resent-From: JD <john.doe@acme.org>, "
+ "Mary Smith <mary@example.net>", decode(field));
}
@Test
public void testAddressList() throws Exception {
Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("JD <john.doe@acme.org>");
Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("jane.doe@example.org");
Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
Group group = new Group("The Does", mailbox1, mailbox2);
AddressListField field = Fields.addressList("Resent-To", Arrays.asList(
group, mailbox3));
Assert.assertEquals("Resent-To: The Does: JD <john.doe@acme.org>, "
+ "jane.doe@example.org;, Mary\r\n Smith <mary@example.net>",
decode(field));
}
@Test
public void testInvalidFieldName() throws Exception {
try {
Fields.date("invalid field name", new Date());
Assert.fail();
} catch (IllegalArgumentException expected) {
}
}
public static String decode(Field f) throws IOException {
String s = null;
ByteSequence raw = f.getRaw();
if (raw != null) {
s = ContentUtil.decode(raw);
}
if (s == null) {
StringBuilder buf = new StringBuilder();
buf.append(f.getName());
buf.append(": ");
String body = f.getBody();
if (body != null) {
buf.append(body);
}
s = MimeUtil.fold(buf.toString(), 0);
}
return s;
}
}