<?xml version="1.0" encoding="UTF-8"?>
<!-- 
============================================================================ 
Name        : ats.ant.xml 
Part of     : Helium 

Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved.
This component and the accompanying materials are made available
under the terms of the License "Eclipse Public License v1.0"
which accompanies this distribution, and is available
at the URL "http://www.eclipse.org/legal/epl-v10.html".

Initial Contributors:
Nokia Corporation - initial contribution.

Contributors:

Description:

============================================================================
-->
<project name="_testing.ats" xmlns:hlm="http://www.nokia.com/helium">
    <var name="drop.file.counter" value="0" />
    <description>
        ATS testing targets.
    </description>
    <!-- -->
    <fileset id="reference.ats.flash.images" dir="${release.images.dir}">
        <include name="**/${build.id}*.core.fpsx" />
        <include name="**/${build.id}*.rofs2.fpsx" />
        <include name="**/${build.id}*.rofs3.fpsx" />
        <include name="**/*rnd.C00" />
        <include name="**/*rnd.V01" />
        <include name="**/*.fpsx" />
        <include name="**/*_rnd.fpsx" />
    </fileset>
    <property environment="env" />
    <property name="ats.flashfiles.minlimit" value="2" />

    <fileset id="reference.ats.sis.images" dir="${ats.sis.images.dir}">
        <include name="**/*.sis" />
    </fileset>
    <property name="ats.sisfiles.minlimit" value="1" />

    <!-- 
    The target creates ATSDrop.zip file which also includes test.xml file; and sends the drop to ATS. 
    The layer definition, in system definition file, for tsrc directory should look like:
    <pre>
    <layer name="name_test_layer">
    
        <module name="module_name">
        
            <unit id="unit_id" name="unti_name" bldFile="path_of_tsrc_folder_to_be_built" filter=""/>
            
        </module>
        
    </layer>
    </pre>
    -->

    <target name="ats-test" if="enabled.ats">
        <hlm:filterRecordStartMacro/>
        <runtarget target="copy-mon-sym" />
        <runtarget target="ats-create-drop" />
        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
        <hlm:metadatarecord database="${metadata.dbfile}">
            <hlm:textmetadatainput>
                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
                <metadatafilterset refid="filterset.ats" />
            </hlm:textmetadatainput>
        </hlm:metadatarecord>
        <hlm:generateBuildStatus file="${build.id}_ats.log" />
    </target>

    <!-- The target creates the ATS3drop.zip file including test.xml for ATS ASTE tests. This target is executable.-->

    <target name="ats-aste" if="enabled.aste">
        <hlm:filterRecordStartMacro/>
        <runtarget target="do-ats-aste" />
        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
        <hlm:metadatarecord database="${metadata.dbfile}">
            <hlm:textmetadatainput>
                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
                <metadatafilterset refid="filterset.aste" />
            </hlm:textmetadatainput>
        </hlm:metadatarecord>
        <hlm:generateBuildStatus file="${build.id}_ats.log" />
    </target>

    <!-- The target creates the MATTI_drop.zip file including test.xml for MATTI tests. This target is executable.-->
    <target name="matti-test" if="enabled.matti">
        <hlm:filterRecordStartMacro/>
        <runtarget target="do-ats-matti" />
        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_matti.log" append="false"/>
        <hlm:metadatarecord database="${metadata.dbfile}">
            <hlm:textmetadatainput>
                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_matti.log" />
                <metadatafilterset refid="filterset.matti" />
            </hlm:textmetadatainput>
        </hlm:metadatarecord>
        <hlm:generateBuildStatus file="${build.id}_matti.log" />
    </target>


    <!-- Sends drop file to ATS/ASTE. Please see `ats-test` for description. -->
    <target name="do-ats-test" depends="ats-username, ats-password" unless="skip.ats.sending">
        <!-- Make the drop file visible to ATS3. -->
        <mkdir dir="${ats.drop.location}" />
        <copy file="${ats.drop.file}" tofile="${ats.drop.location.file}" />
        <!-- Notify ATS3 about the drop. -->
        <exec executable="cscript" dir="${build.drive}/" failonerror="false">
            <env key="ats3.username" value="${ats.username}" />
            <env key="ats3.password" value="${ats.password}" />
            <env key="ats3.host" value="${ats.server}" />
            <env key="ats3.pathToDrop" value="${ats.drop.location.file}"/>
            <arg value="${helium.dir}/tools/testing/ats/${ats.wsh.testrun.file}" />
        </exec>
    </target>



    <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
    <target name="ats-set-flash-image-path">
        <pathconvert pathsep="," property="ats.flash.images">
            <fileset refid="reference.ats.flash.images"/>
        </pathconvert>
    </target>

    <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
    <target name="ats-set-sis-flash-image-path">
        <pathconvert pathsep="," property="ats.sis.images">
            <fileset refid="reference.ats.sis.images"/>
        </pathconvert>
    </target>

    <!-- Sets values common for ATS, this is a dependent target and shouldn't be used as an individual target -->
    <target name="ats-common">
        <property name="ats.config.file" value="" />
        <property name="ats.product.hwid" value="" />
        <property name="ats.test.timeout" value="60" />
        <property name="ats.report.location" value="${publish.dir}/${publish.subdir}" />
        <var name="ats.drop.file" value="${build.output.dir}/ats/ATSDrop${drop.file.counter}.zip" />
        <if>
            <isset property="diamonds.build.url" />
            <then>
                <property name="internal.ats.diamonds.arg" value="--diamonds-build-url=http://${diamonds.host}${diamonds.build.id}" />
            </then>
            <else>
                <property name="internal.ats.diamonds.arg" value="" />
            </else>
        </if>
    </target>

    <!-- Sets default values for the ATS (STIF and EUnit), this is a dependent target and shouldn't be used as an individual target -->
    <target name="ats-set-defaults-stifeunit" depends="ats-common,lookup-email">
        <!-- Default values for the properties -->
        <property name="ats.email.list" value="${email.from}" />
        <property name="tsrc.data.dir" value="data" />
        <property name="ats.plan.name" value="plan" />
        <property name="ats.testrun.name" value="${build.id}_${ats.product.name}" />
        <property name="ats.ctc.host" value="" />
        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
            <equals arg1="${ats.script.type}" arg2="import" />
        </condition>
        <!-- if test run file is not explicitly mentioned, default is RunX-->
        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
        <var name="ats.drop.file" value="ATS3Drop${drop.file.counter}.zip" />
        <property name="ats.target.platform" value="armv5 urel" />
        <property name="ats.trace.enabled" value="False" />
        <property name="ats.ctc.enabled" value="False" />
        <property name="ats.multiset.enabled" value="False" />
        <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
        <property name="ats.obey.pkgfiles.rule" value="False" />
    </target>

    <!-- Sets default values for the ASTE, this is a dependent target and shouldn't be used as an individual target -->
    <target name="ats-set-defaults-aste" depends="ats-common">
        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
            <equals arg1="${ats.script.type}" arg2="import" />
        </condition>
        <!-- if test run file is not explicitly mentioned, default is RunX-->
        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
        <property name="ats.aste.test.type" value="smoke" />
        <property name="ats.aste.testasset.caseids" value="100,101,102,103,105,106,107,108,109,110,111,112,113,114,115" />
        <property name="ats.aste.software.version" value="${build.id}" />
        <property name="ats.aste.language" value="English" />
        <property name="ats.aste.software.release" value="${build.name}" />
        <property name="ats.aste.plan.name" value="plan" />
        <property name="ats.aste.testrun.name" value="${build.id}_${ats.product.name}_${major.version}.${minor.version}" />
        <property name="ats.aste.email.list" value="" />
    </target>

    <!-- This macro fetches the tsrc paths from system definition file (layers.sysdef.xml), layer defintion should look like
    <pre>
    <layer name="name_test_layer">
        <module name="module_name">
            <unit id="unit_id" name="unti_name" bldFile="path_of_tsrc_folder_to_be_built" filter="" />
        </module>
    </layer>
    </pre>
    -->
    <scriptdef name="getModuleTsrcMacro" language="jython" uri="http://www.nokia.com/helium">
        <attribute name="property" />
        <attribute name="prefix"/>
        
