You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2017/12/01 15:49:40 UTC

[17/23] ant git commit: Normalise tabulation and line breaks (cf master)

http://git-wip-us.apache.org/repos/asf/ant/blob/0ed7f4ab/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
index 954a75b..c7fab26 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
@@ -1,879 +1,879 @@
-/*
- *  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.taskdefs.optional.net;
-
-import static org.apache.tools.ant.AntAssert.assertContains;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.Vector;
-
-import org.apache.commons.net.ftp.FTPClient;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.BuildFileRule;
-import org.apache.tools.ant.DefaultLogger;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.condition.Os;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.util.RetryHandler;
-import org.apache.tools.ant.util.Retryable;
-import org.apache.tools.ant.util.regexp.RegexpMatcher;
-import org.apache.tools.ant.util.regexp.RegexpMatcherFactory;
-import org.junit.After;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-//FIXME these tests are more integration than unit tests and report errors badly
-public class FTPTest {
-	
-	@Rule
-	public BuildFileRule buildRule = new BuildFileRule();
-	
-    // keep track of what operating systems are supported here.
-    private boolean supportsSymlinks = Os.isFamily("unix");
-
-    private FTPClient ftp;
-    
-    private boolean loginSuceeded = false;
-    
-    private String loginFailureMessage;
-    
-    private String tmpDir = null;
-    private String remoteTmpDir = null;
-    private String ftpFileSep = null;
-    private myFTP myFTPTask = new myFTP();
-
-
-    @Before
-    public void setUp() {
-        buildRule.configureProject("src/etc/testcases/taskdefs/optional/net/ftp.xml");
-        Project project = buildRule.getProject();
-        project.executeTarget("setup");
-        tmpDir = project.getProperty("tmp.dir");
-        ftp = new FTPClient();
-        ftpFileSep = project.getProperty("ftp.filesep");
-        myFTPTask.setSeparator(ftpFileSep);
-        myFTPTask.setProject(project);
-        remoteTmpDir = myFTPTask.resolveFile(tmpDir);
-        String remoteHost = project.getProperty("ftp.host");
-        int port = Integer.parseInt(project.getProperty("ftp.port"));
-        String remoteUser = project.getProperty("ftp.user");
-        String password = project.getProperty("ftp.password");
-        boolean connectionSucceeded = false;
-        try {
-            ftp.connect(remoteHost, port);
-            connectionSucceeded = true;
-        } catch (Exception ex) {
-            loginFailureMessage = "could not connect to host " + remoteHost + " on port " + port;
-        }
-        if (connectionSucceeded) {
-            try {
-                ftp.login(remoteUser, password);
-                loginSuceeded = true;
-            } catch (IOException ioe) {
-                loginFailureMessage = "could not log on to " + remoteHost + " as user " + remoteUser;
-            }
-        }
-    }
-
-    @After
-    public void tearDown() {
-        try {
-            if (ftp!= null) {
-            	ftp.disconnect();
-            }
-        } catch (IOException ioe) {
-            // do nothing
-        }
-        buildRule.getProject().executeTarget("cleanup");
-    }
-    
-    private boolean changeRemoteDir(String remoteDir) {
-        boolean result = true;
-        try {
-            ftp.cwd(remoteDir);
-        }
-        catch (Exception ex) {
-            System.out.println("could not change directory to " + remoteTmpDir);
-            result = false;
-        }
-        return result;
-    }
-    
-    @Test
-    public void test1() {
-    	Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-    	Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        
-    	FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha"});
-        ds.scan();
-        compareFiles(ds, new String[] {} ,new String[] {"alpha"});
-    }
-
-    @Test
-    public void test2() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/"});
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void test3() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-            new String[] {"alpha", "alpha/beta",
-                          "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testFullPathMatchesCaseSensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/GAMMA.XML"});
-        ds.scan();
-        compareFiles(ds, new String[] {}, new String[] {});
-    }
-
-    @Test
-    public void testFullPathMatchesCaseInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setCaseSensitive(false);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/GAMMA.XML"});
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-            new String[] {});
-    }
-
-    @Test
-    public void test2ButCaseInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"ALPHA/"});
-        ds.setCaseSensitive(false);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-    
-    @Test
-    public void test2bisButCaseInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-	    FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-	    ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-	    ds.setIncludes(new String[] {"alpha/BETA/gamma/"});
-	    ds.setCaseSensitive(false);
-	    ds.scan();
-	    compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-	        new String[] {"alpha/beta/gamma"});
-    }
-    
-    @Test
-    public void testGetWithSelector() {
-    	buildRule.executeTarget("ftp-get-with-selector");
-    	assertContains("selectors are not supported in remote filesets", buildRule.getLog());
-        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
-        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
-        dsDestination.scan();
-        String [] sortedDestinationDirectories = dsDestination.getIncludedDirectories();
-        String [] sortedDestinationFiles = dsDestination.getIncludedFiles();
-        for (int counter = 0; counter < sortedDestinationDirectories.length; counter++) {
-            sortedDestinationDirectories[counter] =
-                sortedDestinationDirectories[counter].replace(File.separatorChar, '/');
-        }
-        for (int counter = 0; counter < sortedDestinationFiles.length; counter++) {
-            sortedDestinationFiles[counter] =
-                sortedDestinationFiles[counter].replace(File.separatorChar, '/');
-        }
-        FileSet fsSource =  (FileSet) buildRule.getProject().getReference("fileset-source-without-selector");
-        DirectoryScanner dsSource = fsSource.getDirectoryScanner(buildRule.getProject());
-        dsSource.scan();
-        compareFiles(dsSource, sortedDestinationFiles, sortedDestinationDirectories);
-    }
-    
-    @Test
-    public void testGetFollowSymlinksTrue() {
-        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("ftp-get-directory-symbolic-link");
-        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
-        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
-        dsDestination.scan();
-        compareFiles(dsDestination, new String[] {"alpha/beta/gamma/gamma.xml"},
-            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-    
-    @Test
-    public void testGetFollowSymlinksFalse() {
-        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("ftp-get-directory-no-symbolic-link");
-        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
-        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
-        dsDestination.scan();
-        compareFiles(dsDestination, new String[] {},
-            new String[] {});
-    }
-    
-    @Test
-    public void testAllowSymlinks() {
-        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("symlink-setup");
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
-        ds.setFollowSymlinks(true);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testProhibitSymlinks() {
-        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("symlink-setup");
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
-        ds.setFollowSymlinks(false);
-        ds.scan();
-        compareFiles(ds, new String[] {}, new String[] {});
-    }
-    
-    @Test
-    public void testFileSymlink() {
-        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("symlink-file-setup");
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
-        ds.setFollowSymlinks(true);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha/beta/gamma"});
-    }
-    
-    // father and child pattern test
-    @Test
-    public void testOrderOfIncludePatternsIrrelevant() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        String [] expectedFiles = {"alpha/beta/beta.xml",
-                                   "alpha/beta/gamma/gamma.xml"};
-        String [] expectedDirectories = {"alpha/beta", "alpha/beta/gamma" };
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/be?a/**", "alpha/beta/gamma/"});
-        ds.scan();
-        compareFiles(ds, expectedFiles, expectedDirectories);
-        // redo the test, but the 2 include patterns are inverted
-        ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/beta/gamma/", "alpha/be?a/**"});
-        ds.scan();
-        compareFiles(ds, expectedFiles, expectedDirectories);
-    }
-
-    @Test
-    public void testPatternsDifferInCaseScanningSensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/", "ALPHA/"});
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testPatternsDifferInCaseScanningInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/", "ALPHA/"});
-        ds.setCaseSensitive(false);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testFullpathDiffersInCaseScanningSensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {
-            "alpha/beta/gamma/gamma.xml",
-            "alpha/beta/gamma/GAMMA.XML"
-        });
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-                     new String[] {});
-    }
-
-    @Test
-    public void testFullpathDiffersInCaseScanningInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {
-            "alpha/beta/gamma/gamma.xml",
-            "alpha/beta/gamma/GAMMA.XML"
-        });
-        ds.setCaseSensitive(false);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-                     new String[] {});
-    }
-
-    @Test
-    public void testParentDiffersInCaseScanningSensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/", "ALPHA/beta/"});
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testParentDiffersInCaseScanningInsensitive() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {"alpha/", "ALPHA/beta/"});
-        ds.setCaseSensitive(false);
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml"},
-                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
-    }
-
-    @Test
-    public void testExcludeOneFile() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {
-            "**/*.xml"
-        });
-        ds.setExcludes(new String[] {
-            "alpha/beta/b*xml"
-        });
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
-                     new String[] {});
-    }
-    
-    @Test
-    public void testExcludeHasPrecedence() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {
-            "alpha/**"
-        });
-        ds.setExcludes(new String[] {
-            "alpha/**"
-        });
-        ds.scan();
-        compareFiles(ds, new String[] {},
-                     new String[] {});
-
-    }
-    
-    @Test
-    public void testAlternateIncludeExclude() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setIncludes(new String[] {
-            "alpha/**",
-            "alpha/beta/gamma/**"
-        });
-        ds.setExcludes(new String[] {
-            "alpha/beta/**"
-        });
-        ds.scan();
-        compareFiles(ds, new String[] {},
-                     new String[] {"alpha"});
-
-    }
-    
-    @Test
-    public void testAlternateExcludeInclude() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setExcludes(new String[] {
-            "alpha/**",
-            "alpha/beta/gamma/**"
-        });
-        ds.setIncludes(new String[] {
-            "alpha/beta/**"
-        });
-        ds.scan();
-        compareFiles(ds, new String[] {},
-                     new String[] {});
-
-    }
-    
-    /**
-     * Test inspired by Bug#1415.
-     */
-    @Test
-    public void testChildrenOfExcludedDirectory() {
-        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        buildRule.getProject().executeTarget("children-of-excluded-dir-setup");
-        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setExcludes(new String[] {"alpha/**"});
-        ds.scan();
-        compareFiles(ds, new String[] {"delta/delta.xml"},
-                    new String[] {"delta"});
-
-        ds = myFTPTask.newScanner(ftp);
-        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
-        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
-        ds.setExcludes(new String[] {"alpha"});
-        ds.scan();
-        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
-                                       "alpha/beta/gamma/gamma.xml",
-                                        "delta/delta.xml"},
-                     new String[] {"alpha/beta", "alpha/beta/gamma", "delta"});
-
-    }
-    
-    /**
-     * This class enables the use of the log messages as a way of testing 
-     * the number of files actually transferred.
-     * It uses the ant regular expression mechanism to get a regex parser
-     * to parse the log output.
-     */
-    private class CountLogListener extends DefaultLogger {
-        private Vector lastMatchGroups = null;
-        private RegexpMatcher matcher = new RegexpMatcherFactory().newRegexpMatcher();
-
-        /**
-         * The only constructor for a CountLogListener
-         * @param pattern a regular expression pattern.  It should have 
-         * one parenthesized group and that group should contain the
-         * number desired.
-         */
-        public CountLogListener(String pattern) {
-            super();
-            this.matcher.setPattern(pattern);
-        }
-        
-        
-        /* 
-         * @param event the build event that is being logged.
-         */
-        public void messageLogged(BuildEvent event) {
-            String message = event.getMessage();
-            if (this.matcher.matches(message)) {
-                lastMatchGroups = this.matcher.getGroups(message);
-            }
-            super.messageLogged(event);
-        }
-        
-        /**
-         * returns the desired number that results from parsing the log
-         * message
-         * @return the number of files indicated in the desired message or -1
-         * if a matching log message was never found.
-         */
-        public int getCount() {
-            if (this.lastMatchGroups == null) {
-                return -1;
-            }
-            return Integer.parseInt((String) this.lastMatchGroups.get(1));
-        }
-    }
-    
-    /**
-     * This class enables the use of the log to count the number
-     * of times a message has been emitted.
-     */
-    private class LogCounter extends DefaultLogger {
-        private Map searchMap = new HashMap();
-        private int matchCount;
-
-        public void addLogMessageToSearch(String message) {
-            searchMap.put(message, new Integer(0));
-        }
-        
-        /* 
-         * @param event the build event that is being logged.
-         */
-        public void messageLogged(BuildEvent event) {
-            String message = event.getMessage();
-            Integer mcnt = (Integer) searchMap.get(message);
-            if (null != mcnt) {
-                searchMap.put(message, new Integer(mcnt.intValue() + 1));
-            }
-            super.messageLogged(event);
-        }
-        
-        /**
-         * @return the number of times that the looked for message was sent 
-         * to the log
-         */
-        public int getMatchCount(String message) {
-            Integer mcnt = (Integer) searchMap.get(message);
-            if (null != mcnt) {
-                return mcnt.intValue();
-            }
-            return 0;
-        }
-    }
-    /**
-     * Tests the combination of the newer parameter and the 
-     * serverTimezoneConfig  parameter in the PUT action.  The default 
-     * configuration is an ftp server on localhost which formats 
-     * timestamps as GMT.
-     */
-    @Test
-    public void testTimezonePut() {
-        CountLogListener log = new CountLogListener("(\\d+) files? sent");
-        buildRule.getProject().executeTarget("timed.test.setup");
-        buildRule.getProject().addBuildListener(log);
-        buildRule.getProject().executeTarget("timed.test.put.older");
-        assertEquals(1, log.getCount());
-    }
-
-    /**
-     * Tests the combination of the newer parameter and the 
-     * serverTimezoneConfig  parameter in the GET action.  The default 
-     * configuration is an ftp server on localhost which formats 
-     * timestamps as GMT.
-     */
-    @Test
-    public void testTimezoneGet() {
-        CountLogListener log = new CountLogListener("(\\d+) files? retrieved");
-        buildRule.getProject().executeTarget("timed.test.setup");
-        buildRule.getProject().addBuildListener(log);
-        buildRule.getProject().executeTarget("timed.test.get.older");
-        assertEquals(3, log.getCount());
-    }
-   
-    
-    /**
-     * Tests that the presence of one of the server config params forces
-     * the system type to Unix if not specified.
-     */
-    @Test
-    public void testConfiguration1() {
-        int[] expectedCounts = {
-                1,1,0,1,0,0,0
-        };
-        performConfigTest("configuration.1", expectedCounts);
-        
-    }
-
-    /**
-     * Tests the systemTypeKey attribute.
-     */
-    @Test
-    public void testConfiguration2() {
-        int[] expectedCounts = {
-                1,0,0,1,1,0,0
-        };
-        performConfigTest("configuration.2", expectedCounts);
-        
-    }
-
-    /**
-     * Tests the systemTypeKey attribute with UNIX specified.
-     */
-    @Test
-    public void testConfiguration3() {
-        int[] expectedCounts = {
-                1,0,1,0,0,1,0
-        };
-        performConfigTest("configuration.3", expectedCounts);
-        
-    }
-    
-    @Test
-    public void testConfigurationLang() {
-        int[] expectedCounts = {
-                1,1,0,0,0,0,1
-        };
-        performConfigTest("configuration.lang.good", expectedCounts);
-        
-        try {
-            performConfigTest("configuration.lang.bad", expectedCounts);
-            fail("BuildException Expected");
-        } catch (Exception bx) {
-            assertTrue(bx instanceof BuildException); 
-        }
-    }
-    /**
-     * Tests the systemTypeKey attribute.
-     */
-    @Test
-    public void testConfigurationNone() {
-        int[] expectedCounts = {
-                0,0,0,0,0,0,0
-        };
-        performConfigTest("configuration.none", expectedCounts);
- 
-    }
-    
-    private void performConfigTest(String target, int[] expectedCounts) {
-        String[] messages = new String[]{
-                "custom configuration",
-                "custom config: system key = default (UNIX)",
-                "custom config: system key = UNIX",
-                "custom config: server time zone ID = " + buildRule.getProject().getProperty("ftp.server.timezone"),
-                "custom config: system key = WINDOWS",
-                "custom config: default date format = yyyy/MM/dd HH:mm",
-                "custom config: server language code = de" 
-
-        };
-        LogCounter counter = new LogCounter();
-        for (int i=0; i < messages.length; i++) {
-            counter.addLogMessageToSearch(messages[i]);
-        }
-            
-        buildRule.getProject().addBuildListener(counter);
-        buildRule.getProject().executeTarget(target);
-        for (int i=0; i < messages.length; i++) {
-            assertEquals("target "+target+":message "+ i, expectedCounts[i], counter.getMatchCount(messages[i]));
-        }
-        
-    }
-
-    
-    /**
-     *  this test is inspired by a user reporting that deletions of directories with the ftp task do not work
-     */
-    @Test
-    public void testFTPDelete() {
-        buildRule.getProject().executeTarget("ftp-delete");
-    }
-    
-    private void compareFiles(DirectoryScanner ds, String[] expectedFiles,
-                              String[] expectedDirectories) {
-        String includedFiles[] = ds.getIncludedFiles();
-        String includedDirectories[] = ds.getIncludedDirectories();
-        assertEquals("file present: ", expectedFiles.length,
-                     includedFiles.length);
-        assertEquals("directories present: ", expectedDirectories.length,
-                     includedDirectories.length);
-
-        for (int counter=0; counter < includedFiles.length; counter++) {
-            includedFiles[counter] = includedFiles[counter].replace(File.separatorChar, '/');
-        }
-        Arrays.sort(includedFiles);
-        for (int counter=0; counter < includedDirectories.length; counter++) {
-            includedDirectories[counter] = includedDirectories[counter]
-                            .replace(File.separatorChar, '/');
-        }
-        Arrays.sort(includedDirectories);
-        for (int counter=0; counter < includedFiles.length; counter++) {
-            assertEquals(expectedFiles[counter], includedFiles[counter]);
-        }
-        for (int counter=0; counter < includedDirectories.length; counter++) {
-            assertEquals(expectedDirectories[counter], includedDirectories[counter]);
-            counter++;
-        }
-    }
-    private static class myFTP extends FTP {
-        public FTP.FTPDirectoryScanner newScanner(FTPClient client) {
-            return new FTP.FTPDirectoryScanner(client);
-        }
-        // provide public visibility
-        public String resolveFile(String file) {
-            return super.resolveFile(file);
-        }
-    }
-
-
-    public abstract static class myRetryableFTP extends FTP {
-        private final int numberOfFailuresToSimulate;
-        private int simulatedFailuresLeft;
-        
-        protected myRetryableFTP(int numberOfFailuresToSimulate) {
-            this.numberOfFailuresToSimulate = numberOfFailuresToSimulate;
-            this.simulatedFailuresLeft = numberOfFailuresToSimulate;
-        }
-
-        protected void getFile(FTPClient ftp, String dir, String filename)
-                throws IOException, BuildException 
-        {
-            if (this.simulatedFailuresLeft > 0) {
-                this.simulatedFailuresLeft--;
-                throw new IOException("Simulated failure for testing");
-            }
-           super.getFile(ftp, dir, filename);
-        }
-        protected void executeRetryable(RetryHandler h, Retryable r,
-                String filename) throws IOException 
-        {
-            this.simulatedFailuresLeft = this.numberOfFailuresToSimulate;    
-            super.executeRetryable(h, r, filename);
-        }
-    }
-    public static class oneFailureFTP extends myRetryableFTP {
-        public oneFailureFTP() {
-            super(1);
-        }
-    }
-    public static class twoFailureFTP extends myRetryableFTP {
-        public twoFailureFTP() {
-            super(2);
-        }
-    }
-    public static class threeFailureFTP extends myRetryableFTP {
-        public threeFailureFTP() {
-            super(3);
-        }
-    }
-    
-    public static class randomFailureFTP extends myRetryableFTP {
-        public randomFailureFTP() {
-            super(new Random().nextInt(Short.MAX_VALUE));
-        }
-    }
-    public void testGetWithSelectorRetryable1() {
-        buildRule.getProject().addTaskDefinition("ftp", oneFailureFTP.class);
-        try {
-            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
-        } catch (BuildException bx) {
-            fail("Two retries expected, failed after one.");
-        }
-    }
-    
-    @Test
-    public void testGetWithSelectorRetryable2() {
-        buildRule.getProject().addTaskDefinition("ftp", twoFailureFTP.class);
-        try {
-            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
-        } catch (BuildException bx) {
-            fail("Two retries expected, failed after two.");
-        }
-    }
-    
-    @Test
-    public void testGetWithSelectorRetryable3() {
-        buildRule.getProject().addTaskDefinition("ftp", threeFailureFTP.class);
-        try {
-            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
-            fail("Two retries expected, continued after two.");
-        } catch (BuildException bx) {
-        }
-    }
-    
-    @Test
-    public void testGetWithSelectorRetryableRandom() {
-        buildRule.getProject().addTaskDefinition("ftp", randomFailureFTP.class);
-        try {
-            buildRule.getProject().setProperty("ftp.retries", "forever");
-            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
-        } catch (BuildException bx) {
-            fail("Retry forever specified, but failed.");
-        }
-    }
-    
-    @Test
-    public void testInitialCommand() {
-        performCommandTest("test-initial-command", new int[] { 1,0 });
-    }
-    
-    @Test
-    public void testSiteAction() {
-        performCommandTest("test-site-action", new int[] { 1,0 });
-    }
-    
-    private void performCommandTest(String target, int[] expectedCounts) {
-        String[] messages = new String[]{
-                "Doing Site Command: umask 222",
-                "Failed to issue Site Command: umask 222",
-
-        };
-        LogCounter counter = new LogCounter();
-        for (int i=0; i < messages.length; i++) {
-            counter.addLogMessageToSearch(messages[i]);
-        }
-            
-        buildRule.getProject().addBuildListener(counter);
-        buildRule.getProject().executeTarget(target);
-        for (int i=0; i < messages.length; i++) {
-            assertEquals("target "+target+":message "+ i, expectedCounts[i], counter.getMatchCount(messages[i]));
-        }
-
-    }
-    
-}
+/*
+ *  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.taskdefs.optional.net;
+
+import static org.apache.tools.ant.AntAssert.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.Vector;
+
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildFileRule;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.condition.Os;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.RetryHandler;
+import org.apache.tools.ant.util.Retryable;
+import org.apache.tools.ant.util.regexp.RegexpMatcher;
+import org.apache.tools.ant.util.regexp.RegexpMatcherFactory;
+import org.junit.After;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+//FIXME these tests are more integration than unit tests and report errors badly
+public class FTPTest {
+
+    @Rule
+    public BuildFileRule buildRule = new BuildFileRule();
+
+    // keep track of what operating systems are supported here.
+    private boolean supportsSymlinks = Os.isFamily("unix");
+
+    private FTPClient ftp;
+
+    private boolean loginSuceeded = false;
+
+    private String loginFailureMessage;
+
+    private String tmpDir = null;
+    private String remoteTmpDir = null;
+    private String ftpFileSep = null;
+    private myFTP myFTPTask = new myFTP();
+
+
+    @Before
+    public void setUp() {
+        buildRule.configureProject("src/etc/testcases/taskdefs/optional/net/ftp.xml");
+        Project project = buildRule.getProject();
+        project.executeTarget("setup");
+        tmpDir = project.getProperty("tmp.dir");
+        ftp = new FTPClient();
+        ftpFileSep = project.getProperty("ftp.filesep");
+        myFTPTask.setSeparator(ftpFileSep);
+        myFTPTask.setProject(project);
+        remoteTmpDir = myFTPTask.resolveFile(tmpDir);
+        String remoteHost = project.getProperty("ftp.host");
+        int port = Integer.parseInt(project.getProperty("ftp.port"));
+        String remoteUser = project.getProperty("ftp.user");
+        String password = project.getProperty("ftp.password");
+        boolean connectionSucceeded = false;
+        try {
+            ftp.connect(remoteHost, port);
+            connectionSucceeded = true;
+        } catch (Exception ex) {
+            loginFailureMessage = "could not connect to host " + remoteHost + " on port " + port;
+        }
+        if (connectionSucceeded) {
+            try {
+                ftp.login(remoteUser, password);
+                loginSuceeded = true;
+            } catch (IOException ioe) {
+                loginFailureMessage = "could not log on to " + remoteHost + " as user " + remoteUser;
+            }
+        }
+    }
+
+    @After
+    public void tearDown() {
+        try {
+            if (ftp!= null) {
+                ftp.disconnect();
+            }
+        } catch (IOException ioe) {
+            // do nothing
+        }
+        buildRule.getProject().executeTarget("cleanup");
+    }
+
+    private boolean changeRemoteDir(String remoteDir) {
+        boolean result = true;
+        try {
+            ftp.cwd(remoteDir);
+        }
+        catch (Exception ex) {
+            System.out.println("could not change directory to " + remoteTmpDir);
+            result = false;
+        }
+        return result;
+    }
+
+    @Test
+    public void test1() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha"});
+        ds.scan();
+        compareFiles(ds, new String[] {} ,new String[] {"alpha"});
+    }
+
+    @Test
+    public void test2() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/"});
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void test3() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+            new String[] {"alpha", "alpha/beta",
+                          "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testFullPathMatchesCaseSensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/GAMMA.XML"});
+        ds.scan();
+        compareFiles(ds, new String[] {}, new String[] {});
+    }
+
+    @Test
+    public void testFullPathMatchesCaseInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setCaseSensitive(false);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/GAMMA.XML"});
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+            new String[] {});
+    }
+
+    @Test
+    public void test2ButCaseInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"ALPHA/"});
+        ds.setCaseSensitive(false);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void test2bisButCaseInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/BETA/gamma/"});
+        ds.setCaseSensitive(false);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+            new String[] {"alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testGetWithSelector() {
+        buildRule.executeTarget("ftp-get-with-selector");
+        assertContains("selectors are not supported in remote filesets", buildRule.getLog());
+        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
+        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
+        dsDestination.scan();
+        String [] sortedDestinationDirectories = dsDestination.getIncludedDirectories();
+        String [] sortedDestinationFiles = dsDestination.getIncludedFiles();
+        for (int counter = 0; counter < sortedDestinationDirectories.length; counter++) {
+            sortedDestinationDirectories[counter] =
+                sortedDestinationDirectories[counter].replace(File.separatorChar, '/');
+        }
+        for (int counter = 0; counter < sortedDestinationFiles.length; counter++) {
+            sortedDestinationFiles[counter] =
+                sortedDestinationFiles[counter].replace(File.separatorChar, '/');
+        }
+        FileSet fsSource =  (FileSet) buildRule.getProject().getReference("fileset-source-without-selector");
+        DirectoryScanner dsSource = fsSource.getDirectoryScanner(buildRule.getProject());
+        dsSource.scan();
+        compareFiles(dsSource, sortedDestinationFiles, sortedDestinationDirectories);
+    }
+
+    @Test
+    public void testGetFollowSymlinksTrue() {
+        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("ftp-get-directory-symbolic-link");
+        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
+        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
+        dsDestination.scan();
+        compareFiles(dsDestination, new String[] {"alpha/beta/gamma/gamma.xml"},
+            new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testGetFollowSymlinksFalse() {
+        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("ftp-get-directory-no-symbolic-link");
+        FileSet fsDestination = (FileSet) buildRule.getProject().getReference("fileset-destination-without-selector");
+        DirectoryScanner dsDestination = fsDestination.getDirectoryScanner(buildRule.getProject());
+        dsDestination.scan();
+        compareFiles(dsDestination, new String[] {},
+            new String[] {});
+    }
+
+    @Test
+    public void testAllowSymlinks() {
+        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("symlink-setup");
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
+        ds.setFollowSymlinks(true);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testProhibitSymlinks() {
+        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("symlink-setup");
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
+        ds.setFollowSymlinks(false);
+        ds.scan();
+        compareFiles(ds, new String[] {}, new String[] {});
+    }
+
+    @Test
+    public void testFileSymlink() {
+        Assume.assumeTrue("System does not support Symlinks", supportsSymlinks);
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("symlink-file-setup");
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/"});
+        ds.setFollowSymlinks(true);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha/beta/gamma"});
+    }
+
+    // father and child pattern test
+    @Test
+    public void testOrderOfIncludePatternsIrrelevant() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        String [] expectedFiles = {"alpha/beta/beta.xml",
+                                   "alpha/beta/gamma/gamma.xml"};
+        String [] expectedDirectories = {"alpha/beta", "alpha/beta/gamma" };
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/be?a/**", "alpha/beta/gamma/"});
+        ds.scan();
+        compareFiles(ds, expectedFiles, expectedDirectories);
+        // redo the test, but the 2 include patterns are inverted
+        ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/beta/gamma/", "alpha/be?a/**"});
+        ds.scan();
+        compareFiles(ds, expectedFiles, expectedDirectories);
+    }
+
+    @Test
+    public void testPatternsDifferInCaseScanningSensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/", "ALPHA/"});
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testPatternsDifferInCaseScanningInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/", "ALPHA/"});
+        ds.setCaseSensitive(false);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testFullpathDiffersInCaseScanningSensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {
+            "alpha/beta/gamma/gamma.xml",
+            "alpha/beta/gamma/GAMMA.XML"
+        });
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+                     new String[] {});
+    }
+
+    @Test
+    public void testFullpathDiffersInCaseScanningInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {
+            "alpha/beta/gamma/gamma.xml",
+            "alpha/beta/gamma/GAMMA.XML"
+        });
+        ds.setCaseSensitive(false);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+                     new String[] {});
+    }
+
+    @Test
+    public void testParentDiffersInCaseScanningSensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/", "ALPHA/beta/"});
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testParentDiffersInCaseScanningInsensitive() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {"alpha/", "ALPHA/beta/"});
+        ds.setCaseSensitive(false);
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml"},
+                     new String[] {"alpha", "alpha/beta", "alpha/beta/gamma"});
+    }
+
+    @Test
+    public void testExcludeOneFile() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {
+            "**/*.xml"
+        });
+        ds.setExcludes(new String[] {
+            "alpha/beta/b*xml"
+        });
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+                     new String[] {});
+    }
+
+    @Test
+    public void testExcludeHasPrecedence() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {
+            "alpha/**"
+        });
+        ds.setExcludes(new String[] {
+            "alpha/**"
+        });
+        ds.scan();
+        compareFiles(ds, new String[] {},
+                     new String[] {});
+
+    }
+
+    @Test
+    public void testAlternateIncludeExclude() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setIncludes(new String[] {
+            "alpha/**",
+            "alpha/beta/gamma/**"
+        });
+        ds.setExcludes(new String[] {
+            "alpha/beta/**"
+        });
+        ds.scan();
+        compareFiles(ds, new String[] {},
+                     new String[] {"alpha"});
+
+    }
+
+    @Test
+    public void testAlternateExcludeInclude() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setExcludes(new String[] {
+            "alpha/**",
+            "alpha/beta/gamma/**"
+        });
+        ds.setIncludes(new String[] {
+            "alpha/beta/**"
+        });
+        ds.scan();
+        compareFiles(ds, new String[] {},
+                     new String[] {});
+
+    }
+
+    /**
+     * Test inspired by Bug#1415.
+     */
+    @Test
+    public void testChildrenOfExcludedDirectory() {
+        Assume.assumeTrue(loginFailureMessage, loginSuceeded);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        buildRule.getProject().executeTarget("children-of-excluded-dir-setup");
+        FTP.FTPDirectoryScanner ds = myFTPTask.newScanner(ftp);
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setExcludes(new String[] {"alpha/**"});
+        ds.scan();
+        compareFiles(ds, new String[] {"delta/delta.xml"},
+                    new String[] {"delta"});
+
+        ds = myFTPTask.newScanner(ftp);
+        Assume.assumeTrue("Could not change remote directory", changeRemoteDir(remoteTmpDir));
+        ds.setBasedir(new File(buildRule.getProject().getBaseDir(), "tmp"));
+        ds.setExcludes(new String[] {"alpha"});
+        ds.scan();
+        compareFiles(ds, new String[] {"alpha/beta/beta.xml",
+                                       "alpha/beta/gamma/gamma.xml",
+                                        "delta/delta.xml"},
+                     new String[] {"alpha/beta", "alpha/beta/gamma", "delta"});
+
+    }
+
+    /**
+     * This class enables the use of the log messages as a way of testing
+     * the number of files actually transferred.
+     * It uses the ant regular expression mechanism to get a regex parser
+     * to parse the log output.
+     */
+    private class CountLogListener extends DefaultLogger {
+        private Vector lastMatchGroups = null;
+        private RegexpMatcher matcher = new RegexpMatcherFactory().newRegexpMatcher();
+
+        /**
+         * The only constructor for a CountLogListener
+         * @param pattern a regular expression pattern.  It should have
+         * one parenthesized group and that group should contain the
+         * number desired.
+         */
+        public CountLogListener(String pattern) {
+            super();
+            this.matcher.setPattern(pattern);
+        }
+
+
+        /*
+         * @param event the build event that is being logged.
+         */
+        public void messageLogged(BuildEvent event) {
+            String message = event.getMessage();
+            if (this.matcher.matches(message)) {
+                lastMatchGroups = this.matcher.getGroups(message);
+            }
+            super.messageLogged(event);
+        }
+
+        /**
+         * returns the desired number that results from parsing the log
+         * message
+         * @return the number of files indicated in the desired message or -1
+         * if a matching log message was never found.
+         */
+        public int getCount() {
+            if (this.lastMatchGroups == null) {
+                return -1;
+            }
+            return Integer.parseInt((String) this.lastMatchGroups.get(1));
+        }
+    }
+
+    /**
+     * This class enables the use of the log to count the number
+     * of times a message has been emitted.
+     */
+    private class LogCounter extends DefaultLogger {
+        private Map searchMap = new HashMap();
+        private int matchCount;
+
+        public void addLogMessageToSearch(String message) {
+            searchMap.put(message, new Integer(0));
+        }
+
+        /*
+         * @param event the build event that is being logged.
+         */
+        public void messageLogged(BuildEvent event) {
+            String message = event.getMessage();
+            Integer mcnt = (Integer) searchMap.get(message);
+            if (null != mcnt) {
+                searchMap.put(message, new Integer(mcnt.intValue() + 1));
+            }
+            super.messageLogged(event);
+        }
+
+        /**
+         * @return the number of times that the looked for message was sent
+         * to the log
+         */
+        public int getMatchCount(String message) {
+            Integer mcnt = (Integer) searchMap.get(message);
+            if (null != mcnt) {
+                return mcnt.intValue();
+            }
+            return 0;
+        }
+    }
+    /**
+     * Tests the combination of the newer parameter and the
+     * serverTimezoneConfig  parameter in the PUT action.  The default
+     * configuration is an ftp server on localhost which formats
+     * timestamps as GMT.
+     */
+    @Test
+    public void testTimezonePut() {
+        CountLogListener log = new CountLogListener("(\\d+) files? sent");
+        buildRule.getProject().executeTarget("timed.test.setup");
+        buildRule.getProject().addBuildListener(log);
+        buildRule.getProject().executeTarget("timed.test.put.older");
+        assertEquals(1, log.getCount());
+    }
+
+    /**
+     * Tests the combination of the newer parameter and the
+     * serverTimezoneConfig  parameter in the GET action.  The default
+     * configuration is an ftp server on localhost which formats
+     * timestamps as GMT.
+     */
+    @Test
+    public void testTimezoneGet() {
+        CountLogListener log = new CountLogListener("(\\d+) files? retrieved");
+        buildRule.getProject().executeTarget("timed.test.setup");
+        buildRule.getProject().addBuildListener(log);
+        buildRule.getProject().executeTarget("timed.test.get.older");
+        assertEquals(3, log.getCount());
+    }
+
+
+    /**
+     * Tests that the presence of one of the server config params forces
+     * the system type to Unix if not specified.
+     */
+    @Test
+    public void testConfiguration1() {
+        int[] expectedCounts = {
+                1,1,0,1,0,0,0
+        };
+        performConfigTest("configuration.1", expectedCounts);
+
+    }
+
+    /**
+     * Tests the systemTypeKey attribute.
+     */
+    @Test
+    public void testConfiguration2() {
+        int[] expectedCounts = {
+                1,0,0,1,1,0,0
+        };
+        performConfigTest("configuration.2", expectedCounts);
+
+    }
+
+    /**
+     * Tests the systemTypeKey attribute with UNIX specified.
+     */
+    @Test
+    public void testConfiguration3() {
+        int[] expectedCounts = {
+                1,0,1,0,0,1,0
+        };
+        performConfigTest("configuration.3", expectedCounts);
+
+    }
+
+    @Test
+    public void testConfigurationLang() {
+        int[] expectedCounts = {
+                1,1,0,0,0,0,1
+        };
+        performConfigTest("configuration.lang.good", expectedCounts);
+
+        try {
+            performConfigTest("configuration.lang.bad", expectedCounts);
+            fail("BuildException Expected");
+        } catch (Exception bx) {
+            assertTrue(bx instanceof BuildException);
+        }
+    }
+    /**
+     * Tests the systemTypeKey attribute.
+     */
+    @Test
+    public void testConfigurationNone() {
+        int[] expectedCounts = {
+                0,0,0,0,0,0,0
+        };
+        performConfigTest("configuration.none", expectedCounts);
+
+    }
+
+    private void performConfigTest(String target, int[] expectedCounts) {
+        String[] messages = new String[]{
+                "custom configuration",
+                "custom config: system key = default (UNIX)",
+                "custom config: system key = UNIX",
+                "custom config: server time zone ID = " + buildRule.getProject().getProperty("ftp.server.timezone"),
+                "custom config: system key = WINDOWS",
+                "custom config: default date format = yyyy/MM/dd HH:mm",
+                "custom config: server language code = de"
+
+        };
+        LogCounter counter = new LogCounter();
+        for (int i=0; i < messages.length; i++) {
+            counter.addLogMessageToSearch(messages[i]);
+        }
+
+        buildRule.getProject().addBuildListener(counter);
+        buildRule.getProject().executeTarget(target);
+        for (int i=0; i < messages.length; i++) {
+            assertEquals("target "+target+":message "+ i, expectedCounts[i], counter.getMatchCount(messages[i]));
+        }
+
+    }
+
+
+    /**
+     *  this test is inspired by a user reporting that deletions of directories with the ftp task do not work
+     */
+    @Test
+    public void testFTPDelete() {
+        buildRule.getProject().executeTarget("ftp-delete");
+    }
+
+    private void compareFiles(DirectoryScanner ds, String[] expectedFiles,
+                              String[] expectedDirectories) {
+        String includedFiles[] = ds.getIncludedFiles();
+        String includedDirectories[] = ds.getIncludedDirectories();
+        assertEquals("file present: ", expectedFiles.length,
+                     includedFiles.length);
+        assertEquals("directories present: ", expectedDirectories.length,
+                     includedDirectories.length);
+
+        for (int counter=0; counter < includedFiles.length; counter++) {
+            includedFiles[counter] = includedFiles[counter].replace(File.separatorChar, '/');
+        }
+        Arrays.sort(includedFiles);
+        for (int counter=0; counter < includedDirectories.length; counter++) {
+            includedDirectories[counter] = includedDirectories[counter]
+                            .replace(File.separatorChar, '/');
+        }
+        Arrays.sort(includedDirectories);
+        for (int counter=0; counter < includedFiles.length; counter++) {
+            assertEquals(expectedFiles[counter], includedFiles[counter]);
+        }
+        for (int counter=0; counter < includedDirectories.length; counter++) {
+            assertEquals(expectedDirectories[counter], includedDirectories[counter]);
+            counter++;
+        }
+    }
+    private static class myFTP extends FTP {
+        public FTP.FTPDirectoryScanner newScanner(FTPClient client) {
+            return new FTP.FTPDirectoryScanner(client);
+        }
+        // provide public visibility
+        public String resolveFile(String file) {
+            return super.resolveFile(file);
+        }
+    }
+
+
+    public abstract static class myRetryableFTP extends FTP {
+        private final int numberOfFailuresToSimulate;
+        private int simulatedFailuresLeft;
+
+        protected myRetryableFTP(int numberOfFailuresToSimulate) {
+            this.numberOfFailuresToSimulate = numberOfFailuresToSimulate;
+            this.simulatedFailuresLeft = numberOfFailuresToSimulate;
+        }
+
+        protected void getFile(FTPClient ftp, String dir, String filename)
+                throws IOException, BuildException
+        {
+            if (this.simulatedFailuresLeft > 0) {
+                this.simulatedFailuresLeft--;
+                throw new IOException("Simulated failure for testing");
+            }
+           super.getFile(ftp, dir, filename);
+        }
+        protected void executeRetryable(RetryHandler h, Retryable r,
+                String filename) throws IOException
+        {
+            this.simulatedFailuresLeft = this.numberOfFailuresToSimulate;
+            super.executeRetryable(h, r, filename);
+        }
+    }
+    public static class oneFailureFTP extends myRetryableFTP {
+        public oneFailureFTP() {
+            super(1);
+        }
+    }
+    public static class twoFailureFTP extends myRetryableFTP {
+        public twoFailureFTP() {
+            super(2);
+        }
+    }
+    public static class threeFailureFTP extends myRetryableFTP {
+        public threeFailureFTP() {
+            super(3);
+        }
+    }
+
+    public static class randomFailureFTP extends myRetryableFTP {
+        public randomFailureFTP() {
+            super(new Random().nextInt(Short.MAX_VALUE));
+        }
+    }
+    public void testGetWithSelectorRetryable1() {
+        buildRule.getProject().addTaskDefinition("ftp", oneFailureFTP.class);
+        try {
+            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
+        } catch (BuildException bx) {
+            fail("Two retries expected, failed after one.");
+        }
+    }
+
+    @Test
+    public void testGetWithSelectorRetryable2() {
+        buildRule.getProject().addTaskDefinition("ftp", twoFailureFTP.class);
+        try {
+            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
+        } catch (BuildException bx) {
+            fail("Two retries expected, failed after two.");
+        }
+    }
+
+    @Test
+    public void testGetWithSelectorRetryable3() {
+        buildRule.getProject().addTaskDefinition("ftp", threeFailureFTP.class);
+        try {
+            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
+            fail("Two retries expected, continued after two.");
+        } catch (BuildException bx) {
+        }
+    }
+
+    @Test
+    public void testGetWithSelectorRetryableRandom() {
+        buildRule.getProject().addTaskDefinition("ftp", randomFailureFTP.class);
+        try {
+            buildRule.getProject().setProperty("ftp.retries", "forever");
+            buildRule.getProject().executeTarget("ftp-get-with-selector-retryable");
+        } catch (BuildException bx) {
+            fail("Retry forever specified, but failed.");
+        }
+    }
+
+    @Test
+    public void testInitialCommand() {
+        performCommandTest("test-initial-command", new int[] { 1,0 });
+    }
+
+    @Test
+    public void testSiteAction() {
+        performCommandTest("test-site-action", new int[] { 1,0 });
+    }
+
+    private void performCommandTest(String target, int[] expectedCounts) {
+        String[] messages = new String[]{
+                "Doing Site Command: umask 222",
+                "Failed to issue Site Command: umask 222",
+
+        };
+        LogCounter counter = new LogCounter();
+        for (int i=0; i < messages.length; i++) {
+            counter.addLogMessageToSearch(messages[i]);
+        }
+
+        buildRule.getProject().addBuildListener(counter);
+        buildRule.getProject().executeTarget(target);
+        for (int i=0; i < messages.length; i++) {
+            assertEquals("target "+target+":message "+ i, expectedCounts[i], counter.getMatchCount(messages[i]));
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ant/blob/0ed7f4ab/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java
index 77c7036..5d4d4cf 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java
@@ -1,146 +1,146 @@
-/*
- *  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.taskdefs.optional.script;
-
-import org.apache.tools.ant.AntAssert;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.BuildFileRule;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.FileSet;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import java.io.File;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Tests the examples of the &lt;scriptdef&gt; task.
- *
- * @since Ant 1.6
- */
-public class ScriptDefTest {
-
-    @Rule
-    public BuildFileRule buildRule = new BuildFileRule();
-
-    @Before
-    public void setUp() {
-        buildRule.configureProject("src/etc/testcases/taskdefs/optional/script/scriptdef.xml");
-    }
-
-    @Test
-    public void testSimple() {
-        buildRule.executeTarget("simple");
-        // get the fileset and its basedir
-        Project p = buildRule.getProject();
-        FileSet fileset = (FileSet) p.getReference("testfileset");
-        File baseDir = fileset.getDir(p);
-        String log = buildRule.getLog();
-        assertTrue("Expecting attribute value printed",
-            log.indexOf("Attribute attr1 = test") != -1);
-
-        assertTrue("Expecting nested element value printed",
-            log.indexOf("Fileset basedir = " + baseDir.getAbsolutePath()) != -1);
-    }
-
-    @Test
-    public void testNoLang() {
-        try {
-            buildRule.executeTarget("nolang");
-            fail("Absence of language attribute not detected");
-        } catch(BuildException ex) {
-            AntAssert.assertContains("requires a language attribute", ex.getMessage());
-        }
-    }
-
-    @Test
-    public void testNoName() {
-        try {
-            buildRule.executeTarget("noname");
-            fail("Absence of name attribute not detected");
-        } catch(BuildException ex) {
-            AntAssert.assertContains("scriptdef requires a name attribute", ex.getMessage());
-        }
-    }
-
-    @Test
-    public void testNestedByClassName() {
-        buildRule.executeTarget("nestedbyclassname");
-        // get the fileset and its basedir
-        Project p = buildRule.getProject();
-        FileSet fileset = (FileSet) p.getReference("testfileset");
-        File baseDir = fileset.getDir(p);
-        String log = buildRule.getLog();
-        assertTrue("Expecting attribute value to be printed",
-            log.indexOf("Attribute attr1 = test") != -1);
-
-        assertTrue("Expecting nested element value to be printed",
-            log.indexOf("Fileset basedir = " + baseDir.getAbsolutePath()) != -1);
-    }
-
-    @Test
-    public void testNoElement() {
-        buildRule.executeTarget("noelement");
-        assertEquals("Attribute attr1 = test", buildRule.getOutput().trim());
-    }
-
-    @Test
-    public void testException() {
-        try {
-            buildRule.executeTarget("exception");
-            fail("Should have thrown an exception in the script");
-        } catch(BuildException ex) {
-            AntAssert.assertContains("TypeError", ex.getMessage());
-        }
-    }
-
-    @Test
-    public void testDoubleDef() {
-        buildRule.executeTarget("doubledef");
-        String log = buildRule.getLog();
-        assertTrue("Task1 did not execute",
-            log.indexOf("Task1") != -1);
-        assertTrue("Task2 did not execute",
-            log.indexOf("Task2") != -1);
-    }
-
-    @Test
-    public void testDoubleAttribute() {
-        try {
-            buildRule.executeTarget("doubleAttributeDef");
-            fail("Should have detected duplicate attirbute definition");
-        } catch(BuildException ex) {
-            AntAssert.assertContains("attr1 attribute more than once", ex.getMessage());
-        }
-    }
-
-    @Test
-    public void testProperty() {
-        buildRule.executeTarget("property");
-        // get the fileset and its basedir
-        String log = buildRule.getLog();
-        assertTrue("Expecting property in attribute value replaced",
-            log.indexOf("Attribute value = test") != -1);
-    }
-
-
-}
+/*
+ *  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.taskdefs.optional.script;
+
+import org.apache.tools.ant.AntAssert;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildFileRule;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Tests the examples of the &lt;scriptdef&gt; task.
+ *
+ * @since Ant 1.6
+ */
+public class ScriptDefTest {
+
+    @Rule
+    public BuildFileRule buildRule = new BuildFileRule();
+
+    @Before
+    public void setUp() {
+        buildRule.configureProject("src/etc/testcases/taskdefs/optional/script/scriptdef.xml");
+    }
+
+    @Test
+    public void testSimple() {
+        buildRule.executeTarget("simple");
+        // get the fileset and its basedir
+        Project p = buildRule.getProject();
+        FileSet fileset = (FileSet) p.getReference("testfileset");
+        File baseDir = fileset.getDir(p);
+        String log = buildRule.getLog();
+        assertTrue("Expecting attribute value printed",
+            log.indexOf("Attribute attr1 = test") != -1);
+
+        assertTrue("Expecting nested element value printed",
+            log.indexOf("Fileset basedir = " + baseDir.getAbsolutePath()) != -1);
+    }
+
+    @Test
+    public void testNoLang() {
+        try {
+            buildRule.executeTarget("nolang");
+            fail("Absence of language attribute not detected");
+        } catch(BuildException ex) {
+            AntAssert.assertContains("requires a language attribute", ex.getMessage());
+        }
+    }
+
+    @Test
+    public void testNoName() {
+        try {
+            buildRule.executeTarget("noname");
+            fail("Absence of name attribute not detected");
+        } catch(BuildException ex) {
+            AntAssert.assertContains("scriptdef requires a name attribute", ex.getMessage());
+        }
+    }
+
+    @Test
+    public void testNestedByClassName() {
+        buildRule.executeTarget("nestedbyclassname");
+        // get the fileset and its basedir
+        Project p = buildRule.getProject();
+        FileSet fileset = (FileSet) p.getReference("testfileset");
+        File baseDir = fileset.getDir(p);
+        String log = buildRule.getLog();
+        assertTrue("Expecting attribute value to be printed",
+            log.indexOf("Attribute attr1 = test") != -1);
+
+        assertTrue("Expecting nested element value to be printed",
+            log.indexOf("Fileset basedir = " + baseDir.getAbsolutePath()) != -1);
+    }
+
+    @Test
+    public void testNoElement() {
+        buildRule.executeTarget("noelement");
+        assertEquals("Attribute attr1 = test", buildRule.getOutput().trim());
+    }
+
+    @Test
+    public void testException() {
+        try {
+            buildRule.executeTarget("exception");
+            fail("Should have thrown an exception in the script");
+        } catch(BuildException ex) {
+            AntAssert.assertContains("TypeError", ex.getMessage());
+        }
+    }
+
+    @Test
+    public void testDoubleDef() {
+        buildRule.executeTarget("doubledef");
+        String log = buildRule.getLog();
+        assertTrue("Task1 did not execute",
+            log.indexOf("Task1") != -1);
+        assertTrue("Task2 did not execute",
+            log.indexOf("Task2") != -1);
+    }
+
+    @Test
+    public void testDoubleAttribute() {
+        try {
+            buildRule.executeTarget("doubleAttributeDef");
+            fail("Should have detected duplicate attirbute definition");
+        } catch(BuildException ex) {
+            AntAssert.assertContains("attr1 attribute more than once", ex.getMessage());
+        }
+    }
+
+    @Test
+    public void testProperty() {
+        buildRule.executeTarget("property");
+        // get the fileset and its basedir
+        String log = buildRule.getLog();
+        assertTrue("Expecting property in attribute value replaced",
+            log.indexOf("Attribute value = test") != -1);
+    }
+
+
+}