You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by rm...@apache.org on 2014/08/26 20:17:09 UTC

svn commit: r1620683 [16/17] - in /geronimo/specs/trunk: ./ geronimo-javamail_1.5_spec/ geronimo-javamail_1.5_spec/src/ geronimo-javamail_1.5_spec/src/main/ geronimo-javamail_1.5_spec/src/main/java/ geronimo-javamail_1.5_spec/src/main/java/javax/ geron...

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentDispositionTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentDispositionTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentDispositionTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentDispositionTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,59 @@
+/*
+ * 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 javax.mail.internet;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ContentDispositionTest extends TestCase {
+
+    public ContentDispositionTest(final String name) {
+        super(name);
+    }
+
+    public void testContentDisposition() throws ParseException {
+        ContentDisposition c;
+        c = new ContentDisposition();
+        assertNotNull(c.getParameterList());
+        assertNull(c.getParameterList().get("nothing"));
+        assertNull(c.getDisposition());
+        assertEquals("", c.toString());
+        c.setDisposition("inline");
+        assertEquals("inline",c.getDisposition());
+        c.setParameter("file","file.txt");
+        assertEquals("file.txt",c.getParameterList().get("file"));
+        assertEquals("inline; file=file.txt",c.toString());
+        c = new ContentDisposition("inline");
+        assertNotNull(c.getParameterList());
+        assertEquals(0,c.getParameterList().size());
+        assertEquals("inline",c.getDisposition());
+        c = new ContentDisposition("inline",new ParameterList(";charset=us-ascii;content-type=\"text/plain\""));
+        assertEquals("inline",c.getDisposition());
+        assertEquals("us-ascii",c.getParameter("charset"));
+        assertEquals("text/plain",c.getParameter("content-type"));
+        c = new ContentDisposition("attachment;content-type=\"text/html\";charset=UTF-8");
+        assertEquals("attachment",c.getDisposition());
+        assertEquals("UTF-8",c.getParameter("charset"));
+        assertEquals("text/html",c.getParameter("content-type"));
+    }
+
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentTypeTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentTypeTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentTypeTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/ContentTypeTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,158 @@
+/*
+ * 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 javax.mail.internet;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ContentTypeTest extends TestCase {
+    public ContentTypeTest(final String arg0) {
+        super(arg0);
+    }
+    public void testContentType() throws ParseException {
+        final ContentType type = new ContentType();
+        assertNull(type.getPrimaryType());
+        assertNull(type.getSubType());
+        assertNull(type.getParameter("charset"));
+    }
+
+    public void testContentTypeStringStringParameterList() throws ParseException {
+        ContentType type;
+        final ParameterList list = new ParameterList(";charset=us-ascii");
+        type = new ContentType("text", "plain", list);
+        assertEquals("text", type.getPrimaryType());
+        assertEquals("plain", type.getSubType());
+        assertEquals("text/plain", type.getBaseType());
+        final ParameterList parameterList = type.getParameterList();
+        assertEquals("us-ascii", parameterList.get("charset"));
+        assertEquals("us-ascii", type.getParameter("charset"));
+
+    }
+
+    public void testContentTypeString() throws ParseException {
+        ContentType type;
+        type = new ContentType("text/plain");
+        assertEquals("text", type.getPrimaryType());
+        assertEquals("plain", type.getSubType());
+        assertEquals("text/plain", type.getBaseType());
+        assertNotNull(type.getParameterList());
+        assertNull(type.getParameter("charset"));
+        type = new ContentType("image/audio;charset=us-ascii");
+        final ParameterList parameterList = type.getParameterList();
+        assertEquals("image", type.getPrimaryType());
+        assertEquals("audio", type.getSubType());
+        assertEquals("image/audio", type.getBaseType());
+        assertEquals("us-ascii", parameterList.get("charset"));
+        assertEquals("us-ascii", type.getParameter("charset"));
+    }
+    public void testGetPrimaryType() throws ParseException {
+    }
+    public void testGetSubType() throws ParseException {
+    }
+    public void testGetBaseType() throws ParseException {
+    }
+    public void testGetParameter() throws ParseException {
+    }
+    public void testGetParameterList() throws ParseException {
+    }
+    public void testSetPrimaryType() throws ParseException {
+        final ContentType type = new ContentType("text/plain");
+        type.setPrimaryType("binary");
+        assertEquals("binary", type.getPrimaryType());
+        assertEquals("plain", type.getSubType());
+        assertEquals("binary/plain", type.getBaseType());
+    }
+    public void testSetSubType() throws ParseException {
+        final ContentType type = new ContentType("text/plain");
+        type.setSubType("html");
+        assertEquals("text", type.getPrimaryType());
+        assertEquals("html", type.getSubType());
+        assertEquals("text/html", type.getBaseType());
+    }
+    public void testSetParameter() throws ParseException {
+    }
+    public void testSetParameterList() throws ParseException {
+    }
+    public void testToString() throws ParseException {
+        final ContentType type = new ContentType("text/plain");
+        assertEquals("text/plain", type.toString());
+        type.setParameter("foo", "bar");
+        assertEquals("text/plain; foo=bar", type.toString());
+        type.setParameter("bar", "me@apache.org");
+        assertEquals("text/plain; foo=bar; bar=\"me@apache.org\"", type.toString());
+    }
+    public void testMatchContentType() throws ParseException {
+        final ContentType type = new ContentType("text/plain");
+
+        ContentType test = new ContentType("text/plain");
+
+        assertTrue(type.match(test));
+
+        test = new ContentType("TEXT/plain");
+        assertTrue(type.match(test));
+        assertTrue(test.match(type));
+
+        test = new ContentType("text/PLAIN");
+        assertTrue(type.match(test));
+        assertTrue(test.match(type));
+
+        test = new ContentType("text/*");
+        assertTrue(type.match(test));
+        assertTrue(test.match(type));
+
+        test = new ContentType("text/xml");
+        assertFalse(type.match(test));
+        assertFalse(test.match(type));
+
+        test = new ContentType("binary/plain");
+        assertFalse(type.match(test));
+        assertFalse(test.match(type));
+
+        test = new ContentType("*/plain");
+        assertFalse(type.match(test));
+        assertFalse(test.match(type));
+    }
+    public void testMatchString() throws ParseException {
+        final ContentType type = new ContentType("text/plain");
+        assertTrue(type.match("text/plain"));
+        assertTrue(type.match("TEXT/plain"));
+        assertTrue(type.match("text/PLAIN"));
+        assertTrue(type.match("TEXT/PLAIN"));
+        assertTrue(type.match("TEXT/*"));
+
+        assertFalse(type.match("text/xml"));
+        assertFalse(type.match("binary/plain"));
+        assertFalse(type.match("*/plain"));
+        assertFalse(type.match(""));
+        assertFalse(type.match("text/plain/yada"));
+    }
+    
+    public void testSOAP12ContentType() throws ParseException {
+        final ContentType type = new ContentType("multipart/related; type=\"application/xop+xml\"; start=\"<ro...@soapui.org>\"; start-info=\"application/soap+xml; action=\\\"urn:upload\\\"\"; boundary=\"----=_Part_10_5804917.1223557742343\"");
+        assertEquals("multipart/related", type.getBaseType());
+        assertEquals("application/xop+xml", type.getParameter("type"));
+        assertEquals("<ro...@soapui.org>", type.getParameter("start"));
+        assertEquals("application/soap+xml; action=\"urn:upload\"", type.getParameter("start-info"));
+        assertEquals("----=_Part_10_5804917.1223557742343", type.getParameter("boundary"));
+    }
+
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/HeaderTokenizerTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/HeaderTokenizerTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/HeaderTokenizerTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/HeaderTokenizerTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,197 @@
+/*
+ * 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 javax.mail.internet;
+
+import javax.mail.internet.HeaderTokenizer.Token;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HeaderTokenizerTest extends TestCase {
+    public void testTokenizer() throws ParseException {
+        final Token t;
+        HeaderTokenizer ht;
+        ht =
+            new HeaderTokenizer("To: \"Geronimo List\" <ge...@apache.org>, \n\r Geronimo User <ge...@apache.org>");
+        validateToken(ht.peek(), Token.ATOM, "To");
+        validateToken(ht.next(), Token.ATOM, "To");
+        validateToken(ht.peek(), ':', ":");
+        validateToken(ht.next(), ':', ":");
+        validateToken(ht.next(), Token.QUOTEDSTRING, "Geronimo List");
+        validateToken(ht.next(), '<', "<");
+        validateToken(ht.next(), Token.ATOM, "geronimo-dev");
+        validateToken(ht.next(), '@', "@");
+        validateToken(ht.next(), Token.ATOM, "apache");
+        validateToken(ht.next(), '.', ".");
+        validateToken(ht.next(), Token.ATOM, "org");
+        validateToken(ht.next(), '>', ">");
+        validateToken(ht.next(), ',', ",");
+        validateToken(ht.next(), Token.ATOM, "Geronimo");
+        validateToken(ht.next(), Token.ATOM, "User");
+        validateToken(ht.next(), '<', "<");
+        validateToken(ht.next(), Token.ATOM, "geronimo-user");
+        validateToken(ht.next(), '@', "@");
+        validateToken(ht.next(), Token.ATOM, "apache");
+        validateToken(ht.next(), '.', ".");
+        assertEquals("org>", ht.getRemainder());
+        validateToken(ht.peek(), Token.ATOM, "org");
+        validateToken(ht.next(), Token.ATOM, "org");
+        validateToken(ht.next(), '>', ">");
+        assertEquals(Token.EOF, ht.next().getType());
+        ht = new HeaderTokenizer("   ");
+        assertEquals(Token.EOF, ht.next().getType());
+        ht = new HeaderTokenizer("J2EE");
+        validateToken(ht.next(), Token.ATOM, "J2EE");
+        assertEquals(Token.EOF, ht.next().getType());
+        // test comments
+        doComment(true);
+        doComment(false);
+    }
+
+    public void testErrors() throws ParseException {
+        checkParseError("(Geronimo");
+        checkParseError("((Geronimo)");
+        checkParseError("\"Geronimo");
+        checkParseError("\"Geronimo\\");
+    }
+
+
+    public void testQuotedLiteral() throws ParseException {
+        checkTokenParse("\"\"", Token.QUOTEDSTRING, "");
+        checkTokenParse("\"\\\"\"", Token.QUOTEDSTRING, "\"");
+        checkTokenParse("\"\\\"\"", Token.QUOTEDSTRING, "\"");
+        checkTokenParse("\"A\r\nB\"", Token.QUOTEDSTRING, "AB");
+        checkTokenParse("\"A\nB\"", Token.QUOTEDSTRING, "A\nB");
+    }
+
+
+    public void testComment() throws ParseException {
+        checkTokenParse("()", Token.COMMENT, "");
+        checkTokenParse("(())", Token.COMMENT, "()");
+        checkTokenParse("(Foo () Bar)", Token.COMMENT, "Foo () Bar");
+        checkTokenParse("(\"Foo () Bar)", Token.COMMENT, "\"Foo () Bar");
+        checkTokenParse("(\\()", Token.COMMENT, "(");
+        checkTokenParse("(Foo \r\n Bar)", Token.COMMENT, "Foo  Bar");
+        checkTokenParse("(Foo \n Bar)", Token.COMMENT, "Foo \n Bar");
+    }
+    
+    public void testJavaMail15NextMethod() throws ParseException{
+        HeaderTokenizer ht;
+        ht =
+            new HeaderTokenizer("To: \"Geronimo List\\\" <ge...@apache.org>, \n\r Geronimo User <ge...@apache.org>");
+        validateToken(ht.next('>', false), Token.QUOTEDSTRING, "To: \"Geronimo List\" <geronimo-dev@apache.org");
+    }
+    
+    public void testJavaMail15NextMethodEscapes() throws ParseException{
+        HeaderTokenizer ht;
+        ht =
+            new HeaderTokenizer("To: \"Geronimo List\\\" <ge...@apache.org>, \n\r Geronimo User <ge...@apache.org>");
+        validateToken(ht.next('<', true), Token.QUOTEDSTRING, "To: \"Geronimo List\\\" ");
+    }
+    
+    public void testJavaMail15NextMethodEscapes2() throws ParseException{
+        HeaderTokenizer ht;
+        ht =
+            new HeaderTokenizer("To: \"Geronimo List\" <geronimo-dev@apac\\he.org>, \n\r Geronimo User <ge...@apache.org>");
+        ht.next();
+        ht.next();
+        ht.next();
+        validateToken(ht.next(',', false), Token.QUOTEDSTRING, "<ge...@apache.org>");
+    }
+    
+    public void testJavaMail15NextMethodEscapes3() throws ParseException{
+        HeaderTokenizer ht;
+        ht =
+            new HeaderTokenizer("To: \"Geronimo List\" <geronimo-dev@apac\\he.org>, \n\r Geronimo User <ge...@apache.org>");
+        ht.next();
+        ht.next();
+        ht.next();
+        validateToken(ht.next(',', true), Token.QUOTEDSTRING, "<geronimo-dev@apac\\he.org>");
+    }
+
+    public void checkTokenParse(final String text, final int type, final String value) throws ParseException {
+        HeaderTokenizer ht;
+        ht = new HeaderTokenizer(text, HeaderTokenizer.RFC822, false);
+        validateToken(ht.next(), type, value);
+    }
+
+
+    public void checkParseError(final String text) throws ParseException {
+        final Token t;
+        HeaderTokenizer ht;
+
+        ht = new HeaderTokenizer(text);
+        doNextError(ht);
+        ht = new HeaderTokenizer(text);
+        doPeekError(ht);
+    }
+
+    public void doNextError(final HeaderTokenizer ht) {
+        try {
+            ht.next();
+            fail("Expected ParseException");
+        } catch (final ParseException e) {
+        }
+    }
+
+    public void doPeekError(final HeaderTokenizer ht) {
+        try {
+            ht.peek();
+            fail("Expected ParseException");
+        } catch (final ParseException e) {
+        }
+    }
+
+
+    public void doComment(final boolean ignore) throws ParseException {
+        HeaderTokenizer ht;
+        final Token t;
+        ht =
+            new HeaderTokenizer(
+                "Apache(Geronimo)J2EE",
+                HeaderTokenizer.RFC822,
+                ignore);
+        validateToken(ht.next(), Token.ATOM, "Apache");
+        if (!ignore) {
+            validateToken(ht.next(), Token.COMMENT, "Geronimo");
+        }
+        validateToken(ht.next(), Token.ATOM, "J2EE");
+        assertEquals(Token.EOF, ht.next().getType());
+
+        ht =
+            new HeaderTokenizer(
+                "Apache(Geronimo (Project))J2EE",
+                HeaderTokenizer.RFC822,
+                ignore);
+        validateToken(ht.next(), Token.ATOM, "Apache");
+        if (!ignore) {
+            validateToken(ht.next(), Token.COMMENT, "Geronimo (Project)");
+        }
+        validateToken(ht.next(), Token.ATOM, "J2EE");
+        assertEquals(Token.EOF, ht.next().getType());
+    }
+
+    private void validateToken(final HeaderTokenizer.Token token, final int type, final String value) {
+        assertEquals(type, token.getType());
+        assertEquals(value, token.getValue());
+    }
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetAddressTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetAddressTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetAddressTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetAddressTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,553 @@
+/*
+ * 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 javax.mail.internet;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Properties;
+
+import javax.mail.Session;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InternetAddressTest extends TestCase {
+    private InternetAddress address;
+
+    public void testQuotedLiterals() throws Exception {
+        parseHeaderTest("\"Foo\t\n\\\\\\\"\" <fo...@apache.org>", true, "foo@apache.org", "Foo\t\n\\\"", "\"Foo\t\n\\\\\\\"\" <fo...@apache.org>", false);
+        parseHeaderTest("<\"...@apache.org>", true, "\"@,:;<>.[]()\"@apache.org", null, "<\"...@apache.org>", false);
+        parseHeaderTest("<\"...@apache.org>", true, "\"Foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseHeaderErrorTest("\"Foo <fo...@apache.org>", true);
+        parseHeaderErrorTest("\"Foo\r\" <fo...@apache.org>", true);
+    }
+
+    public void testDomainLiterals() throws Exception {
+        parseHeaderTest("<foo@[apache].org>", true, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseHeaderTest("<foo@[@()<>.,:;\"\\\\].org>", true, "foo@[@()<>.,:;\"\\\\].org", null, "<foo@[@()<>.,:;\"\\\\].org>", false);
+        parseHeaderTest("<foo@[\\[\\]].org>", true, "foo@[\\[\\]].org", null, "<foo@[\\[\\]].org>", false);
+        parseHeaderErrorTest("<foo@[[].org>", true);
+        parseHeaderErrorTest("<foo@[foo.org>", true);
+        parseHeaderErrorTest("<foo@[\r].org>", true);
+    }
+
+    public void testComments() throws Exception {
+        parseHeaderTest("Foo Bar (Fred) <fo...@apache.org>", true, "foo@apache.org", "Foo Bar (Fred)", "\"Foo Bar (Fred)\" <fo...@apache.org>", false);
+        parseHeaderTest("(Fred) foo@apache.org", true, "foo@apache.org", "Fred", "Fred <fo...@apache.org>", false);
+        parseHeaderTest("(\\(Fred\\)) foo@apache.org", true, "foo@apache.org", "(Fred)", "\"(Fred)\" <fo...@apache.org>", false);
+        parseHeaderTest("(Fred (Jones)) foo@apache.org", true, "foo@apache.org", "Fred (Jones)", "\"Fred (Jones)\" <fo...@apache.org>", false);
+        parseHeaderErrorTest("(Fred foo@apache.org", true);
+        parseHeaderErrorTest("(Fred\r) foo@apache.org", true);
+    }
+
+    public void testParseHeader() throws Exception {
+        parseHeaderTest("<@a...@apache.org>", false, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseHeaderTest("<@a...@apache.org>", false, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseHeaderTest("Foo Bar:;", false, "Foo Bar:;", null, "Foo Bar:;", true);
+        parseHeaderTest("\"\\\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        parseHeaderTest("\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("(Foo) (Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        parseHeaderTest("<fo...@apache.org>", false, "foo@apache.org", null, "foo@apache.org", false);
+        parseHeaderTest("Foo Bar <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("foo", false, "foo", null, "foo", false);
+        parseHeaderTest("\"foo\"", false, "\"foo\"", null, "<\"foo\">", false);
+        parseHeaderTest("foo@apache.org", false, "foo@apache.org", null, "foo@apache.org", false);
+        parseHeaderTest("\"foo\"@apache.org", false, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseHeaderTest("foo@[apache].org", false, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseHeaderTest("foo@[apache].[org]", false, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        parseHeaderTest("foo.bar@apache.org", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("(Foo Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("(Foo) (Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("\"Foo\" Bar <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        parseHeaderTest("(Foo Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("apache.org", false, "apache.org", null, "apache.org", false);
+    }
+
+    public void testValidate() throws Exception {
+        validateTest("@apache.org,@apache.net:foo@apache.org");
+        validateTest("@apache.org:foo@apache.org");
+        validateTest("Foo Bar:;");
+        validateTest("foo.bar@apache.org");
+        validateTest("bar@apache.org");
+        validateTest("foo");
+        validateTest("foo.bar");
+        validateTest("\"foo\"");
+        validateTest("\"foo\"@apache.org");
+        validateTest("foo@[apache].org");
+        validateTest("foo@[apache].[org]");
+    }
+
+    public void testStrictParseHeader() throws Exception {
+        parseHeaderTest("<@a...@apache.org>", true, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseHeaderTest("<@a...@apache.org>", true, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseHeaderTest("Foo Bar:;", true, "Foo Bar:;", null, "Foo Bar:;", true);
+        parseHeaderTest("\"\\\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        parseHeaderTest("\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("(Foo) (Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        parseHeaderTest("<fo...@apache.org>", true, "foo@apache.org", null, "foo@apache.org", false);
+        parseHeaderTest("Foo Bar <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("foo", true, "foo", null, "foo", false);
+        parseHeaderTest("\"foo\"", true, "\"foo\"", null, "<\"foo\">", false);
+        parseHeaderTest("foo@apache.org", true, "foo@apache.org", null, "foo@apache.org", false);
+        parseHeaderTest("\"foo\"@apache.org", true, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseHeaderTest("foo@[apache].org", true, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseHeaderTest("foo@[apache].[org]", true, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        parseHeaderTest("foo.bar@apache.org", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("(Foo Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("(Foo) (Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseHeaderTest("\"Foo\" Bar <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        parseHeaderTest("(Foo Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseHeaderTest("apache.org", true, "apache.org", null, "apache.org", false);
+    }
+
+    public void testParse() throws Exception {
+        parseTest("<@a...@apache.org>", false, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseTest("<@a...@apache.org>", false, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseTest("Foo Bar:;", false, "Foo Bar:;", null, "Foo Bar:;", true);
+        parseTest("\"\\\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        parseTest("\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        parseTest("(Foo) (Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        parseTest("<fo...@apache.org>", false, "foo@apache.org", null, "foo@apache.org", false);
+        parseTest("Foo Bar <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseTest("foo", false, "foo", null, "foo", false);
+        parseTest("\"foo\"", false, "\"foo\"", null, "<\"foo\">", false);
+        parseTest("foo@apache.org", false, "foo@apache.org", null, "foo@apache.org", false);
+        parseTest("\"foo\"@apache.org", false, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseTest("foo@[apache].org", false, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseTest("foo@[apache].[org]", false, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        parseTest("foo.bar@apache.org", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("(Foo Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("(Foo) (Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("\"Foo\" Bar <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        parseTest("(Foo Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseTest("apache.org", false, "apache.org", null, "apache.org", false);
+    }
+
+    public void testDefaultParse() throws Exception {
+        parseDefaultTest("<@a...@apache.org>", "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseDefaultTest("<@a...@apache.org>", "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseDefaultTest("Foo Bar:;", "Foo Bar:;", null, "Foo Bar:;", true);
+        parseDefaultTest("\"\\\"Foo Bar\" <fo...@apache.org>", "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        parseDefaultTest("\"Foo Bar\" <fo...@apache.org>", "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        parseDefaultTest("(Foo) (Bar) foo.bar@apache.org", "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        parseDefaultTest("<fo...@apache.org>", "foo@apache.org", null, "foo@apache.org", false);
+        parseDefaultTest("Foo Bar <fo...@apache.org>", "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseDefaultTest("foo", "foo", null, "foo", false);
+        parseDefaultTest("\"foo\"", "\"foo\"", null, "<\"foo\">", false);
+        parseDefaultTest("foo@apache.org", "foo@apache.org", null, "foo@apache.org", false);
+        parseDefaultTest("\"foo\"@apache.org", "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseDefaultTest("foo@[apache].org", "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseDefaultTest("foo@[apache].[org]", "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        parseDefaultTest("foo.bar@apache.org", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseDefaultTest("(Foo Bar) <fo...@apache.org>", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseDefaultTest("(Foo) (Bar) <fo...@apache.org>", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseDefaultTest("\"Foo\" Bar <fo...@apache.org>", "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        parseDefaultTest("(Foo Bar) foo.bar@apache.org", "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseDefaultTest("apache.org", "apache.org", null, "apache.org", false);
+    }
+
+    public void testStrictParse() throws Exception {
+        parseTest("<@a...@apache.org>", true, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseTest("<@a...@apache.org>", true, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        parseTest("Foo Bar:;", true, "Foo Bar:;", null, "Foo Bar:;", true);
+        parseTest("\"\\\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        parseTest("\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        parseTest("(Foo) (Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        parseTest("<fo...@apache.org>", true, "foo@apache.org", null, "foo@apache.org", false);
+        parseTest("Foo Bar <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseTest("foo", true, "foo", null, "foo", false);
+        parseTest("\"foo\"", true, "\"foo\"", null, "<\"foo\">", false);
+        parseTest("foo@apache.org", true, "foo@apache.org", null, "foo@apache.org", false);
+        parseTest("\"foo\"@apache.org", true, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        parseTest("foo@[apache].org", true, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        parseTest("foo@[apache].[org]", true, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        parseTest("foo.bar@apache.org", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("(Foo Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("(Foo) (Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        parseTest("\"Foo\" Bar <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        parseTest("(Foo Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        parseTest("apache.org", true, "apache.org", null, "apache.org", false);
+    }
+
+    public void testConstructor() throws Exception {
+        constructorTest("(Foo) (Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        constructorTest("<@a...@apache.org>", false, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorTest("<@a...@apache.org>", false, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorTest("Foo Bar:;", false, "Foo Bar:;", null, "Foo Bar:;", true);
+        constructorTest("\"\\\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        constructorTest("\"Foo Bar\" <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        constructorTest("<fo...@apache.org>", false, "foo@apache.org", null, "foo@apache.org", false);
+        constructorTest("Foo Bar <fo...@apache.org>", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorTest("foo", false, "foo", null, "foo", false);
+        constructorTest("\"foo\"", false, "\"foo\"", null, "<\"foo\">", false);
+        constructorTest("foo@apache.org", false, "foo@apache.org", null, "foo@apache.org", false);
+        constructorTest("\"foo\"@apache.org", false, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        constructorTest("foo@[apache].org", false, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        constructorTest("foo@[apache].[org]", false, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        constructorTest("foo.bar@apache.org", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("(Foo Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("(Foo) (Bar) <fo...@apache.org>", false, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("\"Foo\" Bar <fo...@apache.org>", false, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        constructorTest("(Foo Bar) foo.bar@apache.org", false, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorTest("apache.org", false, "apache.org", null, "apache.org", false);
+    }
+
+    public void testDefaultConstructor() throws Exception {
+        constructorDefaultTest("<@a...@apache.org>", "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorDefaultTest("<@a...@apache.org>", "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorDefaultTest("Foo Bar:;", "Foo Bar:;", null, "Foo Bar:;", true);
+        constructorDefaultTest("\"\\\"Foo Bar\" <fo...@apache.org>", "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        constructorDefaultTest("\"Foo Bar\" <fo...@apache.org>", "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        constructorDefaultTest("(Foo) (Bar) foo.bar@apache.org", "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        constructorDefaultTest("<fo...@apache.org>", "foo@apache.org", null, "foo@apache.org", false);
+        constructorDefaultTest("Foo Bar <fo...@apache.org>", "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorDefaultTest("foo", "foo", null, "foo", false);
+        constructorDefaultTest("\"foo\"", "\"foo\"", null, "<\"foo\">", false);
+        constructorDefaultTest("foo@apache.org", "foo@apache.org", null, "foo@apache.org", false);
+        constructorDefaultTest("\"foo\"@apache.org", "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        constructorDefaultTest("foo@[apache].org", "foo@[apache].org", null, "<foo@[apache].org>", false);
+        constructorDefaultTest("foo@[apache].[org]", "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        constructorDefaultTest("foo.bar@apache.org", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorDefaultTest("(Foo Bar) <fo...@apache.org>", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorDefaultTest("(Foo) (Bar) <fo...@apache.org>", "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorDefaultTest("\"Foo\" Bar <fo...@apache.org>", "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        constructorDefaultTest("(Foo Bar) foo.bar@apache.org", "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorDefaultTest("apache.org", "apache.org", null, "apache.org", false);
+    }
+
+    public void testStrictConstructor() throws Exception {
+        constructorTest("<@a...@apache.org>", true, "@apache.org,@apache.net:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorTest("<@a...@apache.org>", true, "@apache.org:foo@apache.org", null, "<@a...@apache.org>", false);
+        constructorTest("Foo Bar:;", true, "Foo Bar:;", null, "Foo Bar:;", true);
+        constructorTest("\"\\\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo Bar", "\"\\\"Foo Bar\" <fo...@apache.org>", false);
+        constructorTest("\"Foo Bar\" <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar",  "Foo Bar <fo...@apache.org>", false);
+        constructorTest("(Foo) (Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        constructorTest("<fo...@apache.org>", true, "foo@apache.org", null, "foo@apache.org", false);
+        constructorTest("Foo Bar <fo...@apache.org>", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorTest("foo", true, "foo", null, "foo", false);
+        constructorTest("\"foo\"", true, "\"foo\"", null, "<\"foo\">", false);
+        constructorTest("foo@apache.org", true, "foo@apache.org", null, "foo@apache.org", false);
+        constructorTest("\"foo\"@apache.org", true, "\"foo\"@apache.org", null, "<\"...@apache.org>", false);
+        constructorTest("foo@[apache].org", true, "foo@[apache].org", null, "<foo@[apache].org>", false);
+        constructorTest("foo@[apache].[org]", true, "foo@[apache].[org]", null, "<foo@[apache].[org]>", false);
+        constructorTest("foo.bar@apache.org", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("(Foo Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("(Foo) (Bar) <fo...@apache.org>", true, "foo.bar@apache.org", null, "foo.bar@apache.org", false);
+        constructorTest("\"Foo\" Bar <fo...@apache.org>", true, "foo.bar@apache.org", "\"Foo\" Bar", "\"\\\"Foo\\\" Bar\" <fo...@apache.org>", false);
+        constructorTest("(Foo Bar) foo.bar@apache.org", true, "foo.bar@apache.org", "Foo Bar", "Foo Bar <fo...@apache.org>", false);
+        constructorTest("apache.org", true, "apache.org", null, "apache.org", false);
+    }
+
+    public void testParseHeaderList() throws Exception {
+
+        InternetAddress[] addresses = InternetAddress.parseHeader("foo@apache.org,bar@apache.org", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = InternetAddress.parseHeader("Foo <fo...@apache.org>,,Bar <ba...@apache.org>", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", "Bar", "Bar <ba...@apache.org>", false);
+
+        addresses = InternetAddress.parseHeader("foo@apache.org, bar@apache.org", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = InternetAddress.parseHeader("Foo <fo...@apache.org>, Bar <ba...@apache.org>", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", "Bar", "Bar <ba...@apache.org>", false);
+
+
+        addresses = InternetAddress.parseHeader("Foo <fo...@apache.org>,(yada),Bar <ba...@apache.org>", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", "Bar", "Bar <ba...@apache.org>", false);
+    }
+
+    public void testParseHeaderErrors() throws Exception {
+        parseHeaderErrorTest("foo@apache.org bar@apache.org", true);
+        parseHeaderErrorTest("Foo foo@apache.org", true);
+        parseHeaderErrorTest("Foo foo@apache.org", true);
+        parseHeaderErrorTest("Foo <foo@apache.org", true);
+        parseHeaderErrorTest("[foo]@apache.org", true);
+        parseHeaderErrorTest("@apache.org", true);
+        parseHeaderErrorTest("foo@[apache.org", true);
+    }
+
+    public void testValidateErrors() throws Exception {
+        validateErrorTest("foo@apache.org bar@apache.org");
+        validateErrorTest("Foo foo@apache.org");
+        validateErrorTest("Foo foo@apache.org");
+        validateErrorTest("Foo <foo@apache.org");
+        validateErrorTest("[foo]@apache.org");
+        validateErrorTest("@apache.org");
+        validateErrorTest("foo@[apache.org");
+    }
+
+    public void testGroup() throws Exception {
+        parseHeaderTest("Foo:foo@apache.org;", true, "Foo:foo@apache.org;", null, "Foo:foo@apache.org;", true);
+        parseHeaderTest("Foo:foo@apache.org,bar@apache.org;", true, "Foo:foo@apache.org,bar@apache.org;", null, "Foo:foo@apache.org,bar@apache.org;", true);
+        parseHeaderTest("Foo Bar:<fo...@apache.org>,bar@apache.org;", true, "Foo Bar:<fo...@apache.org>,bar@apache.org;", null, "Foo Bar:<fo...@apache.org>,bar@apache.org;", true);
+        parseHeaderTest("Foo Bar:Foo <fo...@apache.org>,bar@apache.org;", true, "Foo Bar:Foo<fo...@apache.org>,bar@apache.org;", null, "Foo Bar:Foo<fo...@apache.org>,bar@apache.org;", true);
+        parseHeaderTest("Foo:<fo...@apache.org>,,bar@apache.org;", true, "Foo:<fo...@apache.org>,,bar@apache.org;", null, "Foo:<fo...@apache.org>,,bar@apache.org;", true);
+        parseHeaderTest("Foo:foo,bar;", true, "Foo:foo,bar;", null, "Foo:foo,bar;", true);
+        parseHeaderTest("Foo:;", true, "Foo:;", null, "Foo:;", true);
+        parseHeaderTest("\"Foo\":foo@apache.org;", true, "\"Foo\":foo@apache.org;", null, "\"Foo\":foo@apache.org;", true);
+
+        parseHeaderErrorTest("Foo:foo@apache.org,bar@apache.org", true);
+        parseHeaderErrorTest("Foo:foo@apache.org,Bar:bar@apache.org;;", true);
+        parseHeaderErrorTest(":foo@apache.org;", true);
+        parseHeaderErrorTest("Foo Bar:<foo@apache.org,bar@apache.org;", true);
+    }
+
+    public void testGetGroup() throws Exception {
+        InternetAddress[] addresses = getGroup("Foo:foo@apache.org;", true);
+        assertTrue("Expecting 1 address", addresses.length == 1);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+
+        addresses = getGroup("Foo:foo@apache.org,bar@apache.org;", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:<fo...@apache.org>,bar@apache.org;", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:<fo...@apache.org>,,bar@apache.org;", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:Foo <fo...@apache.org>,bar@apache.org;", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:Foo <@a...@apache.org>,bar@apache.org;", true);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "@apache.org:foo@apache.org", "Foo", "Foo <@a...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+
+        addresses = getGroup("Foo:;", true);
+        assertTrue("Expecting 0 addresses", addresses.length == 0);
+
+        addresses = getGroup("Foo:foo@apache.org;", false);
+        assertTrue("Expecting 1 address", addresses.length == 1);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+
+        addresses = getGroup("Foo:foo@apache.org,bar@apache.org;", false);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:<fo...@apache.org>,bar@apache.org;", false);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:<fo...@apache.org>,,bar@apache.org;", false);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", null, "foo@apache.org", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:Foo <fo...@apache.org>,bar@apache.org;", false);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "foo@apache.org", "Foo", "Foo <fo...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+        addresses = getGroup("Foo:Foo <@a...@apache.org>,bar@apache.org;", false);
+        assertTrue("Expecting 2 addresses", addresses.length == 2);
+        validateAddress(addresses[0], "@apache.org:foo@apache.org", "Foo", "Foo <@a...@apache.org>", false);
+        validateAddress(addresses[1], "bar@apache.org", null, "bar@apache.org", false);
+
+
+        addresses = getGroup("Foo:;", false);
+        assertTrue("Expecting 0 addresses", addresses.length == 0);
+    }
+
+
+    public void testLocalAddress() throws Exception {
+        System.getProperties().remove("user.name");
+
+        assertNull(InternetAddress.getLocalAddress(null));
+        System.setProperty("user.name", "dev");
+
+        InternetAddress localHost = null;
+        String user = null;
+        String host = null;
+        try {
+            user = System.getProperty("user.name");
+            host = InetAddress.getLocalHost().getHostName();
+
+            localHost = new InternetAddress(user + "@" + host);
+        } catch (final AddressException e) {
+            // ignore
+        } catch (final UnknownHostException e) {
+            // ignore
+        } catch (final SecurityException e) {
+            // ignore
+        }
+
+        assertEquals(InternetAddress.getLocalAddress(null), localHost);
+
+        final Properties props = new Properties();
+        Session session = Session.getInstance(props, null);
+
+        assertEquals(InternetAddress.getLocalAddress(session), localHost);
+
+        props.put("mail.host", "apache.org");
+        session = Session.getInstance(props, null);
+
+        assertEquals(InternetAddress.getLocalAddress(session), new InternetAddress(user + "@apache.org"));
+
+        props.put("mail.user", "user");
+        props.remove("mail.host");
+
+        session = Session.getInstance(props, null);
+        assertEquals(InternetAddress.getLocalAddress(session), new InternetAddress("user@" + host));
+
+        props.put("mail.host", "apache.org");
+        session = Session.getInstance(props, null);
+
+        assertEquals(InternetAddress.getLocalAddress(session), new InternetAddress("user@apache.org"));
+
+        props.put("mail.from", "tester@incubator.apache.org");
+        session = Session.getInstance(props, null);
+
+        assertEquals(InternetAddress.getLocalAddress(session), new InternetAddress("tester@incubator.apache.org"));
+    }
+
+    private InternetAddress[] getGroup(final String address, final boolean strict) throws AddressException
+    {
+        final InternetAddress group = new InternetAddress(address);
+        return group.getGroup(strict);
+    }
+
+
+    @Override
+    protected void setUp() throws Exception {
+        address = new InternetAddress();
+    }
+
+    private void parseHeaderTest(final String address, final boolean strict, final String resultAddr, final String personal, final String toString, final boolean group) throws Exception
+    {
+        final InternetAddress[] addresses = InternetAddress.parseHeader(address, strict);
+        assertTrue(addresses.length == 1);
+        validateAddress(addresses[0], resultAddr, personal, toString, group);
+    }
+
+    private void parseHeaderErrorTest(final String address, final boolean strict) throws Exception
+    {
+        try {
+            InternetAddress.parseHeader(address, strict);
+            fail("Expected AddressException");
+        } catch (final AddressException e) {
+        }
+    }
+
+    private void constructorTest(final String address, final boolean strict, final String resultAddr, final String personal, final String toString, final boolean group) throws Exception
+    {
+        validateAddress(new InternetAddress(address, strict), resultAddr, personal, toString, group);
+    }
+
+    private void constructorDefaultTest(final String address, final String resultAddr, final String personal, final String toString, final boolean group) throws Exception
+    {
+        validateAddress(new InternetAddress(address), resultAddr, personal, toString, group);
+    }
+
+    private void constructorErrorTest(final String address, final boolean strict) throws Exception
+    {
+        try {
+            final InternetAddress foo = new InternetAddress(address, strict);
+            fail("Expected AddressException");
+        } catch (final AddressException e) {
+        }
+    }
+
+    private void parseTest(final String address, final boolean strict, final String resultAddr, final String personal, final String toString, final boolean group) throws Exception
+    {
+        final InternetAddress[] addresses = InternetAddress.parse(address, strict);
+        assertTrue(addresses.length == 1);
+        validateAddress(addresses[0], resultAddr, personal, toString, group);
+    }
+
+    private void parseErrorTest(final String address, final boolean strict) throws Exception
+    {
+        try {
+            InternetAddress.parse(address, strict);
+            fail("Expected AddressException");
+        } catch (final AddressException e) {
+        }
+    }
+
+    private void parseDefaultTest(final String address, final String resultAddr, final String personal, final String toString, final boolean group) throws Exception
+    {
+        final InternetAddress[] addresses = InternetAddress.parse(address);
+        assertTrue(addresses.length == 1);
+        validateAddress(addresses[0], resultAddr, personal, toString, group);
+    }
+
+    private void parseDefaultErrorTest(final String address) throws Exception
+    {
+        try {
+            InternetAddress.parse(address);
+            fail("Expected AddressException");
+        } catch (final AddressException e) {
+        }
+    }
+
+    private void validateTest(final String address) throws Exception {
+        final InternetAddress test = new InternetAddress();
+        test.setAddress(address);
+        test.validate();
+    }
+
+    private void validateErrorTest(final String address) throws Exception {
+        final InternetAddress test = new InternetAddress();
+        test.setAddress(address);
+        try {
+            test.validate();
+            fail("Expected AddressException");
+        } catch (final AddressException e) {
+        }
+    }
+
+
+    private void validateAddress(final InternetAddress a, final String address, final String personal, final String toString, final boolean group)
+    {
+        assertEquals("Invalid address:", a.getAddress(), address);
+        if (personal == null) {
+            assertNull("Personal must be null", a.getPersonal());
+        }
+        else {
+            assertEquals("Invalid Personal:", a.getPersonal(), personal);
+        }
+        assertEquals("Invalid string value:", a.toString(), toString);
+        assertTrue("Incorrect group value:", group == a.isGroup());
+    }
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetHeadersTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetHeadersTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetHeadersTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/InternetHeadersTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,46 @@
+/*
+ * 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 javax.mail.internet;
+
+import java.io.ByteArrayInputStream;
+
+import javax.mail.MessagingException;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class InternetHeadersTest extends TestCase {
+    private InternetHeaders headers;
+
+    public void testLoadSingleHeader() throws MessagingException {
+        final String stream = "content-type: text/plain\r\n\r\n";
+        headers.load(new ByteArrayInputStream(stream.getBytes()));
+        final String[] header = headers.getHeader("content-type");
+        assertNotNull(header);
+        assertEquals("text/plain", header[0]);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        headers = new InternetHeaders();
+    }
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MailDateFormatTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MailDateFormatTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MailDateFormatTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MailDateFormatTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,96 @@
+/*
+ * 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 javax.mail.internet;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.SimpleTimeZone;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MailDateFormatTest extends TestCase {
+    public void testMailDateFormat() throws ParseException {
+        final MailDateFormat mdf = new MailDateFormat();
+        Date date = mdf.parse("Wed, 27 Aug 2003 13:43:38 +0100 (BST)");
+        // don't we just love the Date class?
+        Calendar cal = Calendar.getInstance(new SimpleTimeZone(+1 * 60 * 60 * 1000, "BST"), Locale.getDefault());
+        cal.setTime(date);
+        assertEquals(2003, cal.get(Calendar.YEAR));
+        assertEquals(Calendar.AUGUST, cal.get(Calendar.MONTH));
+        assertEquals(27, cal.get(Calendar.DAY_OF_MONTH));
+        assertEquals(Calendar.WEDNESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(13, cal.get(Calendar.HOUR_OF_DAY));
+        assertEquals(43, cal.get(Calendar.MINUTE));
+        assertEquals(38, cal.get(Calendar.SECOND));
+        
+        date = mdf.parse("Wed, 27-Aug-2003 13:43:38 +0100");
+        // don't we just love the Date class?
+        cal = Calendar.getInstance(new SimpleTimeZone(+1 * 60 * 60 * 1000, "BST"), Locale.getDefault());
+        cal.setTime(date);
+        assertEquals(2003, cal.get(Calendar.YEAR));
+        assertEquals(Calendar.AUGUST, cal.get(Calendar.MONTH));
+        assertEquals(27, cal.get(Calendar.DAY_OF_MONTH));
+        assertEquals(Calendar.WEDNESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(13, cal.get(Calendar.HOUR_OF_DAY));
+        assertEquals(43, cal.get(Calendar.MINUTE));
+        assertEquals(38, cal.get(Calendar.SECOND));
+        
+        date = mdf.parse("27-Aug-2003 13:43:38 EST");
+        // don't we just love the Date class?
+        cal = Calendar.getInstance(new SimpleTimeZone(-5 * 60 * 60 * 1000, "EST"), Locale.getDefault());
+        cal.setTime(date);
+        assertEquals(2003, cal.get(Calendar.YEAR));
+        assertEquals(Calendar.AUGUST, cal.get(Calendar.MONTH));
+        assertEquals(27, cal.get(Calendar.DAY_OF_MONTH));
+        assertEquals(Calendar.WEDNESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(13, cal.get(Calendar.HOUR_OF_DAY));
+        assertEquals(43, cal.get(Calendar.MINUTE));
+        assertEquals(38, cal.get(Calendar.SECOND));
+        
+        date = mdf.parse("27 Aug 2003 13:43 EST");
+        // don't we just love the Date class?
+        cal = Calendar.getInstance(new SimpleTimeZone(-5 * 60 * 60 * 1000, "EST"), Locale.getDefault());
+        cal.setTime(date);
+        assertEquals(2003, cal.get(Calendar.YEAR));
+        assertEquals(Calendar.AUGUST, cal.get(Calendar.MONTH));
+        assertEquals(27, cal.get(Calendar.DAY_OF_MONTH));
+        assertEquals(Calendar.WEDNESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(13, cal.get(Calendar.HOUR_OF_DAY));
+        assertEquals(43, cal.get(Calendar.MINUTE));
+        assertEquals(00, cal.get(Calendar.SECOND));
+        
+        date = mdf.parse("27 Aug 03 13:43 EST");
+        // don't we just love the Date class?
+        cal = Calendar.getInstance(new SimpleTimeZone(-5 * 60 * 60 * 1000, "EST"), Locale.getDefault());
+        cal.setTime(date);
+        assertEquals(2003, cal.get(Calendar.YEAR));
+        assertEquals(Calendar.AUGUST, cal.get(Calendar.MONTH));
+        assertEquals(27, cal.get(Calendar.DAY_OF_MONTH));
+        assertEquals(Calendar.WEDNESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(13, cal.get(Calendar.HOUR_OF_DAY));
+        assertEquals(43, cal.get(Calendar.MINUTE));
+        assertEquals(00, cal.get(Calendar.SECOND));
+    }
+}

Added: geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MimeBodyPartTest.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MimeBodyPartTest.java?rev=1620683&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MimeBodyPartTest.java (added)
+++ geronimo/specs/trunk/geronimo-javamail_1.5_spec/src/test/java/javax/mail/internet/MimeBodyPartTest.java Tue Aug 26 18:17:06 2014
@@ -0,0 +1,261 @@
+/*
+ * 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 javax.mail.internet;
+
+import junit.framework.TestCase;
+
+import javax.activation.DataHandler;
+import javax.mail.EncodingAware;
+import javax.mail.MessagingException;
+import javax.mail.Part;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MimeBodyPartTest extends TestCase {
+
+    File basedir = new File(System.getProperty("basedir", "."));
+    File testInput = new File(basedir, "src/test/resources/test.dat");
+
+    public void testGetSize() throws MessagingException {
+        MimeBodyPart part = new MimeBodyPart();
+        assertEquals(part.getSize(), -1);
+
+        part = new MimeBodyPart(new InternetHeaders(), new byte[] {'a', 'b', 'c'});
+        assertEquals(part.getSize(), 3);
+    }
+
+    public void testGetLineCount() throws MessagingException {
+        MimeBodyPart part = new MimeBodyPart();
+        assertEquals(part.getLineCount(), -1);
+
+        part = new MimeBodyPart(new InternetHeaders(), new byte[] {'a', 'b', 'c'});
+        assertEquals(part.getLineCount(), -1);
+    }
+
+
+    public void testGetContentType() throws MessagingException {
+        MimeBodyPart part = new MimeBodyPart();
+        assertEquals(part.getContentType(), "text/plain");
+
+        part.setHeader("Content-Type", "text/xml");
+        assertEquals(part.getContentType(), "text/xml");
+
+        part = new MimeBodyPart();
+        part.setText("abc");
+        assertEquals(part.getContentType(), "text/plain");
+    }
+
+
+    public void testIsMimeType() throws MessagingException {
+        final MimeBodyPart part = new MimeBodyPart();
+        assertTrue(part.isMimeType("text/plain"));
+        assertTrue(part.isMimeType("text/*"));
+
+        part.setHeader("Content-Type", "text/xml");
+        assertTrue(part.isMimeType("text/xml"));
+        assertTrue(part.isMimeType("text/*"));
+    }
+
+
+    public void testGetDisposition() throws MessagingException {
+        final MimeBodyPart part = new MimeBodyPart();
+        assertNull(part.getDisposition());
+
+        part.setDisposition("inline");
+        assertEquals(part.getDisposition(), "inline");
+    }
+    
+    public void testJavaMail15AttachmentDisposition() throws MessagingException, IOException {
+        final MimeBodyPart part = new MimeBodyPart();
+        assertNull(part.getDisposition());
+        final File testInput = new File(basedir, "src/test/resources/test.dat");
+        part.attachFile(testInput);
+        assertEquals(Part.ATTACHMENT, part.getDisposition());
+    }
+    
+    public void testJavaMail15EncodingAware() throws MessagingException, IOException {
+    	final File testInput = new File(basedir, "src/test/resources/test.dat");
+    	final MimeBodyPart part = new MimeBodyPart();
+        part.attachFile(testInput, "application/octet-stream", "7bit"); // depending on the OS encoding can change
+        part.updateHeaders();
+        assertTrue(part.getDataHandler().getContentType().equals("application/octet-stream"));
+        assertEquals("7bit", part.getEncoding());
+        
+        final MimeBodyPart part2 = new MimeBodyPart();
+        part2.attachFile(testInput,"application/pdf","base64");
+        part2.updateHeaders();
+        assertTrue(part2.getDataHandler().getContentType().equals("application/pdf"));
+        assertEquals("base64", part2.getEncoding());
+    }
+
+
+    public void testSetDescription() throws MessagingException, UnsupportedEncodingException {
+        final MimeBodyPart part = new MimeBodyPart();
+
+        final String simpleSubject = "Yada, yada";
+
+        final String complexSubject = "Yada, yada\u0081";
+
+        final String mungedSubject = "Yada, yada\u003F";
+
+        part.setDescription(simpleSubject);
+        assertEquals(part.getDescription(), simpleSubject);
+
+        part.setDescription(complexSubject, "UTF-8");
+        assertEquals(part.getDescription(), complexSubject);
+        assertEquals(part.getHeader("Content-Description", null), MimeUtility.encodeText(complexSubject, "UTF-8", null));
+
+        part.setDescription(null);
+        assertNull(part.getDescription());
+    }
+
+    public void testSetFileName() throws Exception {
+        final MimeBodyPart part = new MimeBodyPart();
+        part.setFileName("test.dat");
+
+        assertEquals("test.dat", part.getFileName());
+
+        final ContentDisposition disp = new ContentDisposition(part.getHeader("Content-Disposition", null));
+        assertEquals("test.dat", disp.getParameter("filename"));
+
+        final ContentType type = new ContentType(part.getHeader("Content-Type", null));
+        assertEquals("test.dat", type.getParameter("name"));
+
+        final MimeBodyPart part2 = new MimeBodyPart();
+
+        part2.setHeader("Content-Type", type.toString());
+
+        assertEquals("test.dat", part2.getFileName());
+        part2.setHeader("Content-Type", null);
+        part2.setHeader("Content-Disposition", disp.toString());
+        assertEquals("test.dat", part2.getFileName());
+    }
+
+
+    public void testAttachments() throws Exception {
+        MimeBodyPart part = new MimeBodyPart();
+
+        final byte[] testData = getFileData(testInput);
+
+        part.attachFile(testInput);
+        assertEquals(part.getFileName(), testInput.getName());
+
+        part.updateHeaders();
+
+        File temp1 = File.createTempFile("MIME", ".dat");
+        temp1.deleteOnExit();
+
+        part.saveFile(temp1);
+
+        byte[] tempData = getFileData(temp1);
+
+        compareFileData(testData, tempData);
+
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        part.writeTo(out);
+
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+
+        MimeBodyPart part2 = new MimeBodyPart(in);
+
+        temp1 = File.createTempFile("MIME", ".dat");
+        temp1.deleteOnExit();
+
+        part2.saveFile(temp1);
+
+        tempData = getFileData(temp1);
+
+        compareFileData(testData, tempData);
+
+
+        part = new MimeBodyPart();
+
+        part.attachFile(testInput.getPath());
+        assertEquals(part.getFileName(), testInput.getName());
+
+        part.updateHeaders();
+
+        temp1 = File.createTempFile("MIME", ".dat");
+        temp1.deleteOnExit();
+
+        part.saveFile(temp1.getPath());
+
+        tempData = getFileData(temp1);
+
+        compareFileData(testData, tempData);
+
+        out = new ByteArrayOutputStream();
+        part.writeTo(out);
+
+        in = new ByteArrayInputStream(out.toByteArray());
+
+        part2 = new MimeBodyPart(in);
+
+        temp1 = File.createTempFile("MIME", ".dat");
+        temp1.deleteOnExit();
+
+        part2.saveFile(temp1.getPath());
+
+        tempData = getFileData(temp1);
+
+        compareFileData(testData, tempData);
+    }
+
+    private byte[] getFileData(final File source) throws Exception {
+        final FileInputStream testIn = new FileInputStream(source);
+
+        final byte[] testData = new byte[(int)source.length()];
+
+        testIn.read(testData);
+        testIn.close();
+        return testData;
+    }
+
+    private void compareFileData(final byte[] file1, final byte [] file2) {
+        assertEquals(file1.length, file2.length);
+        for (int i = 0; i < file1.length; i++) {
+            assertEquals(file1[i], file2[i]);
+        }
+    }
+
+
+
+    class TestMimeBodyPart extends MimeBodyPart {
+        public TestMimeBodyPart() {
+            super();
+        }
+
+
+        @Override
+        public void updateHeaders() throws MessagingException {
+            super.updateHeaders();
+        }
+    }
+}
+