import os
import re
import sysdef.api
import pathaddition.match
import traceback
## using create-canonical-sysdef-file target, it works and gets tsrc paths

if project.getProperty('canonical.sysdef.file') == None :
    raise Exception("'canonical.sysdef.file' property is not defined")

try:
    sdf = sysdef.api.SystemDefinition(str(project.getProperty('canonical.sysdef.file')))
    
    modules = {}
    paths_list = []
    for la in sdf.layers:
        if re.match(r".*_test_layer$", la):
            try:
                if re.search(r"\b%s\b" % la, project.getProperty('exclude.test.layers')):
                    continue
            except TypeError, exp:
                pass

            layer = sdf.layers[la]
            for mod in layer.modules:
                if mod.name not in modules:
                    modules[mod.name] = []
                for unit in mod.units:
                    include_unit = True
                    if project.getProperty('ido.build.filter') != None:
                        if project.getProperty('ido.build.filter') != "":
                            include_unit = False
                            if hasattr(unit, 'filters'):
                                if len(unit.filters) > 0:
                                    for filter in unit.filters:
                                        if re.search(r"\b%s\b" % filter, project.getProperty('ido.build.filter')):
                                            include_unit = True
                                        else:
                                            include_unit = False
                                elif len(unit.filters) == 0:
                                    include_unit = True
                            else:
                                include_unit = False
                        else:
                            include_unit = False
                            if hasattr(unit, 'filters'):                            
                                if len(unit.filters) == 0:
                                    include_unit = True
                    if include_unit:
                        #if pathaddition.match.ant_match(unit.path, "**/tsrc/**", False):
                        modules[mod.name].append(os.path.join(project.getProperty('build.drive') + os.sep, unit.path))
                        #else:
                        #    project.log('tcrc not found in ' + str(unit.path))

            #substituting paths in the modules dictionary from path list using keys
            for name in modules.keys():
                if not modules[name] == []:
                    project.setProperty(str("%s.%s" % (attributes.get('prefix'), name)), str(" ".join(modules[name])))
                else:
                    del modules[name]

            project.setProperty(str(attributes.get('property')), str(",".join(modules.keys())))
            
