<!-- Copyright (c) 2011, 2018 IBM Corporation and others. 

  This program and the accompanying materials are made available under the
  terms of the Eclipse Public License 2.0 which accompanies this distribution,
  https://www.eclipse.org/legal/epl-2.0/

  SPDX-License-Identifier: EPL-2.0.

  Contributors:
  IBM Corporation - initial API and implementation
-->

<!--
  this script is invoked by the build, on the build machine,
  to signify to hudson "the build is done", pass a few parameters,
  then let Hudson take over.

    wget - -no-verbose -O invokeTestsJSON.xml http://git.eclipse.org/c/platform/eclipse.platform.releng.eclipsebuilder.git/plain/invokeTestsJSON.xml?h=master 2>&1;

-->

<project
  name="Hudson-Tests"
  default="runTests"
  basedir=".">

  <target
    name="runTests"
    depends="init">
    <echo message="== Properties in invokeTestsJSON.xml" />
    <echo message="buildId: ${buildId} " />
    <echo message="eclipseStream: ${eclipseStream}" />
    <echo message="eclipseStreamMajor: ${eclipseStreamMajor}" />
    <echo message="eclipseStreamMinor: ${eclipseStreamMinor}" />
    <echo message="buildType: ${buildType}" />
    <echo message="EBUILDER_HASH: ${EBUILDER_HASH}" />
    <antcall target="JUnitTests" />
    <antcall target="PerfTests" />
  </target>


  <target
    name="JUnitTests"
    depends="init">

    <!--
      currently we test on three platforms.
      So, three parallel calls since on different machines (and Hudson queues).
      TODO: Can these be called, in parallel via callant (or, perhaps subant?
      for greater flexibility in what to test?)
    -->

    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-win32-java8" />
    </antcall>

    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-mac64-java8" />
    </antcall>

    <!--
      currently we test on four platforms.
      These GTK3 tests are "just like the others", except the URL to "send it to" differs.
    -->
    
    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-cen64-gtk3-java8" />
    </antcall>

    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-cen64-gtk3-java11" />
    </antcall>

    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-cen64-gtk3-java12" />
    </antcall>
    
    <antcall target="triggerHudsonTests">
      <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-cen64-gtk3-java13" />
    </antcall>

    </target>
  
  <target
    name="PerfTests"
    depends="init">

    <!--
      currently we test on three platforms.
      So, three parallel calls since on different machines (and Hudson queues).
      TODO: Can these be called, in parrallel via callant (or, perhaps subant?)
      for greater flexibility in what to test?
    -->

      <antcall target="triggerHudsonPerfTests">
        <param
          name="job"
          value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-perf-lin64-baseline" />
      </antcall>
      <!--
        <antcall target="triggerHudsonTests">
        <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-win32" />
        </antcall>

        <antcall target="triggerHudsonTests">
        <param
        name="job"
        value="ep${eclipseStreamMajor}${eclipseStreamMinor}${buildType}-unit-mac64" />
        </antcall>
      -->

  </target>


  <target
    name="triggerHudsonTests"
    depends="init">



    <!--
      baseURL used to be "required parameter" for Hudson job, but seemed overly complicated so
      I compute all this later (based on stream and id) but, I've learned, one disadvantage is this
      restricts test code locations to "downloads". There might be times we want to do from "build"
      locations, or similar. Not to mention, other, internal test systems someday.

      <property
      name="baseURL"
      value="http://download.eclipse.org/eclipse/downloads/${dropsDirSegment}/${buildId}" />
    -->

    <!-- Hudson jobs currently have four required parameters -->
    <property
      name="JSON_buildId"
      value="{&quot;name&quot;:&quot;buildId&quot;,&quot;value&quot;:&quot;${buildId}&quot;}" />
    
    <property
      name="json"
      value="{&quot;parameter&quot;:[${JSON_buildId},${JSON_eclipseStream},${JSON_EBUILDER_HASH}]}" />

    <echo message="env.HUDSON_PROTOCOL: ${env.HUDSON_PROTOCOL}" />
    <echo message="env.HUDSON_HOST: ${env.HUDSON_HOST}" />
    <echo message="env.HUDSON_PORT: ${env.HUDSON_PORT}" />
    <echo message="env.HUDSON_ROOT_URI: ${env.HUDSON_ROOT_URI}" />
    <echo message="json for unit curl post: ${json}" />
    <echo message="job: ${job}" />
    <echo message="${env.HUDSON_PROTOCOL}://${env.HUDSON_HOST}:${env.HUDSON_PORT}/${env.HUDSON_ROOT_URI}/job/${job}/buildWithParameters" />

    <exec
      executable="curl"
      resultproperty="rcUnit"
      outputproperty="unitOutput"
      errorproperty="unitErrorOutput">
      <arg line="-X GET" />
      <arg value="${env.HUDSON_PROTOCOL}://${env.HUDSON_HOST}:${env.HUDSON_PORT}/${env.HUDSON_ROOT_URI}/job/${job}/buildWithParameters?token=${env.HUDSON_TOKEN}&amp;buildId=${buildId}" />
      <arg value="--fail" />
    </exec>
    <echo message="DEBUG: rcUnit: ${rcUnit}" />
    <condition property="invocationNotOk">
      <not>
        <equals
          arg1="${rcUnit}"
          arg2="0" />
      </not>
    </condition>
    <!--
       TODO: We could produced a "TEST_ARE_RUNNING_ON" file here too, when rc = 0 .. that is unless="invocationNoOk" 
       and included the URL of build or performance machine tests. 
    -->
    <antcall target="checkInvocation">
      <param
        name="returnCode"
        value="${rcUnit}" />
      <param
        name="job"
        value="${job}" />
      <param
        name="output"
        value="${unitOutput}" />
      <param
        name="errorOutput"
        value="${unitErrorOutput}" />
    </antcall>
  </target>

  <target
    name="triggerHudsonWinTests"
    depends="init">
    <!--
      baseURL used to be "required parameter" for Hudson job, but seemed overly complicated so
      I compute all this later (based on stream and id) but, I've learned, one disadvantage is this
      restricts test code locations to "downloads". There might be times we want to do from "build"
      locations, or similar. Not to mention, other, internal test systems someday.

      <property
      name="baseURL"
      value="http://download.eclipse.org/eclipse/downloads/${dropsDirSegment}/${buildId}" />
    -->

    <!-- Hudson jobs currently have four required parameters -->
    <property
      name="JSON_buildId"
      value="{&quot;name&quot;:&quot;buildId&quot;,&quot;value&quot;:&quot;${buildId}&quot;}" />
    
    <property
      name="json"
      value="{&quot;parameter&quot;:[${JSON_buildId},${JSON_eclipseStream},${JSON_EBUILDER_HASH}]}" />

    <echo message="env.HUDSON_PROTOCOL: ${env.HUDSON_PROTOCOL}" />
    <echo message="env.HUDSON_HOST: ${env.HUDSON_HOST}" />
    <echo message="env.HUDSON_PORT: ${env.HUDSON_PORT}" />
    <echo message="env.HUDSON_WIN32_ROOT_URI: ${env.HUDSON_WIN32_ROOT_URI}" />
    <echo message="json for unit curl post: ${json}" />
    <echo message="job: ${job}" />
    <echo message="${env.HUDSON_PROTOCOL}://${env.HUDSON_HOST}:${env.HUDSON_PORT}/${env.HUDSON_WIN32_ROOT_URI}/job/${job}/buildWithParameters" />

    <exec
      executable="curl"
      resultproperty="rcUnit"
      outputproperty="unitOutput"
      errorproperty="unitErrorOutput">
      <arg line="-X GET" />
      <arg value="${env.HUDSON_PROTOCOL}://${env.HUDSON_HOST}:${env.HUDSON_PORT}/${env.HUDSON_WIN32_ROOT_URI}/job/${job}/buildWithParameters?token=${env.HUDSON_TOKEN}&amp;buildId=${buildId}" />
      <arg value="--fail" />
    </exec>
    <echo message="DEBUG: rcUnit: ${rcUnit}" />
    <condition property="invocationNotOk">
      <not>
        <equals
          arg1="${rcUnit}"
          arg2="0" />
      </not>
    </condition>
    <!--
       TODO: We could produced a "TEST_ARE_RUNNING_ON" file here too, when rc = 0 .. that is unless="invocationNoOk" 
       and included the URL of build or performance machine tests. 
    -->
    <antcall target="checkInvocation">
      <param
        name="returnCode"
        value="${rcUnit}" />
      <param
        name="job"
        value="${job}" />
      <param
        name="output"
        value="${unitOutput}" />
      <param
        name="errorOutput"
        value="${unitErrorOutput}" />
    </antcall>
  </target>

  <target
    name="checkInvocation"
    if="invocationNotOk">
    <echo
      message="&lt;p&gt;Invocation of Curl did not return 0 return code for ${job}.&lt;br /&gt;${line.separator}"
      file="${postingDirectory}/TEST_INVOCATION_FAILED.html"
      append="true" />
    <echo
      message="   return code was ${returnCode}&lt;br /&gt;${line.separator}"
      file="${postingDirectory}/TEST_INVOCATION_FAILED.html"
      append="true" />
    <echo
      message="   Likely due to Hudson job not being defined (or, possibly network issues).&lt;br /&gt;${line.separator}"
      file="${postingDirectory}/TEST_INVOCATION_FAILED.html"
      append="true" />
    
     <echo
      message="ERROR: Invocation of Curl did not return 0 return code for ${job}." />
    <echo
      message="= = = standard out = = ${line.separator}${output}" />
    <echo
      message="= = = standard err = = ${line.separator}${errorOutput}${line.separator}${line.separator}" />
    <!-- We don't want to fail automatically here, since just one machine may be "offline". -->
    <echo message="Curl invocation failed. See ${postingDirectory}/TEST_INVOCATION_FAILED.html" />
  </target>

  <target
    name="triggerHudsonPerfTests"
    depends="init">

    <!--
      baseURL used to be "required parameter" for Hudson job, but seemed overly complicated so
      I compute all this later (based on stream and id) but, I've learned, one disadvantage is this
      restricts test code locations to "downloads". There might be times we want to do from "build"
      locations, or similar. Not to mention, other, internal test systems someday.

      <property
      name="baseURL"
      value="http://download.eclipse.org/eclipse/downloads/${dropsDirSegment}/${buildId}" />
    -->

    <!-- Hudson jobs currently have 3 required parameters -->
    <property
      name="JSON_buildId"
      value="{&quot;name&quot;:&quot;buildId&quot;,&quot;value&quot;:&quot;${buildId}&quot;}" />
    <property
      name="JSON_eclipseStream"
      value="{&quot;name&quot;:&quot;eclipseStream&quot;,&quot;value&quot;:&quot;${eclipseStream}&quot;}" />
    <property
      name="JSON_EBUILDER_HASH"
      value="{&quot;name&quot;:&quot;EBUILDER_HASH&quot;,&quot;value&quot;:&quot;${EBUILDER_HASH}&quot;}" />

    <property
      name="JSON_defaultTestSuite"
      value="{&quot;name&quot;:&quot;testToRun&quot;,&quot;value&quot;:&quot;selectPerformance&quot;}" />

    <property
      name="json"
      value="{&quot;parameter&quot;:[${JSON_buildId},${JSON_eclipseStream},${JSON_EBUILDER_HASH},${JSON_defaultTestSuite}]}" />

    <!-- TODO: "segment" varies by test, and/or environment ... must be an easier way? -->
    <property
      name="env.LINUX_PERF_SEGMENT"
      value="releng" />

    <echo message="env.HUDSON_PERF_PROTOCOL: ${env.HUDSON_PERF_PROTOCOL}" />
    <echo message="env.HUDSON_PERF_HOST: ${env.HUDSON_PERF_HOST}" />
    <echo message="env.HUDSON_PERF_PORT: ${env.HUDSON_PERF_PORT}" />
    <echo message="json for perf curl post: ${json}" />
    <echo message="${env.HUDSON_PERF_PROTOCOL}://${env.HUDSON_PERF_HOST}:${env.HUDSON_PERF_PORT}/${env.LINUX_PERF_SEGMENT}/job/${job}/build" />

    <exec
      executable="curl"
      resultproperty="rcPerf"      
      outputproperty="perfOutput"
      errorproperty="perfErrorOutput">
      <arg line="-X GET" />
      <arg
        value="${env.HUDSON_PERF_PROTOCOL}://${env.HUDSON_PERF_HOST}:${env.HUDSON_PERF_PORT}/${env.LINUX_PERF_SEGMENT}/job/${job}/buildWithParameters?token=${env.HUDSON_TOKEN}&amp;buildId=${buildId}&amp;eclipseStream=${eclipseStream}&amp;EBUILDER_HASH=${EBUILDER_HASH}" />
      <arg value="--fail" />
    </exec>
    <echo message="DEBUG: rcPerf: ${rcPerf}" />
    <condition property="invocationNotOk">
      <not>
        <equals
          arg1="${rcPerf}"
          arg2="0" />
      </not>
    </condition>
    <antcall target="checkInvocation">
      <param
        name="returnCode"
        value="${rcPerf}" />
      <param
        name="job"
        value="${job}" />
      <param
        name="output"
        value="${perfOutput}" />
      <param
        name="errorOutput"
        value="${perfErrorOutput}" />
    </antcall>
  </target>


  <target
    name="init"
    depends="initStreamVariables"
    unless="invokeTestsJSONinitialized">

    <property environment="env" />
    
    <!-- posting directory should be passed in to us ... but, in case not 
         we will at least define it.
    -->
    <property
      name="postingDirectory"
      value="${basedir}/postingDirectory" />

    <property
      name="env.HUDSON_HOST"
      value="ci.eclipse.org" />
    <property
      name="env.HUDSON_PROTOCOL"
      value="https" />
    <property
      name="env.HUDSON_PORT"
      value="443" />
    <property
      name="env.HUDSON_ROOT_URI"
      value="releng" />
    <property
      name="env.HUDSON_WIN32_ROOT_URI"
      value="shared" />
    <property
      name="env.HUDSON_PERF_HOST"
      value="ci.eclipse.org" />
    <property
      name="env.HUDSON_PERF_PROTOCOL"
      value="https" />
    <property
      name="env.HUDSON_PERF_PORT"
      value="443" />

    <script language="javascript">
          <![CDATA[
            var buildId = project.getProperty("buildId");
            var pattern = new RegExp(/^([IMXYPNSRU])(\d{8})-(\d{4})$/);

            var sArray = pattern.exec(buildId);
            // sArray 0 is "whole match"
            project.setProperty("buildType", sArray[1]);
          ]]>
    </script>
    <echo message="Computed buildType of ${buildType} from ${buildId}" />
    <property
      name="invokeTestsJSONinitialized"
      value="true" />
  </target>

  <target name="initStreamVariables">

    <fail
      unless="eclipseStream"
      message="eclipseStream must be provided by caller" />
    <condition property="streamOK">
      <matches
        pattern="\d+\.\d+\.\d+"
        string="${eclipseStream}" />
    </condition>
    <fail
      message="eclipseStream variable had unexpected format. Should be digit.digit.digit, but was ${eclipseStream}"
      unless="streamOK" />
    <script language="javascript">
          <![CDATA[
            var eclipseStream = project.getProperty("eclipseStream");
            var pattern = new
            RegExp(/(\d+)\.(\d+)\.(\d+)/);

            var sArray = pattern.exec(eclipseStream);
            // sArray[0] is "whole match"
            project.setProperty("eclipseStreamMajor", sArray[1]);
            project.setProperty("eclipseStreamMinor", sArray[2]);
            project.setProperty("eclipseStreamService", sArray[3]);
           ]]>
    </script>

  </target>

</project>
