<?xml version="1.0"?>

<project xmlns:antcontrib="antlib:net.sf.antcontrib" xmlns:ivy="antlib:org.apache.ivy.ant" name="Vaadin Integration Tests" basedir="." default="integration-test-all">

    <!-- Import common targets -->
    <import file="../common.xml" />
    <dirname file="${ant.file.Vaadin Integration Tests}" property="integration_test.dir" />

    <!-- Target deploying demo.war -->
    <fail unless="test.integration.server" message="test.integration.server must be set for integration tests to run" />

    <fail unless="test.integration.user" message="test.integration.user must be set for integration tests to run" />
    <fail unless="test.integration.antfile" message="test.integration.antfile must be set for integration tests to run" />

    <!-- Test with these browsers -->
    <property name="test_browsers" value="winxp-firefox17-esr" />

    <!-- Path to key file. Default value -->
    <property name="sshkey.file" value="id_dsa" />

    <!-- path and name for demo.war to be deployed -->
    <property name="demo.war" value="demo.war" />

    <!-- Host running Testbench RC or Testbench Hub. Default value -->
    <property name="com.vaadin.testbench.tester.host" value="127.0.0.1" />

    <!-- Base url where the testable application is deployed -->
    <property name="deployment.url" value="http://${test.integration.server}:8080" />

    <!-- TestBench license parameter -->
    <property name="vaadin.testbench.developer.license" value="" />

    <property name="report.dir" location="${integration_test.dir}/result/reports-integration" />

    <!-- ssh host values -->
    <property name="ant.hub" value="${test.integration.antfile}" />
    <property name="user" value="${test.integration.user}" />
    <property name="passphrase" value="" />

    <ivy:resolve file="ivy.xml" conf="build, build-provided" />
    <ivy:cachepath pathid="classpath.tb3.lib" conf="build, build-provided" />
    <path id="classpath.tb3">
        <path refid="classpath.tb3.lib" />
        <path location="result/classes" />
    </path>

    <!-- Upload war to deploy to ssh host -->
    <target name="integration-test-upload-demo">
        <scp file="${demo.war}" todir="${user}@${test.integration.server}:integration-tests/servers/demo.war" keyfile="${sshkey.file}" passphrase="${passphrase}" />
    </target>

    <!-- Run basic integration test test -->
    <target name="legacy-integration-test">
        <fail unless="testfiles" message="You need to specify the files to run using the 'testfiles' property" />
        <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
            <property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
            <property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
            <property name="com.vaadin.testbench.deployment.url" value="${deployment.url}" />
            <property name="server.start.succeeded" value="1" />
            <property name="browsers" value="${test_browsers}" />
            <property name="testfiles" value="${testfiles}" />
            <property name="test-output-dir" value="${integration_test.dir}/result/integration-test-output/${server-name}" />
            <property name="retries" value="0" />
            <property name="report.qualifier" value="integration-tb2/${server-name}" />

            <fileset dir="." includes="test.xml" />
        </subant>
    </target>

    <target name="integration-test-theme">
        <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
            <property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
            <property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
            <property name="com.vaadin.testbench.deployment.url" value="${deployment.url}" />
            <property name="server.start.succeeded" value="1" />
            <property name="testfiles" value="${testfiles-theme}" />
            <property name="test-output-dir" value="${integration_test.dir}/result/integration-test-output/${server-name}" />
            <property name="report.qualifier" value="integration-theme-tb2/${server-name}" />

            <fileset dir="." includes="test.xml" />
        </subant>
    </target>

    <!-- Run integration test on GAE -->
    <target name="integration-test-test-GAE">
        <fileset dir="integration-testscripts" id="html-test-files" includes="GoogleAppEngine/integration-test-GAE.html" />
        <pathconvert pathsep=" " property="test-GAE" refid="html-test-files" />

        <subant target="run-tb2-tests" failonerror="false" antfile="test.xml">
            <property name="com.vaadin.testbench.lib.dir" value="${com.vaadin.testbench.lib.dir}" />
            <property name="com.vaadin.testbench.tester.host" value="${com.vaadin.testbench.tester.host}" />
            <property name="com.vaadin.testbench.deployment.url" value="http://vaadin-integration-test.appspot.com/" />
            <property name="server.start.succeeded" value="1" />
            <property name="browsers" value="${test_browsers}" />
            <property name="testfiles" value="${test-GAE}" />
            <property name="test-output-dir" value="../build/integration-test-gae-output" />
            <property name="report.qualifier" value="integration-gae-tb2/${server-name}" />

            <fileset dir="." includes="test.xml" />
        </subant>
    </target>

    <target name="integration-test-deploy-to-GAE">
        <sshexec host="${test.integration.server}" username="${user}" keyfile="${sshkey.file}" command="ant -f ${ant.hub} deploy-to-GAE" />
    </target>

    <target name="run-tb3-servlet-test">
        <antcall target="run-tb3-test" inheritall="true">
            <param name="junit.test.suite" value="com.vaadin.tests.tb3.ServletIntegrationTests" />
        </antcall>
    </target>
    <target name="run-tb3-test">
        <fail unless="server-name" message="Server name must be defined in server-name" />
        <fail unless="deployment.url" message="Deplyoment url must be defined in deployment.url" />
        <fail unless="com.vaadin.testbench.screenshot.directory" message="Screenshot directory must be defined in com.vaadin.testbench.screenshot.directory" />
	<property name="server.report.dir" location="${report.dir}/integration-test-tb3/${server-name}" />
         <!-- The junit task does not create the report dir... -->
        <mkdir dir="${server.report.dir}" />

        <junit showoutput="no" printsummary="no" fork="yes">
            <formatter type="xml" />
            <classpath refid="classpath.tb3" />

            <jvmarg value="-Dcom.vaadin.testbench.screenshot.directory=${com.vaadin.testbench.screenshot.directory}" />
            <jvmarg value="-Ddeployment.url=${deployment.url}" />
            <jvmarg value="-Dserver-name=${server-name}" />
            <jvmarg value="-Djava.awt.headless=true" />
            <jvmarg value="-Ddemo.war=${demo.war}" />
            <jvmarg value="-Dvaadin.testbench.developer.license=${vaadin.testbench.developer.license}" />
            <test name="${junit.test.suite}" todir="${server.report.dir}" />
        </junit>
    </target>

    <target name="integration-test-tomcat7">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="tomcat7" />
        </antcall>
    </target>
    <target name="integration-test-tomcat7apacheproxy">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="tomcat7apacheproxy" />
        </antcall>
    </target>
    <target name="integration-test-tomcat8">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="tomcat8" />
        </antcall>
    </target>

    <target name="integration-test-osgi">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="osgi" />
        </antcall>
    </target>

    <target name="integration-test-tomcat6">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="tomcat6" />
        </antcall>
    </target>

    <target name="integration-test-jetty7">
        <antcall target="run-generic-integration-test">
            <param name="target-server" value="jetty7" />
        </antcall>
    </target>

    <target name="integration-test-jetty8">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="300" />
            <param name="target-server" value="jetty8" />
        </antcall>
    </target>

    <target name="integration-test-jetty9">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="300" />
            <param name="target-server" value="jetty9" />
        </antcall>
    </target>

    <target name="integration-test-jboss4">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="jboss4" />
        </antcall>
    </target>

    <target name="integration-test-jboss5">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="jboss5" />
        </antcall>
    </target>

    <target name="integration-test-jboss6">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="jboss6" />
        </antcall>
    </target>

    <target name="integration-test-jboss7">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="jboss7" />
        </antcall>
    </target>

    <target name="integration-test-jboss-eap6">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="jbosseap6" />
        </antcall>
    </target>
    <target name="integration-test-wildfly8">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="wildfly8" />
        </antcall>
    </target>

    <target name="integration-test-glassfish3">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="glassfish3" />
        </antcall>
    </target>
    <target name="integration-test-glassfish4">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="10" />
            <param name="target-server" value="glassfish4" />
        </antcall>
    </target>


    <target name="integration-test-liferay6">
        <fileset dir="integration-testscripts" id="html-test-files" includes="Liferay-6/integration-test-liferay-6.0.5.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-firefox17-esr" />
            <param name="target-server" value="liferay6" />
        </antcall>
    </target>

    <target name="integration-test-liferay6-theme">
        <fileset dir="integration-testscripts" id="html-test-files" includes="Liferay-6/Liferay6-and-6EE-theme-deploy.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

        <fileset dir="integration-testscripts" id="html-theme-files" includes="Liferay-6/Liferay6-theme.html" />
        <pathconvert pathsep=" " property="testfiles-theme" refid="html-theme-files" />


        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-firefox17-esr" />
            <param name="target-server" value="liferay6" />
        </antcall>
    </target>

    <target name="integration-test-liferay5">
        <fileset dir="integration-testscripts" id="html-test-files" includes="Liferay-5/integration-test-liferay-5.2.3-portlet2.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-firefox17-esr" />
            <param name="target-server" value="liferay5" />
        </antcall>
    </target>

    <target name="integration-test-liferay6ee">
        <fileset dir="integration-testscripts" id="html-test-files" includes="Liferay-6EE/integration-test-liferay-6ee.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-firefox17-esr" />
            <param name="target-server" value="liferay6ee" />
        </antcall>
    </target>

    <target name="integration-test-liferay6ee-theme">
        <fileset dir="integration-testscripts" id="html-test-files" includes="Liferay-6/Liferay6-and-6EE-theme-deploy.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />

        <fileset dir="integration-testscripts" id="html-theme-files" includes="Liferay-6EE/Liferay6EE-theme.html" />
        <pathconvert pathsep=" " property="testfiles-theme" refid="html-theme-files" />

        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-firefox17-esr" />
            <param name="target-server" value="liferay6ee" />
        </antcall>
    </target>

    <target name="integration-test-gatein3">
        <fileset dir="integration-testscripts" id="html-test-files" includes="GateIn-3/integration-test-GateIn-3.1.0-portlet2.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="test_browsers" value="winxp-googlechrome21" />
            <param name="target-server" value="gatein3" />
        </antcall>
    </target>

    <target name="integration-test-websphere8">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="target-port" value="9080" />
            <param name="target-server" value="websphere8" />
        </antcall>
    </target>

    <target name="integration-test-websphereportal8">
      <concat>##teamcity[testStarted name='websphereportal8' flowId='websphereportal8']</concat>
      <antcall target="run-tb3-test" inheritall="true">
            <param name="junit.test.suite" value="com.vaadin.tests.integration.WebSpherePortalIntegrationTest" />
            <param name="server-name" value="websphereportal8" />

            <!-- Fill out dummy values for params required by run-tb3-test target -->
            <param name="test.integration.server" value="" />
            <param name="test.integration.user" value="" />
            <param name="test.integration.antfile" value="" />
        </antcall>
        <concat>##teamcity[testFinished name='websphereportal8' flowId='websphereportal8']"</concat>
    </target>

    <target name="integration-test-weblogic10">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="target-port" value="7001" />
            <param name="target-server" value="weblogic10" />
        </antcall>
    </target>

    <target name="integration-test-weblogic12">
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="target-port" value="7001" />
            <param name="target-server" value="weblogic12" />
        </antcall>
    </target>


    <target name="integration-test-weblogicPortal">
        <fileset dir="integration-testscripts" id="html-test-files" includes="weblogic-portal/integration-test-WebLogic-Portal-10.3.2-portlet2.html" />
        <pathconvert pathsep=" " property="testfiles" refid="html-test-files" />
        <antcall target="run-generic-integration-test">
            <param name="startDelay" value="600" />
            <param name="target-port" value="7001" />
            <param name="target-server" value="weblogicportal" />
        </antcall>
    </target>

    <target name="integration-test-GAE">
        <antcall target="integration-test-deploy-to-GAE" />
        <antcall target="integration-test-test-GAE" />
    </target>

    <!-- Upload demo, clean error screenshots and test deployment on all
        servers -->
    <target name="integration-test-all" unless="tests.integration.skip">
        <property name="passphrase" value="${passphrase}" />
        <fail unless="sshkey.file" message="You must define an ssh.keyfile parameter" />
        <fail unless="com.vaadin.testbench.screenshot.directory" message="You must define a com.vaadin.testbench.screenshot.directory parameter" />
        <delete dir="${report.dir}" />
        <mkdir dir="${report.dir}" />

        <parallel>
            <antcontrib:trycatch property="tried">
                <try>
                    <!-- Still running GAE test from the old server which
                    requires its own lock -->

                    <echo message="Getting lock" />
                    <antcall target="integration-test-get-lock" />
                    <echo message="Got lock" />
                    <antcall target="integration-test-upload-demo" />

                    <antcall target="run-integration-test">
                        <param name="target-server" value="GAE" />
                    </antcall>

                    <antcall target="integration-test-clean" />
                    <echo message="Getting lock" />
                    <antcall target="integration-test-release-lock" />
                    <echo message="Lock released" />

                </try>
                <catch>
                    <echo message="Uploading of demo.war failed. ${tried}" />
                </catch>
            </antcontrib:trycatch>
            <antcall target="integration-test-liferay6" />
            <antcall target="integration-test-liferay6ee" />
            <antcall target="integration-test-liferay6-theme" />
            <antcall target="integration-test-liferay6ee-theme" />
            <antcall target="integration-test-weblogicPortal" />
            <antcall target="integration-test-liferay5" />
            <antcall target="integration-test-weblogic10" />
            <antcall target="integration-test-weblogic12" />
            <antcall target="integration-test-gatein3" />
            <antcall target="integration-test-glassfish3" />
            <antcall target="integration-test-glassfish4" />
            <antcall target="integration-test-jboss4" />
            <antcall target="integration-test-jboss5" />
            <antcall target="integration-test-jboss6" />
            <antcall target="integration-test-jboss7" />
            <antcall target="integration-test-jboss-eap6" />
            <antcall target="integration-test-wildfly8" />
            <antcall target="integration-test-jetty7" />
            <antcall target="integration-test-jetty8" />
            <antcall target="integration-test-jetty9" />
            <antcall target="integration-test-tomcat6" />
            <antcall target="integration-test-tomcat7" />
            <antcall target="integration-test-tomcat8" />
            <antcall target="integration-test-osgi" />
            <antcall target="integration-test-tomcat7apacheproxy" />
            <antcall target="integration-test-websphere8" />
            <antcall target="integration-test-websphereportal8" />
        </parallel>

    </target>

    <target name="do-run-generic-test">
        <property name="target-host" value="${target-server}.devnet.vaadin.com" />
        <property name="target-port" value="8080" />
        <antcontrib:if>
            <isset property="startDelay" />
            <then>
                <antcontrib:math result="sleepTime" datatype="int">
                    <op op="rint">
                        <op op="*">
                            <num value="${startDelay}" />
                            <op op="random" />
                        </op>
                    </op>
                </antcontrib:math>
                <echo>Delaying startup of ${target-server} with ${sleepTime} seconds</echo>
                <sleep seconds="${sleepTime}" />
            </then>
        </antcontrib:if>

        <scp todir="${user}@${target-host}:." keyfile="${sshkey.file}" trust="yes" passphrase="${passphrase}">
            <fileset dir="integration_base_files">
                <include name="*" />
            </fileset>
        </scp>

        <!-- trycatch probably not needed any more as it just fails with
            the original message and doesn't do anything in the finally block -->
        <antcontrib:trycatch property="error_message">
            <try>
                <!-- timeout in one hour (remote end should timeout in 55
                    minutes) -->
                <sshexec host="${target-host}" outputproperty="lock-output" timeout="3600000" username="${user}" keyfile="${sshkey.file}" trust="yes" command="chmod +x *.sh; ant -f deploy.xml get-lock" />
                <antcall target="echo-prefix">
                    <param name="prefix" value="${target-server}: " />
                    <param name="message" value="${lock-output}" />
                </antcall>

                <scp file="${demo.war}" todir="${user}@${target-host}:demo.war" keyfile="${sshkey.file}" trust="yes" passphrase="${passphrase}" />

                <!-- timeout in 15 minutes -->
                <sshexec host="${target-host}" outputproperty="start-output" timeout="900000" username="${user}" keyfile="${sshkey.file}" trust="yes" command="ant -f deploy.xml startup-and-deploy" failonerror="false" />
                <antcall target="echo-prefix">
                    <param name="prefix" value="${target-server}: " />
                    <param name="message" value="${start-output}" />
                </antcall>

                <fail message="${start-output}">
                    <condition>
                        <not>
                            <contains string="${start-output}" substring="Demo deployed successfully" />
                        </not>
                    </condition>
                </fail>

                <antcontrib:if>
                    <isset property="testfiles" />
                    <antcontrib:then>
                        <echo>Starting legacy (TB2) test for ${target-server}</echo>
                        <antcall target="legacy-integration-test">
                            <param name="server-name" value="${target-server}" />
                            <param name="deployment.url" value="http://${target-host}:${target-port}" />
                        </antcall>
                    </antcontrib:then>
                    <antcontrib:else>
                        <echo>Starting TB3 test for ${target-server}</echo>
                        <antcall target="run-tb3-servlet-test">
                            <param name="server-name" value="${target-server}" />
                            <param name="deployment.url" value="http://${target-host}:${target-port}" />
                        </antcall>
                    </antcontrib:else>
                </antcontrib:if>

                <!-- Run theme tests in all browsers if there's a property
                    with the test files -->
                <antcontrib:if>
                    <isset property="testfiles-theme" />
                    <antcontrib:then>
                        <antcall target="integration-test-theme">
                            <param name="server-name" value="${target-server}" />
                            <param name="deployment.url" value="http://${target-host}:${target-port}" />
                        </antcall>
                    </antcontrib:then>
                </antcontrib:if>

                <!-- timeout in five minutes -->
                <sshexec host="${target-host}" outputproperty="stop-output" timeout="600000" username="${user}" keyfile="${sshkey.file}" trust="yes" command="ant -f deploy.xml shutdown-and-cleanup" failonerror="false" />
                <antcall target="echo-prefix">
                    <param name="prefix" value="${target-server}: " />
                    <param name="message" value="${stop-output}" />
                </antcall>
            </try>
            <catch>
                <fail message="${error_message}" />
            </catch>
        </antcontrib:trycatch>
    </target>

    <target name="echo-prefix">
        <antcontrib:propertyregex property="message-prefixed" input="${prefix}${message}" regexp="\n" replace="\0${prefix}" global="true" defaultValue="${prefix}${message}" />
        <echo message="${message-prefixed}" />
    </target>

    <target name="run-generic-integration-test">
        <concat>##teamcity[testStarted name='${target-server}' flowId='${target-server}']</concat>
        <antcontrib:trycatch property="tried">
            <try>
                <antcall target="do-run-generic-test" />
            </try>
            <catch>
                <antcontrib:antcallback target="teamcity-escape" return="tried-escaped">
                    <param name="returnTo" value="tried-escaped" />
                    <param name="message" value="${tried}" />
                </antcontrib:antcallback>
                <concat>##teamcity[testFailed name='${target-server}' flowId='${target-server}' message='Integration test for ${target-server} failed.' details='${tried-escaped}']</concat>
            </catch>
        </antcontrib:trycatch>
        <concat>##teamcity[testFinished name='${target-server}' flowId='${target-server}']"</concat>
    </target>

    <target name="teamcity-escape">
        <property name="returnTo" value="return" />

        <!-- Should also perform other escaping (\u0085, \u2028 and \u2029)
            - see http://confluence.jetbrains.net/display/TCD65/Build+Script+Interaction+with+TeamCity -->
        <!-- Immutable properties -> needs to create a new one every time -->
        <antcontrib:propertyregex property="details-escaped1" input="${message}" regexp="['|\[\]]" replace="|\0" global="true" defaultValue="${message}" />
        <antcontrib:propertyregex property="details-escaped2" input="${details-escaped1}" regexp="\n" replace="|n" global="true" defaultValue="${details-escaped1}" />
        <antcontrib:propertyregex property="details-escaped3" input="${details-escaped2}" regexp="\r" replace="|r" global="true" defaultValue="${details-escaped2}" />

        <property name="${returnTo}" value="${details-escaped3}" />
    </target>

    <target name="run-integration-test">
        <concat>##teamcity[testStarted name='${target-server}' flowId='${target-server}']</concat>
        <antcontrib:trycatch property="tried">
            <try>
                <antcall target="integration-test-${target-server}" />
            </try>
            <catch>
                <antcallback target="teamcity-escape" return="tried-escaped">
                    <param name="returnTo" value="tried-escaped" />
                    <param name="message" value="${tried}" />
                </antcallback>
                <concat>##teamcity[testFailed name='${target-server}' flowId='${target-server}' message='Integration test for ${target-server} failed.' details='${tried-escaped}']"</concat>
            </catch>
        </antcontrib:trycatch>
        <concat>##teamcity[testFinished name='${target-server}' flowId='${target-server}']"</concat>
    </target>

    <target name="integration-test-get-lock">
        <sshexec host="${test.integration.server}" username="${user}" keyfile="${sshkey.file}" command="ant -f ${ant.hub} get-lock" />
    </target>

    <target name="integration-test-release-lock">
        <sshexec host="${test.integration.server}" username="${user}" keyfile="${sshkey.file}" command="ant -f ${ant.hub} release-lock" />
    </target>

    <!-- Remove demo.war -->
    <target name="integration-test-clean">
        <sshexec host="${test.integration.server}" username="${user}" keyfile="${sshkey.file}" command="ant -f ${ant.hub} clean" />
    </target>
</project>