except Exception, e:
    traceback.print_exc()
    project.log("ERROR: could not generate tsrc path list. %s" % e)
    </scriptdef>

    <!-- The target is dependent on "ats-test", should not be called individually. The target creates the ATS3drop.zip file including test:xml file -->
    <target name="ats-create-drop" depends="create-canonical-sysdef-file, ats-set-flash-image-path">
        <var name="ats.drop.location.file" value="${ats.drop.location}/ATS3Drop${drop.file.counter}.zip" />
        <mkdir dir="${build.output.dir}/ats" />
        <hlm:getModuleTsrcMacro property="module.list" prefix="module.tsrc" />
        <if>
            <scriptcondition language="beanshell">
                <![CDATA[
                    String value = project.getProperty("module.list");
                    if (value != null) {
                        String[] out = value.split(",");
                        if ((out == null) || (out.length == 0) || ((out.length == 1) && (out[0].length()==0))) {
                                    self.setValue(true);
                            } else {
                                    self.setValue(false);
                            }
                        } else {
                            self.log("Error: module.list not defined.");
                                self.setValue(true);
                        }
                            ]]>
            </scriptcondition>
            <then>
                <echo message="Error: No test modules found!" />
            </then>
            <elseif>
                <scriptcondition language="beanshell">
                    <![CDATA[
                        String flashfiles = project.getProperty("ats.flash.images");
                        String value = project.getProperty("ats.flashfiles.minlimit");
                        if (flashfiles != null && value != null) {
                            int cond = Integer.valueOf(value).intValue();
                            String[] out = flashfiles.split(",");
                            if (out.length < cond ) {
                                self.setValue(true);
                            } else {
                                self.setValue(false);
                            }
                        } else {
                            self.log("Error: flashfiles not defined.");
                            self.setValue(true);
                        }
                            ]]>
                </scriptcondition>
                <then>
                    <echo message="Error: Not enough flash files!" />
                </then>
            </elseif>
            <else>
                <for list="${module.list}" delimiter="," param="module">
                    <sequential>
                        <runtarget target="ats-set-defaults-stifeunit" />
                        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop${drop.file.counter}.zip" />
                        <echo>${ats.drop.file}</echo>
                        <exec executable="python">
                            <arg value="${helium.dir}/tools/common/python/lib/ats3/__init__.py" />
                            <arg value="--device-type=${ats.product.name}" />
                            <arg value="--device-hwid=${ats.product.hwid}" />
                            <arg value="${internal.ats.diamonds.arg}" />
                            <arg value="--drop-file=${ats.drop.file}" />
                            <arg value="--report-email=${ats.email.list}" />
                            <arg value="--plan-name=${ats.plan.name}" />
                            <arg value="--testrun-name=${ats.testrun.name}_@{module}" />
                            <arg value="--flash-images=${ats.flash.images}" />
                            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
                            <arg value="--target-platform=${ats.target.platform}" />
                            <arg value="--data-dir=${tsrc.data.dir}" />
                            <arg value="--test-timeout=${ats.test.timeout}" />
                            <arg value="--build-drive=${build.drive}" />
                            <arg value="--trace-enabled=${ats.trace.enabled}" />
                            <arg value="--ctc-enabled=${ats.ctc.enabled}" />
                            <arg value="--multiset-enabled=${ats.multiset.enabled}" />
                            <arg value="--file-store=${ats.report.location}" />
                            <arg value="--eunitexerunner-flags=${eunitexerunner.flags}" />
                            <arg value="--ats-network-drive=${ats.ctc.host}#${ats.drop.file}" />
                            <arg value="--monsym-files=${ats.ctc.monsyms}" />
                            <arg value="--config=${ats.config.file}" />
                            <arg value="--obey-pkgfiles=${ats.obey.pkgfiles.rule}" />
                            <arg value="--verbose" />
                            <arg line="${module.tsrc.@{module}}" />
                        </exec>
                        <runtarget target="do-ats-test" />
                        <math result="drop.file.counter" operand1="1" operation="+" operand2="${drop.file.counter}" datatype="int" />
                    </sequential>
                </for>
            </else>
        </if>
    </target>


    <!-- Please see ats-aste for description.-->
    <target name="do-ats-aste" depends="ats-set-flash-image-path, ats-set-defaults-aste" if="enabled.aste">

        <mkdir dir="${build.output.dir}/ats" />
        <if>
            <scriptcondition language="beanshell">
                <![CDATA[
                String flashfiles = project.getProperty("ats.flash.images");
                String value = project.getProperty("ats.flashfiles.minlimit");
                if (flashfiles != null && value != null) {
                    int cond = Integer.valueOf(value).intValue();
                    String[] out = flashfiles.split(",");
                    if (out.length < cond ) {
                        self.setValue(true);
                    } else {
                            self.setValue(false);
                    }
                } else {
                    self.log("Error: flashfiles not defined.");
                    self.setValue(true);
                }
                    ]]>
            </scriptcondition>
            <then>
                <echo message="Error: Not enough flash files!" />
            </then>
            <else>
                <exec executable="python">
                    <arg value="${helium.dir}/tools/common/python/lib/ats3/aste.py" />
                    <arg value="--report-email=${ats.aste.email.list}" />
                    <arg value="--device-type=${ats.product.name}" />
                    <arg value="--flash-images=${ats.flash.images}" />
                    <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
                    <arg value="--plan-name=${ats.aste.plan.name}" />
                    <arg value="--testrun-name=${ats.aste.testrun.name}" />
                    <arg value="--device-hwid=${ats.product.hwid}" />
                    <arg value="--test-timeout=${ats.test.timeout}" />
                    <arg value="--build-drive=${build.drive}" />
                    <arg value="${internal.ats.diamonds.arg}" />
                    <arg value="--drop-file=${ats.drop.file}" />
                    <arg value="--test-type=${ats.aste.test.type}" />
                    <arg value="--testasset-location=${ats.aste.testasset.location}" />
                    <arg value="--testasset-caseids=${ats.aste.testasset.caseids}" />
                    <arg value="--software-version=${ats.aste.software.version}" />
                    <arg value="--device-language=${ats.aste.language}" />
                    <arg value="--software-release=${ats.aste.software.release}" />
                    <arg value="--verbose" />
                </exec>
                <runtarget target="do-ats-test" />
            </else>
        </if>
    </target>

    <!--
        This target search the mon.sym files using unit information from the canonical sysdef file.
        Then it copies the discovered files under the ftp server defined by ats.ctc.host.
        The target url is: ftp ://[server]/ctc_helium/[diamonds_id]/mon_syms/[id]/mon.sym 
    -->
    <target name="copy-mon-sym" if="ats.ctc.enabled">
        <fmpp sourceFile="${helium.dir}/tools/testing/ats/templates/monsym-file-list.txt.ftl"
            outputFile="${temp.build.dir}/monsym-file-list.txt">
            <data expandProperties="yes">
                data: xml(${canonical.sysdef.file})
                ant: antProperties()
            </data>
        </fmpp>
        <hlm:path2file reference="mon.sym.list" file="${temp.build.dir}/monsym-file-list.txt" />
        <script language="jython">
