<?xml version="1.0" encoding="utf-8"?>

<project name="JsUnit" default="create_distribution" basedir=".">

    <!--
     The following are the properties used to configure the JsUnit server.  You need to provide values for the mandatory properties.
     See the documentation at http://www.jsunit.net for more information.
     -->

    <property
            name="browserFileNames"
            value=""
            description="browserFileNames is the list of browsers in which to run tests when StandaloneTest is invoked on this machine. For a JsUnit Server, this is a mandatory property. For example: 'c:\program files\internet explorer\iexplore.exe,c:\program files\netscape\netscape7.1\netscp.exe'"
            />

    <property
            id="closeBrowsersAfterTestRuns"
            name="closeBrowsersAfterTestRuns"
            value=""
            description="closeBrowsersAfterTestRuns determines whether to attempt to close browsers after test runs. This is not a mandatory property. The default is true. For example: 'true'"
            />

    <property
            id="description"
            name="description"
            value=""
            description="description is a human-readable description of a standard or farm server. This is not a mandatory property. The default is blank. For example: 'This is our Mac - it's only running Safari right now'"
            />

    <property
            id="ignoreUnresponsiveRemoteMachines"
            name="ignoreUnresponsiveRemoteMachines"
            value=""
            description="ignoreUnresponsiveRemoteMachines is a property used only by the JsUnit Farm Server and the distributed_test target. Its value is whether to ignore a remove machine that does not respond.  If true, test runs will be green even if one or more remove machines fail to respond; if false, an unresponsive remove machine results in a failure.  This is not a mandatory property.  Its default is false. For example: 'true'"
            />

    <property
            id="logsDirectory"
            name="logsDirectory"
            value=""
            description="logsDirectory is the directory in which the JsUnitStandardServer stores the XML logs produced from tests run. It can be specified relative to the working directory. This is not a mandatory property. If not specified, the directory called 'logs' inside resourceBase is assumed. For example: 'c:\jsunit\java\logs'"
            />

    <property
            id="port"
            name="port"
            value=""
            description="port is the port on which the JsUnitStandardServer runs. This is not a mandatory property. If not specified, 8080 is assumed. For exapmle: '8080'"
            />

    <property
            id="remoteMachineURLs"
            name="remoteMachineURLs"
            value=""
            description="remoteMachineURLs is a property used only by the JsUnit Farm Server and the distributed_test target. Its value is the list of URLs of remove machines to which a request to run tests will be sent. For example: 'http://machine1.company.com:8080,http://localhost:8080,http://192.168.1.200:9090'"
            />

    <property
            id="resourceBase"
            name="resourceBase"
            value=""
            description="resourceBase is the directory that the JsUnitStandardServer considers to be its document root. It can be specified relative to the working directory. This is not a mandatory property. If not specified, the working directory is assumed. For example: 'c:\jsunit'"
            />

    <property
            id="timeoutSeconds"
            name="timeoutSeconds"
            value=""
            description="timeoutSeconds is the number of seconds to wait before timing out a browser during a test run. This is not a mandatory property. If not specified, 60 is assumed. For example: '60'"
            />

    <property
            id="url"
            name="url"
            value=""
            description="url is the URL (HTTP or file protocol) to open in the browser. For a JsUnit Server, this is a mandatory property for a test run if the server is not passed the 'url' parameter. For example: 'file:///c:/jsunit/testRunner.html?testPage=c:/jsunit/tests/jsUnitTestSuite.html'"
            />

    <!--
     The remainder of this build file is not intended to be modified by the end user.
     Those targets whose name begins with an underscore are not intended to be run directly by the end user.
     -->

    <property name="source_core" location="java/source_core"/>
    <property name="source_server" location="java/source_server"/>
    <property name="tests_core" location="java/tests_core"/>
    <property name="tests_server" location="java/tests_server"/>
    <property name="bin" location="java/bin"/>
    <property name="lib" location="java/lib"/>
    <property name="testlib" location="java/testlib"/>
    <property name="config" location="java/config"/>
    <property name="loggingPropertiesFile" location="logging.properties"/>

    <path id="classpath">
        <fileset dir="${lib}">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${bin}">
            <include name="jsunit.jar"/>
        </fileset>
        <dirset dir="${config}"/>
    </path>

    <path id="self_tests_classpath">
        <fileset dir="${lib}">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${testlib}">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${bin}">
            <include name="jsunit.jar"/>
        </fileset>
        <dirset dir="${config}"/>
    </path>

    <target name="_compile_source" description="Compiles the source">
        <delete dir="${bin}/net"/>
        <javac srcdir="${source_core}" destdir="${bin}" debug="true">
            <classpath>
                <fileset dir="${lib}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
        </javac>
        <javac srcdir="${source_server}" destdir="${bin}" debug="true">
            <classpath>
                <fileset dir="${lib}">
                    <include name="*.jar"/>
                </fileset>
                <path location="${bin}"/>
            </classpath>
        </javac>
    </target>

    <target name="_compile_tests" description="Compiles the self-tests">
        <javac srcdir="${tests_core}" destdir="${bin}" debug="true">
            <classpath refid="self_tests_classpath"/>
        </javac>
        <javac srcdir="${tests_server}" destdir="${bin}" debug="true">
            <classpath refid="self_tests_classpath"/>
        </javac>
    </target>

    <target name="_create_jar" depends="_compile_source" description="Creates jsunit.jar">
        <delete file="${bin}/jsunit.jar"/>
        <jar jarfile="${bin}/jsunit.jar" basedir="${bin}"/>
        <delete dir="${bin}/net"/>
    </target>

    <target name="_generateJsUnitPropertiesSample" description="Generates the jsunit.properties.sample file">
        <xslt in="build.xml" out="jsunit.properties.sample" destdir="."
              style="xsl/buildDotXmlToJsUnitDotProperties.xsl"></xslt>
    </target>

    <target name="_run_unit_tests" depends="_compile_tests" description="Runs the JsUnit Java unit tests">
        <junit fork="yes" haltonfailure="false" forkmode="once" showoutput="yes" printsummary="withOutAndErr"
               failureproperty="junit_test_failed">
            <formatter type="plain" usefile="false"/>
            <classpath refid="self_tests_classpath"/>
            <classpath path="${bin}"/>
            <test name="net.jsunit.UnitTestSuite"/>
        </junit>
        <fail if="junit_test_failed"/>
    </target>

    <target name="_run_all_tests" depends="_create_jar,_compile_tests"
            description="Runs all the JsUnit Java tests.  Used in the continuous build">
        <junit fork="yes" haltonfailure="false" forkmode="once" showoutput="yes" printsummary="withOutAndErr"
               failureproperty="junit_test_failed">
            <formatter type="xml"/>
            <classpath refid="self_tests_classpath"/>
            <classpath path="${bin}"/>
            <sysproperty key="java.security.manager" value="com.thoughtworks.ashcroft.runtime.JohnAshcroft"/>
            <test name="net.jsunit.PureUnitTestSuite"/>
        </junit>
        <junit fork="yes" haltonfailure="false" forkmode="once" showoutput="yes" printsummary="withOutAndErr"
               failureproperty="junit_test_failed">
            <formatter type="xml"/>
            <classpath refid="self_tests_classpath"/>
            <classpath path="${bin}"/>
            <test name="net.jsunit.ImpureUnitTestSuite"/>
        </junit>
        <junit fork="yes" haltonfailure="false" forkmode="once" showoutput="yes" printsummary="withOutAndErr"
               failureproperty="junit_test_failed">
            <formatter type="xml"/>
            <classpath refid="self_tests_classpath"/>
            <classpath path="${bin}"/>
            <test name="net.jsunit.FunctionalTestSuite"/>
        </junit>
        <junit fork="yes" haltonfailure="false" forkmode="once" showoutput="yes" printsummary="withOutAndErr"
               failureproperty="junit_test_failed">
            <formatter type="xml"/>
            <classpath refid="self_tests_classpath"/>
            <classpath path="${bin}"/>
            <test name="net.jsunit.FarmServerFunctionalTestSuite"/>
        </junit>
        <fail if="junit_test_failed"/>
    </target>

    <target name="create_distribution" depends="_create_jar,_run_unit_tests"
            description="Creates and tests the JsUnit distribution"/>

    <target name="start_server" description="Starts a JsUnit Server">
        <java fork="true" classname="net.jsunit.JsUnitStandardServer">
            <classpath refid="classpath"/>
            <sysproperty key="java.util.logging.config.file" value="${loggingPropertiesFile}"/>
            <sysproperty key="description" value="${description}"/>
            <sysproperty key="browserFileNames" value="${browserFileNames}"/>
            <sysproperty key="url" value="${url}"/>
            <sysproperty key="port" value="${port}"/>
            <sysproperty key="resourceBase" value="${resourceBase}"/>
            <sysproperty key="logsDirectory" value="${logsDirectory}"/>
            <sysproperty key="timeoutSeconds" value="${timeoutSeconds}"/>
            <sysproperty key="closeBrowsersAfterTestRuns" value="${closeBrowsersAfterTestRuns}"/>
        </java>
    </target>

    <target name="start_farm_server" description="Starts a JsUnit Farm Server">
        <java fork="true" classname="net.jsunit.JsUnitFarmServer">
            <classpath refid="classpath"/>
            <sysproperty key="java.util.logging.config.file" value="${loggingPropertiesFile}"/>
            <sysproperty key="description" value="${description}"/>
            <sysproperty key="ignoreUnresponsiveRemoteMachines" value="${ignoreUnresponsiveRemoteMachines}"/>
            <sysproperty key="logsDirectory" value="${logsDirectory}"/>
            <sysproperty key="port" value="${port}"/>
            <sysproperty key="remoteMachineURLs" value="${remoteMachineURLs}"/>
            <sysproperty key="resourceBase" value="${resourceBase}"/>
            <sysproperty key="url" value="${url}"/>
        </java>
    </target>

    <target name="stop_server" description="Stops the JsUnit Server">
        <java fork="true" classname="org.mortbay.stop.Main" failonerror="true">
            <classpath refid="classpath"/>
        </java>
    </target>

    <target name="standalone_test" description="Runs tests on the local machine">
        <junit showoutput="true" haltonerror="true" haltonfailure="true">
            <formatter type="plain" usefile="false"/>
            <classpath refid="classpath"/>
            <sysproperty key="browserFileNames" value="${browserFileNames}"/>
            <sysproperty key="description" value="${description}"/>
            <sysproperty key="closeBrowsersAfterTestRuns" value="${closeBrowsersAfterTestRuns}"/>
            <sysproperty key="logsDirectory" value="${logsDirectory}"/>
            <sysproperty key="port" value="${port}"/>
            <sysproperty key="resourceBase" value="${resourceBase}"/>
            <sysproperty key="timeoutSeconds" value="${timeoutSeconds}"/>
            <sysproperty key="url" value="${url}"/>
            <test name="net.jsunit.StandaloneTest"/>
        </junit>
    </target>

    <target name="distributed_test" description="Runs tests the remote machines">
        <junit showoutput="true" haltonerror="true" haltonfailure="true">
            <formatter type="plain" usefile="false"/>
            <classpath refid="classpath"/>
            <sysproperty key="browserFileNames" value="${browserFileNames}"/>
            <sysproperty key="description" value="${description}"/>
            <sysproperty key="ignoreUnresponsiveRemoteMachines" value="${ignoreUnresponsiveRemoteMachines}"/>
            <sysproperty key="logsDirectory" value="${logsDirectory}"/>
            <sysproperty key="port" value="${port}"/>
            <sysproperty key="remoteMachineURLs" value="${remoteMachineURLs}"/>
            <sysproperty key="resourceBase" value="${resourceBase}"/>
            <sysproperty key="url" value="${url}"/>
            <test name="net.jsunit.DistributedTest"/>
        </junit>
    </target>

</project>
