<project name="exec-test" default="spawn" basedir=".">
    <target name="init">
        <!-- this property can be overriden programatically in the Java test case -->
        <property name="timeToWait" value="10"/>
        <!-- this property can be overriden programatically in the Java test case -->
        <property name="logFile" value="${java.io.tmpdir}/spawn.log"/>
        <property environment="env"/>
        <!-- UNIX -->
        <available file="sh" filepath="${env.PATH}" property="sh.executable"/>
        <!-- CYGWIN -->
        <available file="sh.exe" filepath="${env.PATH}" property="sh.exe.executable"/>
        <condition property="test.can.run">
            <or>
                <isset property="sh.executable"/>
                <isset property="sh.exe.executable"/>
            </or>
        </condition>
        <!-- UNIX -->
        <available file="wc" filepath="${env.PATH}" property="wc.executable"/>
        <!-- CYGWIN -->
        <available file="wc.exe" filepath="${env.PATH}" property="wc.exe.executable"/>
        <condition property="wc.can.run">
            <or>
                <isset property="wc.executable"/>
                <isset property="wc.exe.executable"/>
            </or>
        </condition>
        <!-- UNIX -->
        <available file="cat" filepath="${env.PATH}" property="cat.executable"/>
        <!-- CYGWIN -->
        <available file="cat.exe" filepath="${env.PATH}" property="cat.exe.executable"/>
        <condition property="cat.can.run">
            <or>
                <isset property="cat.executable"/>
                <isset property="cat.exe.executable"/>
            </or>
        </condition>
    </target>

    <target name="spawn" depends="init" if="test.can.run">
        <exec executable="sh" spawn="true">
            <arg value="spawn.sh"/>
            <arg value="${timeToWait}" />
            <arg value="${logFile}" />
        </exec>
    </target>

    <target name="no-redirect" depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirect1" depends="init" if="test.can.run">
        <exec executable="sh" output="redirect.out">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirect2" depends="init" if="test.can.run">
        <exec executable="sh" output="redirect.out" error="redirect.err">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirect3" depends="init" if="test.can.run">
        <exec executable="sh" logerror="true"
              output="redirect.out" outputproperty="redirect.out">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirect4" depends="init" if="test.can.run">
        <exec executable="sh"
              error="redirect.err" errorproperty="redirect.err"
              output="redirect.out" outputproperty="redirect.out">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirect5" depends="init" if="wc.can.run">
        <exec executable="wc" inputstring="x y z"
              error="redirect.err" errorproperty="redirect.err"
              output="redirect.out" outputproperty="redirect.out">
            <arg value="-w"/>
        </exec>
    </target>

    <target name="redirect6" depends="init" if="wc.can.run">
        <echo file="redirect.in">x y z</echo>
        <exec executable="wc" input="redirect.in"
              error="redirect.err" errorproperty="redirect.err"
              output="redirect.out" outputproperty="redirect.out">
            <arg value="-w"/>
        </exec>
    </target>

    <target name="redirect7" depends="init" if="wc.can.run">
        <exec executable="wc" inputstring="x y z"
              error="redirect.err"
              output="redirect.out" outputproperty="redirect.out">
            <arg value="-w"/>
        </exec>
    </target>

    <target name="redirector1" description="fail"
            depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
            <redirector output="redirector.out" />
            <redirector output="whocares" />
        </exec>
    </target>

    <target name="redirector2" depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
            <redirector output="redirector.out" />
        </exec>
    </target>

    <target name="redirector3" depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
            <redirector output="redirector.out" error="redirector.err" />
        </exec>
    </target>

    <target name="redirector4" depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
            <redirector output="redirector.out" logerror="true"
                        outputproperty="redirector.out" />
        </exec>
    </target>

    <target name="redirector5" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector error="redirector.err" errorproperty="redirector.err"
              output="redirector.out" outputproperty="redirector.out" />
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirector6" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
            </redirector>
            <arg value="parrot.sh" />
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirector7" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
                <errorfilterchain>
                    <replacestring from="err" to="ERROR!!!" />
                </errorfilterchain>
            </redirector>
            <arg value="parrot.sh" />
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirector8" depends="init" if="wc.can.run">
        <echo file="redirector.in">x y z</echo>
        <exec executable="wc">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <inputmapper type="merge" to="redirector.in" />
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
            </redirector>
            <arg value="-w"/>
        </exec>
    </target>

    <target name="redirector9" depends="init" if="cat.can.run">
        <echo file="redirector.in">blah before blah</echo>
        <exec executable="cat">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <inputfilterchain>
                    <replacestring from="before" to="after" />
                </inputfilterchain>
                <inputmapper type="merge" to="redirector.in" />
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
            </redirector>
        </exec>
    </target>

    <target name="redirector10" depends="init" if="cat.can.run">
        <echo file="redirector.in">blah before blah</echo>
        <exec executable="cat">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <outputfilterchain>
                    <replacestring from="before" to="after" />
                </outputfilterchain>
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
            </redirector>
            <arg value="redirector.in"/>
        </exec>
    </target>

    <target name="redirector11" depends="init" if="cat.can.run">
        <exec executable="cat">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err"
                        inputstring="blah before blah">
                <inputfilterchain>
                    <replacestring from="before" to="after" />
                </inputfilterchain>
                <outputmapper type="merge" to="redirector.out" />
                <errormapper type="merge" to="redirector.err" />
            </redirector>
        </exec>
    </target>

    <target name="redirector12" depends="init" if="cat.can.run">
        <echo file="redirector.in">blah before blah</echo>
        <exec executable="cat" output="redirector.out" error="redirector.err">
            <redirector outputproperty="redirector.out"
                        errorproperty="redirector.err">
                <outputfilterchain>
                    <replacestring from="before" to="after" />
                </outputfilterchain>
                <outputmapper type="glob" from="nomatch" to="nomatchout" />
                <errormapper type="glob" from="nomatch" to="nomatcherr" />
            </redirector>
            <arg value="redirector.in"/>
        </exec>
    </target>

    <target name="redirector13" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector>
                <outputfilterchain>
                    <replacestring from="out" to="OUTPUT???" />
                </outputfilterchain>
                <errorfilterchain>
                    <replacestring from="err" to="ERROR!!!" />
                </errorfilterchain>
            </redirector>
            <arg value="parrot.sh" />
            <arg value="${ant.file}" />
        </exec>
    </target>

    <target name="redirector14" depends="init" if="cat.can.run">
        <exec executable="cat">
            <redirector inputstring="blah before blah">
                <outputfilterchain>
                    <replacestring from="before" to="after" />
                </outputfilterchain>
                <outputmapper type="glob" from="nomatch" to="nomatchout" />
                <errormapper type="glob" from="nomatch" to="nomatcherr" />
            </redirector>
        </exec>
    </target>

    <target name="redirector15" depends="init" if="cat.can.run">
        <exec executable="cat">
            <redirector input="input/iso8859-1" output="redirector.out"
                        inputencoding="ISO8859_1" outputencoding="UTF8" />
        </exec>
    </target>

    <target name="redirector16" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector inputstring="exit"
                        output="redirector16.out" error="redirector16.err" />
        </exec>
        <condition property="16pass">
            <and>
                <available file="redirector16.out" type="file" />
                <available file="redirector16.err" type="file" />
            </and>
        </condition>
        <fail unless="16pass">Files were not created.</fail>
    </target>

    <target name="redirector17" depends="init" if="test.can.run">
        <exec executable="sh">
            <redirector inputstring="exit" createemptyfiles="false"
                        output="redirector17.out" error="redirector17.err" />
        </exec>
        <condition property="17fail">
            <or>
                <available file="redirector17.out" type="file" />
                <available file="redirector17.err" type="file" />
            </or>
        </condition>
        <fail if="17fail">Files were created.</fail>
    </target>

    <target name="redirector18" depends="init" if="test.can.run">
        <exec executable="sh">
            <arg value="parrot.sh"/>
            <arg value="${ant.file}" />
            <redirector alwayslog="true" logerror="true"
                        outputproperty="redirector.out" />
        </exec>
        <fail message="property redirector.out has unexpected content">
            <condition>
                <not>
                    <equals arg1="${ant.file} out" arg2="${redirector.out}" />
                </not>
            </condition>
        </fail>
    </target>

    <target name="cleanup">
        <delete>
            <fileset file="${logFile}" />
            <fileset dir="${basedir}" includes="redirect*" />
            <fileset dir="${basedir}" includes="redirector*" />
        </delete>
    </target>
</project>