import os
import ctc

if not project.getProperty('ats.ctc.host'):
    raise Exception('ats.ctc.host property is not defined.')
if not project.getProperty('diamonds.build.id'):
    raise Exception('diamonds.build.id property is not defined.')

server = project.getProperty('ats.ctc.host')
diamondsid = os.path.basename(os.path.dirname(project.getProperty('diamonds.build.id')))
path = project.getReference('mon.sym.list')
if not path:
    raise Exception('mon.sym.list reference has not been set')

uploader = ctc.MonSymFTPUploader(server, path.list(), diamondsid)
monsyms = uploader.upload()
            
# Using ; to separate the path because the target script is running on windows
project.setNewProperty('ats.ctc.monsyms', ';'.join([ "//%s/%s" % (server, x) for x in monsyms]))
        </script>
        <echo>ats.ctc.monsyms: ${ats.ctc.monsyms}</echo>
    </target>

    <!-- a dependant target please do not call directly use matti-test,
    target calls the MATTI script that creates the MATTI_drop.zip file and runs the tests
    listed in test.rb.  ats-set-flash-image-path and ats-set-sis-flash-image-path look for lists of files-->
    <target name="do-ats-matti" depends="ats-set-flash-image-path, ats-set-sis-flash-image-path" >
        <runtarget target="ats-set-defaults-stifeunit" />
        <!--need to set theseup for use by do-ats-test target-->
        <mkdir dir="${build.output.dir}/ats" />
        <var name="ats.drop.location" value="${build.output.dir}/ats" />
        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop.zip" />
        <var name="ats.drop.location.file" value="${ats.drop.file}" />
        <if>
            <!-- get the list of .fpsx files (and others) in the defined folder
             to pass as a list to the python script-->
            <scriptcondition language="beanshell">
                <![CDATA[
                    String flashfiles = project.getProperty("ats.flash.images");
                    String value = project.getProperty("ats.flashfiles.minlimit");
                    if (flashfiles != null && value != null) {
                        int cond = Integer.valueOf(value).intValue();
                        String[] out = flashfiles.split(",");
                        if (out.length < cond ) {
                            self.setValue(true);
                        } else {
                            self.setValue(false);
                        }
                    } else {
                        self.log("Error: flashfiles not defined.");
                        self.setValue(true);
                    }
                        ]]>
            </scriptcondition>
            <then>
                <echo message="Error: Not enough flash files!" />
            </then>
            <else>
                <if>
                    <!-- get the list of .sis files in the defined folder to pass as a list to the python script-->
                    <scriptcondition language="beanshell">
                        <![CDATA[
                            String sisfiles = project.getProperty("ats.sis.images");
                            String value = project.getProperty("ats.sisfiles.minlimit");
                            if (sisfiles != null && value != null) {
                                int cond = Integer.valueOf(value).intValue();
                                String[] out = sisfiles.split(",");
                                if (out.length < cond ) {
                                    self.setValue(true);
                                } else {
                                    self.setValue(false);
                                }
                            } else {
                                self.log("Error: sisfiles not defined.");
                                self.setValue(true);
                            }
                                ]]>
                    </scriptcondition>
                    <then>
                        <echo message="Error: Not enough sis files!" />
                    </then>
                    <else>
                        <!-- execute the MattiDrops.py script with parameters-->
                        <exec executable="python" resultproperty="script.response">
                            <arg value="${helium.dir}/tools/common/python/lib/ats3/matti/MattiDrops.py" />
                            <arg value="--build-drive=${build.drive}" />
                            <arg value="--matti-scripts=${matti.scripts}" />
                            <arg value="--flash-images=${ats.flash.images}" />
                            <arg value="--harness=STIF" />
                            <arg value="--file-store=${ats.output.dir}" />
                            <arg value="--testrun-name=${ats.testrun.name}" />
                            <arg value="--device-type=${ats.product.name}" />
                            <arg value="--device-hwid=${ats.product.hwid}" />
                            <arg value="--diamonds-build-url=${internal.ats.diamonds.arg}" />
                            <arg value="--drop-file=${ats.drop.file}" />
                            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
                            <arg value="--plan-name=${ats.plan.name}" />
                            <arg value="--sis-files=${ats.sis.images}" />
                            <arg value="--template-loc=${template.file}" />
                        </exec>
                        <if> 
                            <not>
                                <!-- if the response is not 0 then need to create the skip.ats.sending
                                 flag so that do-ats-test is not run-->
                                <equals arg1="${script.response}" arg2="0" />
                            </not>
                            <then>
                                <property name="skip.ats.sending" value="1" />
                            </then>
                        </if>
                        <runtarget target="do-ats-test" />
                    </else>
                </if>    
            </else>
        </if>    
    </target>
    
</project>
