<?xml version="1.0"?>

<project name="Run Vaadin Testbench Tests" basedir="." default="run-and-clean-up">
	<!-- ================================================================== -->
	<!-- Configuration                                                      -->
	<!-- ================================================================== -->
	<!-- Browsers to use for testing -->
	<property name="browsers-windows" value="winxp-ie6,winxp-ie7,winxp-ie8,win7-ie9,winxp-firefox36,winxp-firefox4,winxp-firefox5,winxp-firefox6,winxp-safari4,winxp-safari5,winxp-googlechrome13,winxp-googlechrome-stable,winxp-opera1060,winxp-opera11" />
	<property name="browsers-linux" value="linux-firefox3,linux-opera10,linux-googlechrome8" />
	<property name="browsers-mac" value="osx-firefox3,osx-opera10,osx-googlechrome8,osx-safari4,osx-safari5" />

	<property name="browsers" value="${browsers-windows}" />
	
	<!-- Number of times to retry a test if it fails -->
	<property name="retries" value="2" />

	<!-- Screen shot base directory -->
	<fail unless="com.vaadin.testbench.screenshot.directory" message="The 'com.vaadin.testbench.screenshot.directory' property must be defined." />

	<!-- Screen shot resolution -->
	<property name="com.vaadin.testbench.screenshot.resolution" value="1500x850" />

	<!-- Host running Testbench Hub -->
	<property name="com.vaadin.testbench.tester.host" value="testbench-hub.intra.itmill.com" />

	<property name="com.vaadin.testbench.screenshot.block.error" value="0.025"/>
	<property name="com.vaadin.testbench.debug" value="false"/>
	
	<!-- Temporary output directory, created and removed by this script -->
	<!-- <property name="test-output-dir" value="../build/test-output" /> -->
	<fail unless="test-output-dir" message="The 'test-output-dir' property must be defined." />

	<property name="class-dir" value="${test-output-dir}/classes" />
	<taskdef resource="net/sf/antcontrib/antlib.xml">
		<classpath>
			<pathelement location="../build/lib/ant-contrib-1.0b3.jar" />
		</classpath>
	</taskdef>

	<!-- classpath must include test bench jar and its dependencies -->
	<path id="classpath">
		<fileset dir="${com.vaadin.testbench.lib.dir}" includes="**/*.jar" />
	</path>

	<!-- fileset containing all tests to run -->
	<fileset dir=".." id="html-test-files">
		<include name="tests/**/**.html" />
		<include name="src/com/vaadin/tests/**/**.html" />
		<exclude name="tests/integration-testscripts/**" />
	</fileset>

	<!-- This target converts HTML tests files to java junit tests. One test file for each browser is created. -->
	<target name="create-tests" depends="remove-temp-testclasses" if="server.start.succeeded">
		<pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

		<java classname="com.vaadin.testbench.util.TestConverter" classpathref="classpath" fork="true">
			<sysproperty key="com.vaadin.testbench.test.retries" value="${retries}" />
			<jvmarg value="-Duser.language=en"/>
			<jvmarg value="-Duser.country=US"/>
			<arg value="${test-output-dir}" />
			<arg value="${browsers}" />
			<arg line="${testfiles}" />
		</java>
	</target>


	<!-- This target complies the generated java junit tests. -->
	<target name="compile-tests" depends="create-tests">
		<mkdir dir="${class-dir}" />
		<javac srcdir="${test-output-dir}" destdir="${class-dir}" debug="on" fork="yes" failonerror="false" encoding="UTF8">
			<classpath>
				<path refid="classpath" />
			</classpath>
		</javac>
	</target>


	<!-- ================================================================== -->
	<!-- Toolkit Server Management                                          -->
	<!-- ================================================================== -->

	<target name="server-start">
		<fail unless="output-dir" message="The 'output-dir' (usually build/result/vaadin-xxx) should be given to test script." />
		<fail unless="package.name" message="The 'package.name' property must be defined." />
		<fail unless="package.filename" message="The 'package.filename' property must be defined." />
		<fail unless="testing.testarea" message="The 'testing.testarea' property must be defined." />

		<echo>Package name: ${package.name}</echo>
		<echo>Package filename: ${package.filename}</echo>
		<echo>Testing area: ${testing.testarea}</echo>

		<exec executable="python" searchpath="true" dir=".." resultproperty="server.start.result">
			<arg value="build/testing/toolkit-server.py" />
			<arg value="start" />
			<arg value="${package.name}" />
			<arg value="${package.filename}" />
			<arg value="${output-dir}" />
			<arg value="${testing.testarea}" />
		</exec>

		<condition property="server.start.succeeded">
			<equals arg1="${server.start.result}" arg2="0" />
		</condition>
	</target>

	<target name="server-stop">
		<exec executable="python" dir=".." searchpath="true" resultproperty="server.stop.result">
			<arg value="build/testing/toolkit-server.py" />
			<arg value="stop" />
		</exec>
	</target>

	<!-- ================================================================== -->
	<!-- Running Tests                                                      -->
	<!-- ================================================================== -->

	<target name="check-parameters">
		<fail unless="com.vaadin.testbench.lib.dir" message="The 'com.vaadin.testbench.lib.dir' property must be defined." />
		<fail unless="com.vaadin.testbench.tester.host" message="The 'com.vaadin.testbench.tester.host' property must be defined." />
		<fail unless="com.vaadin.testbench.deployment.url" message="The 'com.vaadin.testbench.deployment.url' property must be defined." />
	</target>

	<target name="run-tests" depends="compile-tests" if="server.start.succeeded">
		<fileset dir="${test-output-dir}" id="tests-fileset">
			<include name="**/**.java" />
		</fileset>


		<for threadCount="50" parallel="true" keepgoing="true" param="target">
			<path>
				<fileset refid="tests-fileset" />
			</path>
			<sequential>
				<antcall target="execute-tests">
					<param name="target" value="@{target}" />
				</antcall>
			</sequential>
		</for>
	</target>

	<!-- This target runs the generated and compiled junit tests -->
	<target name="execute-tests">
		<junit fork="yes" printsummary="withOutAndErr" maxmemory="96m">
			<classpath>
				<path refid="classpath" />
				<pathelement path="${class-dir}" />
			</classpath>

			<jvmarg value="-Dcom.vaadin.testbench.tester.host=${com.vaadin.testbench.tester.host}" />
			<jvmarg value="-Dcom.vaadin.testbench.deployment.url=${com.vaadin.testbench.deployment.url}" />
			<!-- Define where the reference screenshots and diff files are saved -->
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" />
			<!-- Resolution for screenshots -->
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.resolution=${com.vaadin.testbench.screenshot.resolution}" />
			<jvmarg value="-Dcom.vaadin.testbench.debug=${com.vaadin.testbench.debug}" />
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.block.error=${com.vaadin.testbench.screenshot.block.error}" />


			<jvmarg value="-Djava.awt.headless=true" />

			<!-- true/false system arguments -->
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.softfail=${com.vaadin.testbench.screenshot.softfail}" />
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.reference.debug=${com.vaadin.testbench.screenshot.reference.debug}" />
			<jvmarg value="-Dcom.vaadin.testbench.screenshot.cursor=${com.vaadin.testbench.screenshot.cursor}" />

			<batchtest>
				<filelist dir="${test-output-dir}" files="${target}" />
			</batchtest>
		</junit>

	</target>

	<!-- Remove temporary source and compiled java files -->
	<target name="remove-temp-testclasses">
		<delete failonerror="false">
			<fileset dir="${test-output-dir}">
				<include name="**/**.java" />
				<include name="**/**.class" />
			</fileset>
		</delete>
	</target>

	<!-- Remove old error screenshots -->
	<target name="remove-error-screens">
		<mkdir dir="${com.vaadin.testbench.screenshot.directory}/errors" />
		<delete>
			<fileset dir="${com.vaadin.testbench.screenshot.directory}/errors">
				<include name="**/**.*" />
			</fileset>
		</delete>
	</target>

	<!-- ================================================================== -->
	<!-- Main Targets                                                       -->
	<!-- ================================================================== -->

	<!-- The default target. -->
	<target name="run-and-clean-up" depends="check-parameters,remove-error-screens,run-tests" if="server.start.succeeded">
	</target>

	<!-- Also starts the server. -->
	<target name="test-package" depends="server-start, run-and-clean-up, server-stop">
	</target>

</project>