<?xml version="1.0"?>
<project xmlns:antcontrib="antlib:net.sf.antcontrib"
	xmlns:ivy="antlib:org.apache.ivy.ant"
    name="Run Vaadin Testbench Tests" basedir="." default="run-and-clean-up">
	
	<property name="project.root" value=".."/>
	<!-- Import common targets  -->
	<import file="../build/common.xml" />
	
	<!-- ================================================================== -->
	<!-- Configuration                                                      -->
	<!-- ================================================================== -->
	<!-- Browsers to use for testing -->
	<property name="browsers-windows" value="winxp-ie8,win7-ie9,winxp-firefox12,winxp-safari5,winxp-googlechrome21,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 -->
	<fail unless="test-output-dir" message="The 'test-output-dir' property must be defined." />	
	
	<property name="class-dir" value="${test-output-dir}/classes" />

    <target name="initialize" depends="common.init-deps">
        <ivy:resolve conf="emma"/>
        <ivy:cachepath pathid="emma.lib" conf="emma" />
    	<!-- classpath must include test bench jar and its dependencies -->
    	<path id="classpath">
    	        <fileset dir="${com.vaadin.testbench.lib.dir}" includes="**/*.jar" />
    	        <path refid="emma.lib" />
    	</path>
    </target>

	<!-- fileset containing all TestBench tests to run -->
	<fileset dir=".." id="html-test-files">
		<include name="uitest/**/**.html" />
		<exclude name="uitest/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="initialize, remove-temp-testclasses">
		<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 includeantruntime="false" srcdir="${test-output-dir}" destdir="${class-dir}" debug="on" fork="yes" failonerror="false" encoding="UTF8">
			<classpath>
				<path refid="classpath" />
			</classpath>
		</javac>
	</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">
		<fileset dir="${test-output-dir}" id="tests-fileset">
			<include name="**/**.java" />
		</fileset>
		
		<antcontrib:for threadCount="30" parallel="true" keepgoing="true" param="target">
			<path>
				<fileset refid="tests-fileset" />
			</path>
			<sequential>
				<antcall target="execute-tests">
					<param name="target" value="@{target}" />
					<reference refid="classpath" />
				</antcall>
			</sequential>
		</antcontrib: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>
			
			<formatter usefile="false" type="plain"/>

			<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" />

	<!-- Also starts the server. -->
    <target name="test-package">
    	<parallel>
    		<daemons>
    			<ant antfile="vaadin-server.xml" inheritall="true" inheritrefs="true" target="deploy-and-start" />
    		</daemons>
    		<sequential>    			
    			<ant antfile="vaadin-server.xml" target="wait-for-startup" />
    		    <antcall inheritall="true" inheritrefs="true" target="run-and-clean-up" />
    			<move file="${testing.testarea}/${package.name}/war.ec" todir="../build/result" failonerror="false" />
            </sequential>
    	</parallel>
    </target>
</project>