scohen 2005/05/21 19:58:47 Modified: src/testcases/org/apache/tools/ant/taskdefs/optional/net FTPTest.java src/etc/testcases/taskdefs/optional/net ftp.xml Log: Added tests for the "newer" attribute in conjunction with the servertimezoneconfig attribute in the PUT and GET actions. Revision Changes Path 1.16 +83 -0 ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java Index: FTPTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- FTPTest.java 30 Mar 2005 08:35:44 -0000 1.15 +++ FTPTest.java 22 May 2005 02:58:47 -0000 1.16 @@ -16,16 +16,23 @@ */ package org.apache.tools.ant.taskdefs.optional.net; +import org.apache.tools.ant.BuildEvent; import org.apache.tools.ant.BuildFileTest; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.BuildLogger; +import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.taskdefs.optional.net.FTP; import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.regexp.RegexpMatcher; +import org.apache.tools.ant.util.regexp.RegexpMatcherFactory; import org.apache.tools.ant.taskdefs.condition.Os; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Vector; import org.apache.commons.net.ftp.FTPClient; @@ -537,6 +544,82 @@ 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)); + } + } + + /** + * 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. + */ + public void testTimezonePut() { + CountLogListener log = new CountLogListener("(\\d+) files? sent"); + getProject().executeTarget("timed.test.setup"); + getProject().addBuildListener(log); + 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. + */ + public void testTimezoneGet() { + CountLogListener log = new CountLogListener("(\\d+) files? retrieved"); + getProject().executeTarget("timed.test.setup"); + getProject().addBuildListener(log); + getProject().executeTarget("timed.test.get.older"); + assertEquals(3, log.getCount()); + } + /** * this test is inspired by a user reporting that deletions of directories with the ftp task do not work */ 1.9 +88 -0 ant/src/etc/testcases/taskdefs/optional/net/ftp.xml Index: ftp.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/net/ftp.xml,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ftp.xml 21 May 2005 13:03:08 -0000 1.8 +++ ftp.xml 22 May 2005 02:58:47 -0000 1.9 @@ -9,6 +9,12 @@ <property name="ftp.filesep" value="/"/> <property name="tmp.dir" location="tmp"/> <property name="tmp.get.dir" location="tmp.get"/> + <property name="tmp.local" location="${tmp.get.dir}"/> + <property name="tmp.remote" location="${tmp.dir}"/> + <property name="tstamp.format" value="yyyy-MM-dd HH:mm"/> + <property name="server.timestamp.granularity.millis" value="60000"/> + <property name="ftp.server.timezone" value="GMT"/> + <fileset dir="${tmp.get.dir}" id="fileset-destination-with-selector"> <include name="alpha/**"/> <filename name="**/alpha.xml" /> @@ -25,12 +31,23 @@ <fileset dir="${tmp.get.dir}" id="fileset-destination-nofollowsymlinks" followsymlinks="false"> <include name="alpha/**"/> </fileset> + + <filelist dir="${tmp.local}" id="timed-files" files="A.timed,B.timed,C.timed,D.timed"/> + + <patternset id="timed-test-files"> + <include name="A.timed"/> + <include name="B.timed"/> + <include name="C.timed"/> + <include name="D.timed"/> + </patternset> + <target name="setup"> <mkdir dir="${tmp.get.dir}"/> <mkdir dir="${tmp.dir}/alpha/beta/gamma"/> <touch file="${tmp.dir}/alpha/beta/gamma/gamma.xml"/> <touch file="${tmp.dir}/alpha/beta/beta.xml"/> </target> + <target name="ftp-get-with-selector"> <ftp action="get" server="${ftp.host}" @@ -104,5 +121,76 @@ <include name="**"/> </fileset> </ftp> + </target> + + <target name="timed.test.setup"> + <touch> + <filelist refid="timed-files"/> + </touch> + <ftp action="put" + server="${ftp.host}" + userid="${ftp.user}" + password="${ftp.password}" + separator="${ftp.filesep}" + remotedir="${tmp.remote}" + > + <fileset dir="${tmp.local}"> + <patternset refid="timed-test-files"/> + </fileset> + </ftp> + </target> + + <target name="timed.test.put.older"> + <tstamp> + <format property="five.minutes.older" pattern="${tstamp.format}" offset="-5" unit="minute"/> + </tstamp> + + <touch datetime="${five.minutes.older}" pattern="${tstamp.format}" verbose="true"> + <fileset dir="${tmp.remote}"> + <include name="A.timed"/> + </fileset> + </touch> + <ftp action="put" + server="${ftp.host}" + userid="${ftp.user}" + password="${ftp.password}" + separator="${ftp.filesep}" + remotedir="${tmp.remote}" + timediffmillis="${server.timestamp.granularity.millis}" + newer="true" + serverTimeZoneConfig="${ftp.server.timezone}" + > + <fileset dir="${tmp.local}"> + <patternset refid="timed-test-files"/> + </fileset> + </ftp> + </target> + <target name="timed.test.get.older"> + <tstamp> + <format property="five.minutes.older" pattern="${tstamp.format}" offset="-5" unit="minute"/> + </tstamp> + + <touch datetime="${five.minutes.older}" pattern="${tstamp.format}" verbose="true"> + <fileset dir="${tmp.local}"> + <include name="A.timed"/> + <include name="C.timed"/> + <include name="D.timed"/> + </fileset> + </touch> + <ftp action="get" + server="${ftp.host}" + userid="${ftp.user}" + password="${ftp.password}" + separator="${ftp.filesep}" + remotedir="${tmp.remote}" + preservelastmodified="true" + newer="true" + serverTimeZoneConfig="${ftp.server.timezone}" + > + <fileset dir="${tmp.local}"> + <patternset refid="timed-test-files"/> + </fileset> + </ftp> </target> + </project> \ No newline at end of file
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]