<?xml version="1.0" encoding="UTF-8"?>
<project name="Library" default="usage" basedir=".">

	<target name="usage">
		<echo message="Please refer to the testframework.html in org.eclipse.test for instructions on usage." />
	</target>

	<target name="init">
		<!-- 
			Parameters:
				(Mandatory)
				data-dir		- the directory for Eclipse to write its data
				plugin-name		- the name of the plugin to test
				classname		- the name of the test class
				
				(Optional - overrides defaults set in script)
				vmargs			- a string containing arguments to pass to the VM.
				extraVMargs		- allows separate setting of VM args from separate caller.
				timeout			- overrides default test timeout value (in milliseconds).
				test-output		- overrides default output file produced from test run.
				plugin-path		- path to root of plug-in
				useEclipseExe	- property setting forces test to launch via eclipse executable.
				junit-report-output - output directory for junit reports produced for specified classname.
		-->

		<tstamp>
			<format property="TIMENOW" pattern="HHmmssSSSS" />
		</tstamp>
		<!--property setting useEclipseExe launches tests using the eclipse executable-->
		<condition property="launchTarget" value="eclipse-test">
			<isset property="useEclipseExe" />
		</condition>
		<!--default launch target for launching tests-->
		<property name="launchTarget" value="java-test" />
		<property name="formatter" value="org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter" />

		<!--default heap sizes when running performance tests-->
		<condition property="vmargs" value=" -Xms256M -Xmx512M -XX:MaxPermSize=500m">
			<equals arg1="${test.target}" arg2="performance" />
		</condition>
		<tstamp prefix="NOW" />
		<property name="coverage-output" value="${eclipse-home}/coverage" />
		<property file="${basedir}/finalPluginsVersions.properties" />
		<echo message="basedir = ${basedir}" />
		<condition property="extraVMargs" value="-javaagent:${basedir}/plugins/org.eclipse.test_${org.eclipse.test}/lib/jacocoagent.jar=destfile=${coverage-output}/jacoco${classname}${NOW.DSTAMP}_${NOW.TSTAMP}.exec">
			<not>
				<equals arg1="${test.target}" arg2="performance" />
			</not>
		</condition>
		<property name="extraVMargs" value="" />
		<property name="plugin-path" value="" />
		<property name="timeout" value="7200000" />
		<property name="test-output" value="${eclipse-home}/${classname}.xml" />
		<property name="junit-report-output" value="${eclipse-home}/results" />
		<mkdir dir="${junit-report-output}" />
		<property name="junit-stylesheet" value="${eclipse-home}/dropins/eclipse/plugins/org.eclipse.test/JUNIT.XSL" />
	</target>

	<target name="core-test" description="Eclipse application used to launch HEADLESS plugin tests." depends="init">
		<antcall target="${launchTarget}">
			<param name="application" value="org.eclipse.test.coretestapplication" />
		</antcall>
	</target>

	<target name="ui-test" description="Eclipse application used to launch UI plugin tests." depends="init">
		<antcall target="${launchTarget}">
			<param name="application" value="org.eclipse.test.uitestapplication" />
		</antcall>
	</target>

	<target name="java-test">
		<!--default vm args-->
		<condition property="vmargs" value=" -Xms40m -Xmx384m -XX:MaxPermSize=256m">
			<os family="windows" />
		</condition>
		<property name="vmargs" value=" -Xms40m -Xmx384m -XX:MaxPermSize=256m" />

		<!--set default jvm to use for testing-->
		<property name="jvm" value="${java.home}/bin/java" />

		<echo message="Running ${classname}. Result file: ${junit-report-output}/${classname}.xml." />

		<java fork="true" dir="." timeout="${timeout}" jvm="${jvm}" logError="true" classname="org.eclipse.core.launcher.Main" output="${junit-report-output}/${classname}.txt">
			<classpath>
				<fileset dir="${eclipse-home}/plugins">
					<include name="org.eclipse.equinox.launcher_*.jar" />
				</fileset>
			</classpath>
			<arg line="-application ${application}" />
			<arg line="-data ${data-dir}" />
			<arg line="formatter=${formatter},${test-output}" />
			<arg line="-testPluginName ${plugin-name}" />
			<arg line="-className ${classname}" />
			<arg line="-os ${os}" />
			<arg line="-ws ${ws}" />
			<arg line="-arch ${arch}" />
			<arg line="-consolelog" />
			<arg line="-timeout ${timeout}" />
			<jvmarg line="${vmargs} ${extraVMargs}" />
			<sysproperty key="PLUGIN_PATH" value="${plugin-path}" />
		</java>
		<antcall target="collect-results" />
	</target>

	<target name="eclipse-test" description="Runs the specified classname as a plug-in test.">
		<property name="vmargs" value="-Xms256m -Xmx512m -XX:MaxPermSize=256m" />

		<!--use -consolelog if launching a headless test-->
		<condition property="consolelog" value="-consolelog">
			<equals arg1="${application}" arg2="org.eclipse.test.coretestapplication" />
		</condition>
		<property name="consolelog" value="" />

		<!--
			vm selection priority:
			1.  user-specified java executable via outer Ant property setting of "jvm".
			2.  java executable on path.
		-->
		<condition property="test-vm" value="-vm ${jvm}">
			<isset property="jvm" />
		</condition>
		<property name="test-vm" value="" />

		<!--ensure executable has execute permission-->
		<chmod file="${eclipse-home}/eclipse" perm="ugo+rx" />


		<echo message="Running ${classname}. Result file: ${junit-report-output}/${classname}.xml." />

		<exec executable="${eclipse-home}/eclipse" dir="${eclipse-home}" timeout="${timeout}" logError="true" failonerror="false" output="${junit-report-output}/${classname}.txt">
			<arg line="-data ${data-dir}" />
			<arg line="${test-vm}" />
			<arg line="-application ${application}" />
			<arg line="formatter=${formatter},${test-output}" />
			<arg line="-testPluginName ${plugin-name}" />
			<arg line="-className ${classname}" />
			<arg line="-nosplash" />
			<arg line="--launcher.suppressErrors" />
			<arg line="${consolelog}" />
			<arg line="-vmargs ${vmargs} ${extraVMargs} -DPLUGIN_PATH=${plugin-path}" />
		</exec>
		<antcall target="collect-results" />
	</target>

	<target name="collect-results">
		<dirname property="output-dir" file="${test-output}" />
		<basename property="output-file-name" file="${test-output}" />
		<junitreport todir="${junit-report-output}" tofile="${classname}.xml">
			<fileset dir="${output-dir}">
				<include name="${output-file-name}" />
			</fileset>
		</junitreport>

		<xslt style="${junit-stylesheet}" basedir="${junit-report-output}" includes="${classname}.result.xml" destdir="${junit-report-output}" />

		<!--save .log content and *.log content from configuration directory-->
		<concat destfile="${junit-report-output}/${classname}.log">
			<fileset dir="${eclipse-home}" includes="${data-dir}/.metadata/*.log" />
			<fileset dir="${eclipse-home}" includes="configuration/*.log" />
		</concat>
	</target>

	<target name="collect">
		<!--
			This target can be used to aggragate test runs from multiple test suites into a single report.
		
			Parameters to this target:
			includes		- the names of the files to include
			output-file		- the name of the output file to produce
		-->
		<junitreport todir="." tofile="${output-file}">
			<fileset dir=".">
				<include name="${includes}" />
			</fileset>
		</junitreport>
	</target>

</project>

