http://git-wip-us.apache.org/repos/asf/ant/blob/1ae68097/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java
----------------------------------------------------------------------
diff --git 
a/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java 
b/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java
index 0950827..559e4f0 100644
--- a/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java
+++ b/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java
@@ -1,204 +1,204 @@
-/*
- *  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.tools.ant.util.regexp;
-
-import java.io.IOException;
-import java.util.Vector;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for all implementations of the RegexpMatcher interface.
- *
- */
-public abstract class RegexpMatcherTest extends TestCase {
-
-    public final static String UNIX_LINE = "\n";
-
-    private RegexpMatcher reg;
-
-    public abstract RegexpMatcher getImplementation();
-
-    protected final RegexpMatcher getReg() {return reg;}
-
-    public RegexpMatcherTest(String name) {
-        super(name);
-    }
-
-    public void setUp() {
-        reg = getImplementation();
-    }
-
-    public void testMatches() {
-        reg.setPattern("aaaa");
-        assertTrue("aaaa should match itself", reg.matches("aaaa"));
-        assertTrue("aaaa should match xaaaa", reg.matches("xaaaa"));
-        assertTrue("aaaa shouldn\'t match xaaa", !reg.matches("xaaa"));
-        reg.setPattern("^aaaa");
-        assertTrue("^aaaa shouldn\'t match xaaaa", !reg.matches("xaaaa"));
-        assertTrue("^aaaa should match aaaax", reg.matches("aaaax"));
-        reg.setPattern("aaaa$");
-        assertTrue("aaaa$ shouldn\'t match aaaax", !reg.matches("aaaax"));
-        assertTrue("aaaa$ should match xaaaa", reg.matches("xaaaa"));
-        reg.setPattern("[0-9]+");
-        assertTrue("[0-9]+ should match 123", reg.matches("123"));
-        assertTrue("[0-9]+ should match 1", reg.matches("1"));
-        assertTrue("[0-9]+ shouldn\'t match \'\'", !reg.matches(""));
-        assertTrue("[0-9]+ shouldn\'t match a", !reg.matches("a"));
-        reg.setPattern("[0-9]*");
-        assertTrue("[0-9]* should match 123", reg.matches("123"));
-        assertTrue("[0-9]* should match 1", reg.matches("1"));
-        assertTrue("[0-9]* should match \'\'", reg.matches(""));
-        assertTrue("[0-9]* should match a", reg.matches("a"));
-        reg.setPattern("([0-9]+)=\\1");
-        assertTrue("([0-9]+)=\\1 should match 1=1", reg.matches("1=1"));
-        assertTrue("([0-9]+)=\\1 shouldn\'t match 1=2", !reg.matches("1=2"));
-    }
-
-    public void testGroups() {
-        reg.setPattern("aaaa");
-        Vector v = reg.getGroups("xaaaa");
-        assertEquals("No parens -> no extra groups", 1, v.size());
-        assertEquals("Trivial match with no parens", "aaaa",
-                     (String) v.elementAt(0));
-
-        reg.setPattern("(aaaa)");
-        v = reg.getGroups("xaaaa");
-        assertEquals("Trivial match with single paren", 2, v.size());
-        assertEquals("Trivial match with single paren, full match", "aaaa",
-                     (String) v.elementAt(0));
-        assertEquals("Trivial match with single paren, matched paren", "aaaa",
-                     (String) v.elementAt(0));
-
-        reg.setPattern("(a+)b(b+)");
-        v = reg.getGroups("xaabb");
-        assertEquals(3, v.size());
-        assertEquals("aabb", (String) v.elementAt(0));
-        assertEquals("aa", (String) v.elementAt(1));
-        assertEquals("b", (String) v.elementAt(2));
-    }
-
-    public void testBugzillaReport14619() {
-        reg.setPattern("^(.*)/src/((.*/)*)([a-zA-Z0-9_\\.]+)\\.java$");
-        Vector v = reg.getGroups("de/tom/src/Google.java");
-        assertEquals(5, v.size());
-        assertEquals("de/tom", v.elementAt(1));
-        assertEquals("", v.elementAt(2));
-        assertEquals("", v.elementAt(3));
-        assertEquals("Google", v.elementAt(4));
-    }
-
-    public void testCaseInsensitiveMatch() {
-        reg.setPattern("aaaa");
-        assertTrue("aaaa doesn't match AAaa", !reg.matches("AAaa"));
-        assertTrue("aaaa matches AAaa ignoring case",
-                   reg.matches("AAaa", RegexpMatcher.MATCH_CASE_INSENSITIVE));
-    }
-
-
-// make sure there are no issues concerning line separator interpretation
-// a line separator for regex (perl) is always a unix line (ie \n)
-
-    public void testParagraphCharacter() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("paragraph character", !reg.matches("end of text\u2029"));
-    }
-
-    public void testLineSeparatorCharacter() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("line-separator character", !reg.matches("end of 
text\u2028"));
-    }
-
-    public void testNextLineCharacter() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("next-line character", !reg.matches("end of text\u0085"));
-    }
-
-    public void testStandaloneCR() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("standalone CR", !reg.matches("end of text\r"));
-    }
-
-    public void testWindowsLineSeparator() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("Windows line separator", !reg.matches("end of text\r\n"));
-    }
-
-    public void testWindowsLineSeparator2() throws IOException {
-        reg.setPattern("end of text\r$");
-        assertTrue("Windows line separator", reg.matches("end of text\r\n"));
-    }
-
-    public void testUnixLineSeparator() throws IOException {
-        reg.setPattern("end of text$");
-        assertTrue("Unix line separator", reg.matches("end of text\n"));
-    }
-
-
-    public void testMultiVersusSingleLine() throws IOException {
-        StringBuffer buf = new StringBuffer();
-        buf.append("Line1").append(UNIX_LINE);
-        buf.append("starttest Line2").append(UNIX_LINE);
-        buf.append("Line3 endtest").append(UNIX_LINE);
-        buf.append("Line4").append(UNIX_LINE);
-        String text = buf.toString();
-
-        doStartTest1(text);
-        doStartTest2(text);
-        doEndTest1(text);
-        doEndTest2(text);
-    }
-
-    protected void doStartTest1(String text) {
-        reg.setPattern("^starttest");
-        assertTrue("^starttest in default mode", !reg.matches(text));
-        assertTrue("^starttest in single line mode",
-               !reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
-        assertTrue("^starttest in multi line mode",
-               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
-    }
-
-    protected void doStartTest2(String text) {
-        reg.setPattern("^Line1");
-        assertTrue("^Line1 in default mode", reg.matches(text));
-        assertTrue("^Line1 in single line mode",
-               reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
-        assertTrue("^Line1 in multi line mode",
-               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
-    }
-
-    protected void doEndTest1(String text) {
-        reg.setPattern("endtest$");
-        assertTrue("endtest$ in default mode", !reg.matches(text));
-        assertTrue("endtest$ in single line mode",
-               !reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
-        assertTrue("endtest$ in multi line mode",
-               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
-    }
-
-    protected void doEndTest2(String text) {
-        reg.setPattern("Line4$");
-        assertTrue("Line4$ in default mode", reg.matches(text));
-        assertTrue("Line4$ in single line mode",
-               reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
-        assertTrue("Line4$ in multi line mode",
-               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
-    }
-
-}
+/*
+ *  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.tools.ant.util.regexp;
+
+import java.io.IOException;
+import java.util.Vector;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for all implementations of the RegexpMatcher interface.
+ *
+ */
+public abstract class RegexpMatcherTest extends TestCase {
+
+    public final static String UNIX_LINE = "\n";
+
+    private RegexpMatcher reg;
+
+    public abstract RegexpMatcher getImplementation();
+
+    protected final RegexpMatcher getReg() {return reg;}
+
+    public RegexpMatcherTest(String name) {
+        super(name);
+    }
+
+    public void setUp() {
+        reg = getImplementation();
+    }
+
+    public void testMatches() {
+        reg.setPattern("aaaa");
+        assertTrue("aaaa should match itself", reg.matches("aaaa"));
+        assertTrue("aaaa should match xaaaa", reg.matches("xaaaa"));
+        assertTrue("aaaa shouldn\'t match xaaa", !reg.matches("xaaa"));
+        reg.setPattern("^aaaa");
+        assertTrue("^aaaa shouldn\'t match xaaaa", !reg.matches("xaaaa"));
+        assertTrue("^aaaa should match aaaax", reg.matches("aaaax"));
+        reg.setPattern("aaaa$");
+        assertTrue("aaaa$ shouldn\'t match aaaax", !reg.matches("aaaax"));
+        assertTrue("aaaa$ should match xaaaa", reg.matches("xaaaa"));
+        reg.setPattern("[0-9]+");
+        assertTrue("[0-9]+ should match 123", reg.matches("123"));
+        assertTrue("[0-9]+ should match 1", reg.matches("1"));
+        assertTrue("[0-9]+ shouldn\'t match \'\'", !reg.matches(""));
+        assertTrue("[0-9]+ shouldn\'t match a", !reg.matches("a"));
+        reg.setPattern("[0-9]*");
+        assertTrue("[0-9]* should match 123", reg.matches("123"));
+        assertTrue("[0-9]* should match 1", reg.matches("1"));
+        assertTrue("[0-9]* should match \'\'", reg.matches(""));
+        assertTrue("[0-9]* should match a", reg.matches("a"));
+        reg.setPattern("([0-9]+)=\\1");
+        assertTrue("([0-9]+)=\\1 should match 1=1", reg.matches("1=1"));
+        assertTrue("([0-9]+)=\\1 shouldn\'t match 1=2", !reg.matches("1=2"));
+    }
+
+    public void testGroups() {
+        reg.setPattern("aaaa");
+        Vector v = reg.getGroups("xaaaa");
+        assertEquals("No parens -> no extra groups", 1, v.size());
+        assertEquals("Trivial match with no parens", "aaaa",
+                     (String) v.elementAt(0));
+
+        reg.setPattern("(aaaa)");
+        v = reg.getGroups("xaaaa");
+        assertEquals("Trivial match with single paren", 2, v.size());
+        assertEquals("Trivial match with single paren, full match", "aaaa",
+                     (String) v.elementAt(0));
+        assertEquals("Trivial match with single paren, matched paren", "aaaa",
+                     (String) v.elementAt(0));
+
+        reg.setPattern("(a+)b(b+)");
+        v = reg.getGroups("xaabb");
+        assertEquals(3, v.size());
+        assertEquals("aabb", (String) v.elementAt(0));
+        assertEquals("aa", (String) v.elementAt(1));
+        assertEquals("b", (String) v.elementAt(2));
+    }
+
+    public void testBugzillaReport14619() {
+        reg.setPattern("^(.*)/src/((.*/)*)([a-zA-Z0-9_\\.]+)\\.java$");
+        Vector v = reg.getGroups("de/tom/src/Google.java");
+        assertEquals(5, v.size());
+        assertEquals("de/tom", v.elementAt(1));
+        assertEquals("", v.elementAt(2));
+        assertEquals("", v.elementAt(3));
+        assertEquals("Google", v.elementAt(4));
+    }
+
+    public void testCaseInsensitiveMatch() {
+        reg.setPattern("aaaa");
+        assertTrue("aaaa doesn't match AAaa", !reg.matches("AAaa"));
+        assertTrue("aaaa matches AAaa ignoring case",
+                   reg.matches("AAaa", RegexpMatcher.MATCH_CASE_INSENSITIVE));
+    }
+
+
+// make sure there are no issues concerning line separator interpretation
+// a line separator for regex (perl) is always a unix line (ie \n)
+
+    public void testParagraphCharacter() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("paragraph character", !reg.matches("end of text\u2029"));
+    }
+
+    public void testLineSeparatorCharacter() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("line-separator character", !reg.matches("end of 
text\u2028"));
+    }
+
+    public void testNextLineCharacter() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("next-line character", !reg.matches("end of text\u0085"));
+    }
+
+    public void testStandaloneCR() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("standalone CR", !reg.matches("end of text\r"));
+    }
+
+    public void testWindowsLineSeparator() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("Windows line separator", !reg.matches("end of text\r\n"));
+    }
+
+    public void testWindowsLineSeparator2() throws IOException {
+        reg.setPattern("end of text\r$");
+        assertTrue("Windows line separator", reg.matches("end of text\r\n"));
+    }
+
+    public void testUnixLineSeparator() throws IOException {
+        reg.setPattern("end of text$");
+        assertTrue("Unix line separator", reg.matches("end of text\n"));
+    }
+
+
+    public void testMultiVersusSingleLine() throws IOException {
+        StringBuffer buf = new StringBuffer();
+        buf.append("Line1").append(UNIX_LINE);
+        buf.append("starttest Line2").append(UNIX_LINE);
+        buf.append("Line3 endtest").append(UNIX_LINE);
+        buf.append("Line4").append(UNIX_LINE);
+        String text = buf.toString();
+
+        doStartTest1(text);
+        doStartTest2(text);
+        doEndTest1(text);
+        doEndTest2(text);
+    }
+
+    protected void doStartTest1(String text) {
+        reg.setPattern("^starttest");
+        assertTrue("^starttest in default mode", !reg.matches(text));
+        assertTrue("^starttest in single line mode",
+               !reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
+        assertTrue("^starttest in multi line mode",
+               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
+    }
+
+    protected void doStartTest2(String text) {
+        reg.setPattern("^Line1");
+        assertTrue("^Line1 in default mode", reg.matches(text));
+        assertTrue("^Line1 in single line mode",
+               reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
+        assertTrue("^Line1 in multi line mode",
+               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
+    }
+
+    protected void doEndTest1(String text) {
+        reg.setPattern("endtest$");
+        assertTrue("endtest$ in default mode", !reg.matches(text));
+        assertTrue("endtest$ in single line mode",
+               !reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
+        assertTrue("endtest$ in multi line mode",
+               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
+    }
+
+    protected void doEndTest2(String text) {
+        reg.setPattern("Line4$");
+        assertTrue("Line4$ in default mode", reg.matches(text));
+        assertTrue("Line4$ in single line mode",
+               reg.matches(text, RegexpMatcher.MATCH_SINGLELINE));
+        assertTrue("Line4$ in multi line mode",
+               reg.matches(text, RegexpMatcher.MATCH_MULTILINE));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ant/blob/1ae68097/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java 
b/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java
index 5cfe8c9..b083bfa 100644
--- a/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java
+++ b/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java
@@ -1,63 +1,63 @@
-/*
- *  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.tools.ant.util.regexp;
-
-/**
- * Tests for all implementations of the Regexp interface.
- *
- */
-public abstract class RegexpTest extends RegexpMatcherTest {
-
-    private static final String test = "abcdefg-abcdefg";
-    private static final String pattern = "ab([^d]*)d([^f]*)f";
-
-    public RegexpTest(String name) {
-        super(name);
-    }
-
-    public final RegexpMatcher getImplementation() {
-        return getRegexpImplementation();
-    }
-
-    public abstract Regexp getRegexpImplementation();
-
-    public void testSubstitution() {
-        Regexp reg = (Regexp) getReg();
-        reg.setPattern(pattern);
-        assertTrue(reg.matches(test));
-        assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f",
-                                                       Regexp.MATCH_DEFAULT));
-    }
-
-    public void testReplaceFirstSubstitution() {
-        Regexp reg = (Regexp) getReg();
-        reg.setPattern(pattern);
-        assertTrue(reg.matches(test));
-        assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f",
-                                                       Regexp.REPLACE_FIRST));
-    }
-
-    public void testReplaceAllSubstitution() {
-        Regexp reg = (Regexp) getReg();
-        reg.setPattern(pattern);
-        assertTrue(reg.matches(test));
-        assertEquals("abedcfg-abedcfg", reg.substitute(test, "ab\\2d\\1f",
-                                                       Regexp.REPLACE_ALL));
-    }
-}
+/*
+ *  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.tools.ant.util.regexp;
+
+/**
+ * Tests for all implementations of the Regexp interface.
+ *
+ */
+public abstract class RegexpTest extends RegexpMatcherTest {
+
+    private static final String test = "abcdefg-abcdefg";
+    private static final String pattern = "ab([^d]*)d([^f]*)f";
+
+    public RegexpTest(String name) {
+        super(name);
+    }
+
+    public final RegexpMatcher getImplementation() {
+        return getRegexpImplementation();
+    }
+
+    public abstract Regexp getRegexpImplementation();
+
+    public void testSubstitution() {
+        Regexp reg = (Regexp) getReg();
+        reg.setPattern(pattern);
+        assertTrue(reg.matches(test));
+        assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f",
+                                                       Regexp.MATCH_DEFAULT));
+    }
+
+    public void testReplaceFirstSubstitution() {
+        Regexp reg = (Regexp) getReg();
+        reg.setPattern(pattern);
+        assertTrue(reg.matches(test));
+        assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f",
+                                                       Regexp.REPLACE_FIRST));
+    }
+
+    public void testReplaceAllSubstitution() {
+        Regexp reg = (Regexp) getReg();
+        reg.setPattern(pattern);
+        assertTrue(reg.matches(test));
+        assertEquals("abedcfg-abedcfg", reg.substitute(test, "ab\\2d\\1f",
+                                                       Regexp.REPLACE_ALL));
+    }
+}

http://git-wip-us.apache.org/repos/asf/ant/blob/1ae68097/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java 
b/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java
index caa43e4..0f32955 100644
--- a/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java
+++ b/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java
@@ -1,171 +1,171 @@
-/*
- * 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.tools.bzip2;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-public class BlockSortTest {
-
-    private static final byte[] FIXTURE = { 0, 1, (byte) 252, (byte) 253, 
(byte) 255,
-                                            (byte) 254, 3, 2, (byte) 128 };
-
-    /*
-      Burrows-Wheeler transform of fixture the manual way:
-
-      * build the matrix
-
-      0, 1, 252, 253, 255, 254, 3, 2, 128
-      1, 252, 253, 255, 254, 3, 2, 128, 0
-      252, 253, 255, 254, 3, 2, 128, 0, 1
-      253, 255, 254, 3, 2, 128, 0, 1, 252
-      255, 254, 3, 2, 128, 0, 1, 252, 253
-      254, 3, 2, 128, 0, 1, 252, 253, 255
-      3, 2, 128, 0, 1, 252, 253, 255, 254
-      2, 128, 0, 1, 252, 253, 255, 254, 3
-      128, 0, 1, 252, 253, 255, 254, 3, 2
-
-      * sort it
-
-      0, 1, 252, 253, 255, 254, 3, 2, 128
-      1, 252, 253, 255, 254, 3, 2, 128, 0
-      2, 128, 0, 1, 252, 253, 255, 254, 3
-      3, 2, 128, 0, 1, 252, 253, 255, 254
-      128, 0, 1, 252, 253, 255, 254, 3, 2
-      252, 253, 255, 254, 3, 2, 128, 0, 1
-      253, 255, 254, 3, 2, 128, 0, 1, 252
-      254, 3, 2, 128, 0, 1, 252, 253, 255
-      255, 254, 3, 2, 128, 0, 1, 252, 253
-
-      * grab last column
-
-      128, 0, 3, 254, 2, 1, 252, 255, 253
-
-        and the original line has been 0
-    */
-
-    private static final byte[] FIXTURE_BWT = { (byte) 128, 0, 3, (byte) 254, 
2, 1, 
-                                                (byte) 252, (byte) 255, (byte) 
253 };
-
-    private static final int[] FIXTURE_SORTED = {
-        0, 1, 7, 6, 8, 2, 3, 5, 4
-    };
-
-    private static final byte[] FIXTURE2 = { 
-        'C', 'o', 'm', 'm', 'o', 'n', 's', ' ', 'C', 'o', 'm', 'p', 'r', 'e', 
's', 's', 
-    };
-
-    private static final byte[] FIXTURE2_BWT = {
-        's', 's', ' ', 'r', 'o', 'm', 'o', 'o', 'C', 'C', 'm', 'm', 'p', 'n', 
's', 'e', 
-    };
-
-    @Test
-    public void testSortFixture() {
-        DS ds = setUpFixture();
-        ds.s.blockSort(ds.data, FIXTURE.length - 1);
-        assertFixtureSorted(ds.data);
-        assertEquals(0, ds.data.origPtr);
-    }
-
-    @Test
-    public void testSortFixtureMainSort() {
-        DS ds = setUpFixture();
-        ds.s.mainSort(ds.data, FIXTURE.length - 1);
-        assertFixtureSorted(ds.data);
-    }
-
-    @Test
-    public void testSortFixtureFallbackSort() {
-        DS ds = setUpFixture();
-        ds.s.fallbackSort(ds.data, FIXTURE.length - 1);
-        assertFixtureSorted(ds.data);
-    }
-
-    @Test
-    public void testSortFixture2() {
-        DS ds = setUpFixture2();
-        ds.s.blockSort(ds.data, FIXTURE2.length - 1);
-        assertFixture2Sorted(ds.data);
-        assertEquals(1, ds.data.origPtr);
-    }
-
-    @Test
-    public void testSortFixture2MainSort() {
-        DS ds = setUpFixture2();
-        ds.s.mainSort(ds.data, FIXTURE2.length - 1);
-        assertFixture2Sorted(ds.data);
-    }
-
-    @Test
-    public void testSortFixture2FallbackSort() {
-        DS ds = setUpFixture2();
-        ds.s.fallbackSort(ds.data, FIXTURE2.length - 1);
-        assertFixture2Sorted(ds.data);
-    }
-
-    @Test
-    public void testFallbackSort() {
-        CBZip2OutputStream.Data data = new CBZip2OutputStream.Data(1);
-        BlockSort s = new BlockSort(data);
-        int[] fmap = new int[FIXTURE.length];
-        s.fallbackSort(fmap, FIXTURE, FIXTURE.length);
-        assertArrayEquals(FIXTURE_SORTED, fmap);
-    }
-
-    private DS setUpFixture() {
-        return setUpFixture(FIXTURE);
-    }
-
-    private void assertFixtureSorted(CBZip2OutputStream.Data data) {
-        assertFixtureSorted(data, FIXTURE, FIXTURE_BWT);
-    }
-
-    private DS setUpFixture2() {
-        return setUpFixture(FIXTURE2);
-    }
-
-    private void assertFixture2Sorted(CBZip2OutputStream.Data data) {
-        assertFixtureSorted(data, FIXTURE2, FIXTURE2_BWT);
-    }
-
-    private DS setUpFixture(byte[] fixture) {
-        CBZip2OutputStream.Data data = new CBZip2OutputStream.Data(1);
-        System.arraycopy(fixture, 0, data.block, 1, fixture.length);
-        return new DS(data, new BlockSort(data));
-    }
-
-    private void assertFixtureSorted(CBZip2OutputStream.Data data,
-                                     byte[] fixture, byte[] fixtureBwt) {
-        assertEquals(fixture[fixture.length - 1], data.block[0]);
-        for (int i = 0; i < fixture.length; i++) {
-            assertEquals(fixtureBwt[i], data.block[data.fmap[i]]);
-        }
-    }
-
-    private static class DS {
-        private final CBZip2OutputStream.Data data;
-        private final BlockSort s;
-        DS(CBZip2OutputStream.Data data, BlockSort s) {
-            this.data = data;
-            this.s = s;
-        }
-    }
+/*
+ * 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.tools.bzip2;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+public class BlockSortTest {
+
+    private static final byte[] FIXTURE = { 0, 1, (byte) 252, (byte) 253, 
(byte) 255,
+                                            (byte) 254, 3, 2, (byte) 128 };
+
+    /*
+      Burrows-Wheeler transform of fixture the manual way:
+
+      * build the matrix
+
+      0, 1, 252, 253, 255, 254, 3, 2, 128
+      1, 252, 253, 255, 254, 3, 2, 128, 0
+      252, 253, 255, 254, 3, 2, 128, 0, 1
+      253, 255, 254, 3, 2, 128, 0, 1, 252
+      255, 254, 3, 2, 128, 0, 1, 252, 253
+      254, 3, 2, 128, 0, 1, 252, 253, 255
+      3, 2, 128, 0, 1, 252, 253, 255, 254
+      2, 128, 0, 1, 252, 253, 255, 254, 3
+      128, 0, 1, 252, 253, 255, 254, 3, 2
+
+      * sort it
+
+      0, 1, 252, 253, 255, 254, 3, 2, 128
+      1, 252, 253, 255, 254, 3, 2, 128, 0
+      2, 128, 0, 1, 252, 253, 255, 254, 3
+      3, 2, 128, 0, 1, 252, 253, 255, 254
+      128, 0, 1, 252, 253, 255, 254, 3, 2
+      252, 253, 255, 254, 3, 2, 128, 0, 1
+      253, 255, 254, 3, 2, 128, 0, 1, 252
+      254, 3, 2, 128, 0, 1, 252, 253, 255
+      255, 254, 3, 2, 128, 0, 1, 252, 253
+
+      * grab last column
+
+      128, 0, 3, 254, 2, 1, 252, 255, 253
+
+        and the original line has been 0
+    */
+
+    private static final byte[] FIXTURE_BWT = { (byte) 128, 0, 3, (byte) 254, 
2, 1, 
+                                                (byte) 252, (byte) 255, (byte) 
253 };
+
+    private static final int[] FIXTURE_SORTED = {
+        0, 1, 7, 6, 8, 2, 3, 5, 4
+    };
+
+    private static final byte[] FIXTURE2 = { 
+        'C', 'o', 'm', 'm', 'o', 'n', 's', ' ', 'C', 'o', 'm', 'p', 'r', 'e', 
's', 's', 
+    };
+
+    private static final byte[] FIXTURE2_BWT = {
+        's', 's', ' ', 'r', 'o', 'm', 'o', 'o', 'C', 'C', 'm', 'm', 'p', 'n', 
's', 'e', 
+    };
+
+    @Test
+    public void testSortFixture() {
+        DS ds = setUpFixture();
+        ds.s.blockSort(ds.data, FIXTURE.length - 1);
+        assertFixtureSorted(ds.data);
+        assertEquals(0, ds.data.origPtr);
+    }
+
+    @Test
+    public void testSortFixtureMainSort() {
+        DS ds = setUpFixture();
+        ds.s.mainSort(ds.data, FIXTURE.length - 1);
+        assertFixtureSorted(ds.data);
+    }
+
+    @Test
+    public void testSortFixtureFallbackSort() {
+        DS ds = setUpFixture();
+        ds.s.fallbackSort(ds.data, FIXTURE.length - 1);
+        assertFixtureSorted(ds.data);
+    }
+
+    @Test
+    public void testSortFixture2() {
+        DS ds = setUpFixture2();
+        ds.s.blockSort(ds.data, FIXTURE2.length - 1);
+        assertFixture2Sorted(ds.data);
+        assertEquals(1, ds.data.origPtr);
+    }
+
+    @Test
+    public void testSortFixture2MainSort() {
+        DS ds = setUpFixture2();
+        ds.s.mainSort(ds.data, FIXTURE2.length - 1);
+        assertFixture2Sorted(ds.data);
+    }
+
+    @Test
+    public void testSortFixture2FallbackSort() {
+        DS ds = setUpFixture2();
+        ds.s.fallbackSort(ds.data, FIXTURE2.length - 1);
+        assertFixture2Sorted(ds.data);
+    }
+
+    @Test
+    public void testFallbackSort() {
+        CBZip2OutputStream.Data data = new CBZip2OutputStream.Data(1);
+        BlockSort s = new BlockSort(data);
+        int[] fmap = new int[FIXTURE.length];
+        s.fallbackSort(fmap, FIXTURE, FIXTURE.length);
+        assertArrayEquals(FIXTURE_SORTED, fmap);
+    }
+
+    private DS setUpFixture() {
+        return setUpFixture(FIXTURE);
+    }
+
+    private void assertFixtureSorted(CBZip2OutputStream.Data data) {
+        assertFixtureSorted(data, FIXTURE, FIXTURE_BWT);
+    }
+
+    private DS setUpFixture2() {
+        return setUpFixture(FIXTURE2);
+    }
+
+    private void assertFixture2Sorted(CBZip2OutputStream.Data data) {
+        assertFixtureSorted(data, FIXTURE2, FIXTURE2_BWT);
+    }
+
+    private DS setUpFixture(byte[] fixture) {
+        CBZip2OutputStream.Data data = new CBZip2OutputStream.Data(1);
+        System.arraycopy(fixture, 0, data.block, 1, fixture.length);
+        return new DS(data, new BlockSort(data));
+    }
+
+    private void assertFixtureSorted(CBZip2OutputStream.Data data,
+                                     byte[] fixture, byte[] fixtureBwt) {
+        assertEquals(fixture[fixture.length - 1], data.block[0]);
+        for (int i = 0; i < fixture.length; i++) {
+            assertEquals(fixtureBwt[i], data.block[data.fmap[i]]);
+        }
+    }
+
+    private static class DS {
+        private final CBZip2OutputStream.Data data;
+        private final BlockSort s;
+        DS(CBZip2OutputStream.Data data, BlockSort s) {
+            this.data = data;
+            this.s = s;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ant/blob/1ae68097/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java 
b/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java
index 50e0e57..cc3bc46 100644
--- a/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java
+++ b/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java
@@ -1,47 +1,47 @@
-/*
- *  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.tools.bzip2;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-import org.junit.Test;
-
-import static org.junit.Assert.fail;
-
-public class CBZip2StreamTest {
-
-    @Test
-    public void testNullPointer() throws IOException {
-        try {
-            new CBZip2InputStream(new ByteArrayInputStream(new byte[0]));
-            fail("expected an exception");
-        } catch (IOException e) {
-            // expected
-            //TODO assert exception values
-        }
-    }
-
-    @Test
-    public void testDivisionByZero() throws IOException {
-        CBZip2OutputStream cb = new CBZip2OutputStream(new 
ByteArrayOutputStream());
-        cb.close();
-        // expected no exception
-    }
-}
+/*
+ *  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.tools.bzip2;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class CBZip2StreamTest {
+
+    @Test
+    public void testNullPointer() throws IOException {
+        try {
+            new CBZip2InputStream(new ByteArrayInputStream(new byte[0]));
+            fail("expected an exception");
+        } catch (IOException e) {
+            // expected
+            //TODO assert exception values
+        }
+    }
+
+    @Test
+    public void testDivisionByZero() throws IOException {
+        CBZip2OutputStream cb = new CBZip2OutputStream(new 
ByteArrayOutputStream());
+        cb.close();
+        // expected no exception
+    }
+}

http://git-wip-us.apache.org/repos/asf/ant/blob/1ae68097/src/tests/junit/org/apache/tools/mail/MailMessageTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/mail/MailMessageTest.java 
b/src/tests/junit/org/apache/tools/mail/MailMessageTest.java
index 87e2f75..0bad323 100644
--- a/src/tests/junit/org/apache/tools/mail/MailMessageTest.java
+++ b/src/tests/junit/org/apache/tools/mail/MailMessageTest.java
@@ -1,707 +1,707 @@
-/*
- *  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.tools.mail;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.PrintStream;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import org.apache.tools.ant.BuildException;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.internal.AssumptionViolatedException;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * JUnit testcases for org.apache.tools.mail.MailMessage.
- *
- * @since Ant 1.6
- */
-public class MailMessageTest {
-
-    // 27224 = magic (a random port which is unlikely to be in use)
-    private static int TEST_PORT = 27224;
-
-    private String local = null;
-
-    @Before
-    public void setUp() {
-        try {
-            local = InetAddress.getLocalHost().getHostName();
-        } catch (java.net.UnknownHostException uhe) {
-            // ignore
-        }
-    }
-
-    /**
-     *  Test an example that is similar to the one given in the API
-     *  If this testcase takes >90s to complete, it is very likely that
-     *  the two threads are blocked waiting for each other and Thread.join()
-     *  timed out.
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testAPIExample() throws InterruptedException {
-
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.to("[email protected]");
-        testMailClient.cc("[email protected]");
-        testMailClient.cc("[email protected]");
-        testMailClient.bcc("[email protected]");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage( "test line 1\n" +
-            "test line 2" );
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-        "From: Mail Message <[email protected]>\r\n" +
-        "To: [email protected]\r\n" +
-        "Cc: [email protected], [email protected]\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "test line 1\r\n" +
-        "test line 2\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        /*for (int icounter = 0; icounter<expectedResult.length(); icounter++) 
{
-            if (icounter < result.length()) {
-                if (expectedResult.charAt(icounter) != 
result.charAt(icounter)) {
-                    System.out.println("posit " + icounter + " expected "
-                        + expectedResult.charAt(icounter)
-                    + " result " + result.charAt(icounter));
-                }
-            }
-        }
-        if (expectedResult.length()>result.length()) {
-            System.out.println("excedent of expected result "
-                + expectedResult.substring(result.length()));
-        }
-        if (expectedResult.length()<result.length()) {
-            System.out.println("excedent of result "
-                + result.substring(expectedResult.length()));
-        }*/
-        assertEquals(expectedResult.length(), result.length());
-        assertEquals(expectedResult, result); // order of headers cannot be 
guaranteed
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-    /**
-     *  Test a MailMessage with no cc or bcc lines
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testToOnly() throws InterruptedException {
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.to("[email protected]");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage( "test line 1\n" +
-            "test line 2" );
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-            "From: Mail Message <[email protected]>\r\n" +
-            "To: [email protected]\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "test line 1\r\n" +
-        "test line 2\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        assertEquals(expectedResult.length(), result.length());
-        assertEquals(expectedResult, result); // order of headers cannot be 
guaranteed
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-    /**
-     *  Test a MailMessage with no to or bcc lines
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testCcOnly() throws InterruptedException {
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.cc("[email protected]");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage( "test line 1\n" +
-            "test line 2" );
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-            "From: Mail Message <[email protected]>\r\n" +
-            "Cc: [email protected]\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "test line 1\r\n" +
-        "test line 2\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        assertEquals(expectedResult.length(), result.length());
-        assertEquals(expectedResult, result);
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-    /**
-     *  Test a MailMessage with no to or cc lines
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testBccOnly() throws InterruptedException {
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.bcc("[email protected]");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage( "test line 1\n" +
-            "test line 2" );
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-        "From: Mail Message <[email protected]>\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "test line 1\r\n" +
-        "test line 2\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        assertEquals( expectedResult.length(), result.length() );
-        assertEquals( expectedResult, result );
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-    /**
-     *  Test a MailMessage with no subject line
-     *  Subject is an optional field (RFC 822 s4.1)
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testNoSubject() throws InterruptedException {
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.to("[email protected]");
-        testMailClient.setMessage( "test line 1\n" +
-            "test line 2" );
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "From: Mail Message <[email protected]>\r\n" +
-            "To: [email protected]\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "test line 1\r\n" +
-        "test line 2\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        assertEquals( expectedResult.length(), result.length() );
-        assertEquals( expectedResult, result );
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-    /**
-     *  Test a MailMessage with empty body message
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testEmptyBody() throws InterruptedException {
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.to("[email protected]");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage("");
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-            "From: Mail Message <[email protected]>\r\n" +
-            "To: [email protected]\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        assertEquals(expectedResult.length(), result.length());
-        assertEquals(expectedResult, result);
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-    /**
-     *  Test a MailMessage with US-ASCII character set
-     *  The next four testcase can be kinda hard to debug as Ant will often
-     *  print the junit failure in US-ASCII.
-     * @throws InterruptedException 
-     */
-    @Test
-    public void testAsciiCharset() throws InterruptedException {
-
-        ServerThread testMailServer = new ServerThread();
-        Thread server = new Thread(testMailServer);
-        server.start();
-
-        ClientThread testMailClient = new ClientThread();
-
-        testMailClient.from("Mail Message <[email protected]>");
-        testMailClient.to("Ceki G\u00fclc\u00fc <[email protected]>");
-        testMailClient.setSubject("Test subject");
-        testMailClient.setMessage("");
-
-        Thread client = new Thread(testMailClient);
-        client.start();
-
-        server.join(60 * 1000); // 60s
-        client.join(30 * 1000); // a further 30s
-
-        String result = testMailServer.getResult();
-        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
-        "HELO " + local + "\r\n" +
-        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
-        "MAIL FROM: <[email protected]>\r\n" +
-        "250\r\n" +
-        "RCPT TO: <[email protected]>\r\n" +
-        "250\r\n" +
-        "DATA\r\n" +
-        "354\r\n" +
-        "Subject: Test subject\r\n" +
-            "From: Mail Message <[email protected]>\r\n" +
-            "To: Ceki G\u00fclc\u00fc <[email protected]>\r\n" +
-        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
-        "\r\n" +
-        "\r\n" +
-        "\r\n" +
-        ".\r\n" +
-        "250\r\n" +
-        "QUIT\r\n" +
-        "221\r\n";
-        ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
-        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
-        PrintStream bos1 = new PrintStream(baos1, true);
-        PrintStream bos2 = new PrintStream(baos2, true);
-
-        bos1.print(expectedResult);
-        bos2.print(result);
-
-        assertEquals( "expected message length != actual message length "
-            + "in testAsciiCharset()", expectedResult.length(), 
result.length() );
-        assertEquals( "baos1 and baos2 should be the same in 
testAsciiCharset()",
-            baos1.toString(), baos2.toString() ); // order of headers cannot 
be guaranteed
-        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
-    }
-
-
-
-
-    /**
-     * A private test class that pretends to be a mail transfer agent
-     */
-    private class ServerThread implements Runnable {
-
-        private StringBuffer sb = null;
-        private boolean loop = false;
-        ServerSocket ssock = null;
-        Socket sock = null;
-        BufferedWriter out = null;
-        BufferedReader in = null;
-        private boolean data = false;  // state engine: false=envelope, 
true=message
-
-        public void run() {
-
-            try {
-                ssock = new ServerSocket(TEST_PORT);
-                sock = ssock.accept(); // wait for connection
-                in = new BufferedReader( new InputStreamReader(
-                    sock.getInputStream()) );
-                out = new BufferedWriter( new OutputStreamWriter(
-                    sock.getOutputStream() ) );
-                sb = new StringBuffer();
-                send( "220 test SMTP EmailTaskTest\r\n" );
-                loop = true;
-                while ( loop ) {
-                    String response = in.readLine();
-                    if ( response == null ) {
-                        loop = false;
-                        break;
-                    }
-                    sb.append( response + "\r\n" );
-
-                    if ( !data && response.startsWith( "HELO" ) ) {
-                        send( "250 " + local + " Hello " + local + " " +
-                        "[127.0.0.1], pleased to meet you\r\n" );
-                    } else if ( !data && response.startsWith("MAIL") ) {
-                        send( "250\r\n" );
-                    } else if ( !data && response.startsWith("RCPT")) {
-                        send( "250\r\n" );
-                    } else if (!data && response.startsWith("DATA")) {
-                        send( "354\r\n" );
-                        data = true;
-                    } else if (data && response.equals(".") ) {
-                        send( "250\r\n" );
-                        data = false;
-                    } else if (!data && response.startsWith("QUIT")) {
-                        send( "221\r\n" );
-                        loop = false;
-                    } else if (!data) {
-                        //throw new IllegalStateException("Command 
unrecognized: "
-                        //    + response);
-                        send( "500 5.5.1 Command unrecognized: \"" +
-                            response + "\"\r\n" );
-                        loop = false;
-                    } else {
-                        // sb.append( response + "\r\n" );
-                    }
-
-                } // while
-            } catch (IOException ioe) {
-                throw new BuildException(ioe);
-            } finally {
-                disconnect();
-            }
-        }
-
-        private void send(String retmsg) throws IOException {
-            out.write( retmsg );
-            out.flush();
-            sb.append( retmsg );
-        }
-
-        private void disconnect() {
-            if (out != null) {
-                try {
-                    out.flush();
-                    out.close();
-                    out = null;
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            if (in != null) {
-                try {
-                    in.close();
-                    in = null;
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            if (sock != null) {
-                try {
-                    sock.close();
-                    sock = null;
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            if (ssock != null) {
-                try {
-                    ssock.close();
-                    ssock = null;
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-        }
-
-        public synchronized String getResult() {
-            loop = false;
-            return sb.toString();
-        }
-
-    }
-
-    /**
-     *  A private test class that wraps MailMessage
-     */
-    private class ClientThread implements Runnable {
-
-        private MailMessage msg;
-        private boolean fail = false;
-        private String failMessage = null;
-
-        protected String from = null;
-        protected String subject = null;
-        protected String message = null;
-
-        protected Vector replyToList = new Vector();
-        protected Vector toList = new Vector();
-        protected Vector ccList = new Vector();
-        protected Vector bccList = new Vector();
-
-
-        public void run() {
-            for (int i = 9; i > 0; i--) {
-                try {
-                    msg = new MailMessage("localhost", TEST_PORT);
-                } catch (java.net.ConnectException ce) {
-                    try {
-                        Thread.sleep(10 * 1000);
-                    } catch (InterruptedException ie) {
-                        throw new AssumptionViolatedException("Thread 
interrupted", ie);
-                    }
-                } catch (IOException ioe) {
-                    fail = true;
-                    failMessage = "IOException: " + ioe;
-                    return;
-                }
-                if (msg != null) {
-                    break;
-                }
-            }
-
-            if (msg == null) {
-                fail = true;
-                failMessage = "java.net.ConnectException: Connection refused";
-                return;
-            }
-
-            try {
-                msg.from(from);
-
-                Enumeration e;
-
-                e = replyToList.elements();
-                while (e.hasMoreElements()) {
-                    msg.replyto(e.nextElement().toString());
-                }
-
-                e = toList.elements();
-                while (e.hasMoreElements()) {
-                    msg.to(e.nextElement().toString());
-                }
-
-                e = ccList.elements();
-                while (e.hasMoreElements()) {
-                    msg.cc(e.nextElement().toString());
-                }
-
-                e = bccList.elements();
-                while (e.hasMoreElements()) {
-                    msg.bcc(e.nextElement().toString());
-                }
-
-                if (subject != null) {
-                    msg.setSubject(subject);
-                }
-
-                if (message != null ) {
-                    PrintStream out = msg.getPrintStream();
-                    out.println( message );
-                }
-
-                msg.sendAndClose();
-            } catch (IOException ioe) {
-                fail = true;
-                failMessage = "IOException: " + ioe;
-                return;
-            }
-        }
-
-        public boolean isFailed() {
-            return fail;
-        }
-
-        public String getFailMessage() {
-            return failMessage;
-        }
-
-        public void replyTo(String replyTo) {
-            replyToList.add(replyTo);
-        }
-
-        public void to(String to) {
-            toList.add(to);
-        }
-
-        public void cc(String cc) {
-            ccList.add(cc);
-        }
-
-        public void bcc(String bcc) {
-            bccList.add(bcc);
-        }
-
-        public void setSubject(String subject) {
-            this.subject = subject;
-        }
-
-        public void from(String from) {
-            this.from = from;
-        }
-
-        public void setMessage(String message) {
-            this.message = message;
-        }
-
-    }
-
-}
+/*
+ *  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.tools.mail;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.internal.AssumptionViolatedException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * JUnit testcases for org.apache.tools.mail.MailMessage.
+ *
+ * @since Ant 1.6
+ */
+public class MailMessageTest {
+
+    // 27224 = magic (a random port which is unlikely to be in use)
+    private static int TEST_PORT = 27224;
+
+    private String local = null;
+
+    @Before
+    public void setUp() {
+        try {
+            local = InetAddress.getLocalHost().getHostName();
+        } catch (java.net.UnknownHostException uhe) {
+            // ignore
+        }
+    }
+
+    /**
+     *  Test an example that is similar to the one given in the API
+     *  If this testcase takes >90s to complete, it is very likely that
+     *  the two threads are blocked waiting for each other and Thread.join()
+     *  timed out.
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testAPIExample() throws InterruptedException {
+
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.to("[email protected]");
+        testMailClient.cc("[email protected]");
+        testMailClient.cc("[email protected]");
+        testMailClient.bcc("[email protected]");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage( "test line 1\n" +
+            "test line 2" );
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+        "From: Mail Message <[email protected]>\r\n" +
+        "To: [email protected]\r\n" +
+        "Cc: [email protected], [email protected]\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "test line 1\r\n" +
+        "test line 2\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        /*for (int icounter = 0; icounter<expectedResult.length(); icounter++) 
{
+            if (icounter < result.length()) {
+                if (expectedResult.charAt(icounter) != 
result.charAt(icounter)) {
+                    System.out.println("posit " + icounter + " expected "
+                        + expectedResult.charAt(icounter)
+                    + " result " + result.charAt(icounter));
+                }
+            }
+        }
+        if (expectedResult.length()>result.length()) {
+            System.out.println("excedent of expected result "
+                + expectedResult.substring(result.length()));
+        }
+        if (expectedResult.length()<result.length()) {
+            System.out.println("excedent of result "
+                + result.substring(expectedResult.length()));
+        }*/
+        assertEquals(expectedResult.length(), result.length());
+        assertEquals(expectedResult, result); // order of headers cannot be 
guaranteed
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+    /**
+     *  Test a MailMessage with no cc or bcc lines
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testToOnly() throws InterruptedException {
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.to("[email protected]");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage( "test line 1\n" +
+            "test line 2" );
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+            "From: Mail Message <[email protected]>\r\n" +
+            "To: [email protected]\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "test line 1\r\n" +
+        "test line 2\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        assertEquals(expectedResult.length(), result.length());
+        assertEquals(expectedResult, result); // order of headers cannot be 
guaranteed
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+    /**
+     *  Test a MailMessage with no to or bcc lines
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testCcOnly() throws InterruptedException {
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.cc("[email protected]");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage( "test line 1\n" +
+            "test line 2" );
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+            "From: Mail Message <[email protected]>\r\n" +
+            "Cc: [email protected]\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "test line 1\r\n" +
+        "test line 2\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        assertEquals(expectedResult.length(), result.length());
+        assertEquals(expectedResult, result);
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+    /**
+     *  Test a MailMessage with no to or cc lines
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testBccOnly() throws InterruptedException {
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.bcc("[email protected]");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage( "test line 1\n" +
+            "test line 2" );
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+        "From: Mail Message <[email protected]>\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "test line 1\r\n" +
+        "test line 2\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        assertEquals( expectedResult.length(), result.length() );
+        assertEquals( expectedResult, result );
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+    /**
+     *  Test a MailMessage with no subject line
+     *  Subject is an optional field (RFC 822 s4.1)
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testNoSubject() throws InterruptedException {
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.to("[email protected]");
+        testMailClient.setMessage( "test line 1\n" +
+            "test line 2" );
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "From: Mail Message <[email protected]>\r\n" +
+            "To: [email protected]\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "test line 1\r\n" +
+        "test line 2\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        assertEquals( expectedResult.length(), result.length() );
+        assertEquals( expectedResult, result );
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+    /**
+     *  Test a MailMessage with empty body message
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testEmptyBody() throws InterruptedException {
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.to("[email protected]");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage("");
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+            "From: Mail Message <[email protected]>\r\n" +
+            "To: [email protected]\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        assertEquals(expectedResult.length(), result.length());
+        assertEquals(expectedResult, result);
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+    /**
+     *  Test a MailMessage with US-ASCII character set
+     *  The next four testcase can be kinda hard to debug as Ant will often
+     *  print the junit failure in US-ASCII.
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testAsciiCharset() throws InterruptedException {
+
+        ServerThread testMailServer = new ServerThread();
+        Thread server = new Thread(testMailServer);
+        server.start();
+
+        ClientThread testMailClient = new ClientThread();
+
+        testMailClient.from("Mail Message <[email protected]>");
+        testMailClient.to("Ceki G\u00fclc\u00fc <[email protected]>");
+        testMailClient.setSubject("Test subject");
+        testMailClient.setMessage("");
+
+        Thread client = new Thread(testMailClient);
+        client.start();
+
+        server.join(60 * 1000); // 60s
+        client.join(30 * 1000); // a further 30s
+
+        String result = testMailServer.getResult();
+        String expectedResult = "220 test SMTP EmailTaskTest\r\n" +
+        "HELO " + local + "\r\n" +
+        "250 " + local + " Hello " + local + " [127.0.0.1], pleased to meet 
you\r\n" +
+        "MAIL FROM: <[email protected]>\r\n" +
+        "250\r\n" +
+        "RCPT TO: <[email protected]>\r\n" +
+        "250\r\n" +
+        "DATA\r\n" +
+        "354\r\n" +
+        "Subject: Test subject\r\n" +
+            "From: Mail Message <[email protected]>\r\n" +
+            "To: Ceki G\u00fclc\u00fc <[email protected]>\r\n" +
+        "X-Mailer: org.apache.tools.mail.MailMessage (ant.apache.org)\r\n" +
+        "\r\n" +
+        "\r\n" +
+        "\r\n" +
+        ".\r\n" +
+        "250\r\n" +
+        "QUIT\r\n" +
+        "221\r\n";
+        ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
+        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
+        PrintStream bos1 = new PrintStream(baos1, true);
+        PrintStream bos2 = new PrintStream(baos2, true);
+
+        bos1.print(expectedResult);
+        bos2.print(result);
+
+        assertEquals( "expected message length != actual message length "
+            + "in testAsciiCharset()", expectedResult.length(), 
result.length() );
+        assertEquals( "baos1 and baos2 should be the same in 
testAsciiCharset()",
+            baos1.toString(), baos2.toString() ); // order of headers cannot 
be guaranteed
+        assertFalse(testMailClient.getFailMessage(), 
testMailClient.isFailed());
+    }
+
+
+
+
+    /**
+     * A private test class that pretends to be a mail transfer agent
+     */
+    private class ServerThread implements Runnable {
+
+        private StringBuffer sb = null;
+        private boolean loop = false;
+        ServerSocket ssock = null;
+        Socket sock = null;
+        BufferedWriter out = null;
+        BufferedReader in = null;
+        private boolean data = false;  // state engine: false=envelope, 
true=message
+
+        public void run() {
+
+            try {
+                ssock = new ServerSocket(TEST_PORT);
+                sock = ssock.accept(); // wait for connection
+                in = new BufferedReader( new InputStreamReader(
+                    sock.getInputStream()) );
+                out = new BufferedWriter( new OutputStreamWriter(
+                    sock.getOutputStream() ) );
+                sb = new StringBuffer();
+                send( "220 test SMTP EmailTaskTest\r\n" );
+                loop = true;
+                while ( loop ) {
+                    String response = in.readLine();
+                    if ( response == null ) {
+                        loop = false;
+                        break;
+                    }
+                    sb.append( response + "\r\n" );
+
+                    if ( !data && response.startsWith( "HELO" ) ) {
+                        send( "250 " + local + " Hello " + local + " " +
+                        "[127.0.0.1], pleased to meet you\r\n" );
+                    } else if ( !data && response.startsWith("MAIL") ) {
+                        send( "250\r\n" );
+                    } else if ( !data && response.startsWith("RCPT")) {
+                        send( "250\r\n" );
+                    } else if (!data && response.startsWith("DATA")) {
+                        send( "354\r\n" );
+                        data = true;
+                    } else if (data && response.equals(".") ) {
+                        send( "250\r\n" );
+                        data = false;
+                    } else if (!data && response.startsWith("QUIT")) {
+                        send( "221\r\n" );
+                        loop = false;
+                    } else if (!data) {
+                        //throw new IllegalStateException("Command 
unrecognized: "
+                        //    + response);
+                        send( "500 5.5.1 Command unrecognized: \"" +
+                            response + "\"\r\n" );
+                        loop = false;
+                    } else {
+                        // sb.append( response + "\r\n" );
+                    }
+
+                } // while
+            } catch (IOException ioe) {
+                throw new BuildException(ioe);
+            } finally {
+                disconnect();
+            }
+        }
+
+        private void send(String retmsg) throws IOException {
+            out.write( retmsg );
+            out.flush();
+            sb.append( retmsg );
+        }
+
+        private void disconnect() {
+            if (out != null) {
+                try {
+                    out.flush();
+                    out.close();
+                    out = null;
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (in != null) {
+                try {
+                    in.close();
+                    in = null;
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (sock != null) {
+                try {
+                    sock.close();
+                    sock = null;
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+            if (ssock != null) {
+                try {
+                    ssock.close();
+                    ssock = null;
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+
+        public synchronized String getResult() {
+            loop = false;
+            return sb.toString();
+        }
+
+    }
+
+    /**
+     *  A private test class that wraps MailMessage
+     */
+    private class ClientThread implements Runnable {
+
+        private MailMessage msg;
+        private boolean fail = false;
+        private String failMessage = null;
+
+        protected String from = null;
+        protected String subject = null;
+        protected String message = null;
+
+        protected Vector replyToList = new Vector();
+        protected Vector toList = new Vector();
+        protected Vector ccList = new Vector();
+        protected Vector bccList = new Vector();
+
+
+        public void run() {
+            for (int i = 9; i > 0; i--) {
+                try {
+                    msg = new MailMessage("localhost", TEST_PORT);
+                } catch (java.net.ConnectException ce) {
+                    try {
+                        Thread.sleep(10 * 1000);
+                    } catch (InterruptedException ie) {
+                        throw new AssumptionViolatedException("Thread 
interrupted", ie);
+                    }
+                } catch (IOException ioe) {
+                    fail = true;
+                    failMessage = "IOException: " + ioe;
+                    return;
+                }
+                if (msg != null) {
+                    break;
+                }
+            }
+
+            if (msg == null) {
+                fail = true;
+                failMessage = "java.net.ConnectException: Connection refused";
+                return;
+            }
+
+            try {
+                msg.from(from);
+
+                Enumeration e;
+
+                e = replyToList.elements();
+                while (e.hasMoreElements()) {
+                    msg.replyto(e.nextElement().toString());
+                }
+
+                e = toList.elements();
+                while (e.hasMoreElements()) {
+                    msg.to(e.nextElement().toString());
+                }
+
+                e = ccList.elements();
+                while (e.hasMoreElements()) {
+                    msg.cc(e.nextElement().toString());
+                }
+
+                e = bccList.elements();
+                while (e.hasMoreElements()) {
+                    msg.bcc(e.nextElement().toString());
+                }
+
+                if (subject != null) {
+                    msg.setSubject(subject);
+                }
+
+                if (message != null ) {
+                    PrintStream out = msg.getPrintStream();
+                    out.println( message );
+                }
+
+                msg.sendAndClose();
+            } catch (IOException ioe) {
+                fail = true;
+                failMessage = "IOException: " + ioe;
+                return;
+            }
+        }
+
+        public boolean isFailed() {
+            return fail;
+        }
+
+        public String getFailMessage() {
+            return failMessage;
+        }
+
+        public void replyTo(String replyTo) {
+            replyToList.add(replyTo);
+        }
+
+        public void to(String to) {
+            toList.add(to);
+        }
+
+        public void cc(String cc) {
+            ccList.add(cc);
+        }
+
+        public void bcc(String bcc) {
+            bccList.add(bcc);
+        }
+
+        public void setSubject(String subject) {
+            this.subject = subject;
+        }
+
+        public void from(String from) {
+            this.from = from;
+        }
+
+        public void setMessage(String message) {
+            this.message = message;
+        }
+
+    }
+
+}

Reply via email to