<?xml version="1.0" encoding="UTF-8"?>
<!-- 
============================================================================ 
Name        : testing.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:

============================================================================
-->
<!--* @package framework -->
<project name="internal.testing" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium"> 
    <description>
        Targets to test Helium itself.
    </description>
    
    <!-- Runs all the unit testing targets. -->
    <target name="unittest" depends="ju-unittest,ant-unittest,py-unittest"/>
    
    <!-- Unit testing -->

    <!-- Setup environment for Python unit tests. -->
    <target name="setup-py-unittest">
        <!-- Autogenerate test data for ArchivePreBuilderTest based on ANT properties -->
        <if>
            <available file="${helium.dir}/tests/data/archive_test.cfg.xml"/>
            <then>
                <delete file="${helium.dir}/tests/data/archive_test.cfg.xml"/>
            </then>
        </if>
        <copy file="${helium.dir}/tests/data/archive_test_input.cfg.xml" tofile="${helium.dir}/tests/data/archive_test.cfg.xml" overwrite="true">
            <filterchain>
                <expandproperties/>
            </filterchain>
        </copy>
    </target>

    <!-- Do Python tests. -->
    <target name="do-py-unittest" depends="setup-py-unittest">
        <property name="nose.args" value="nokiacpythontest scripttests"/>
        <exec executable="python" failonerror="true">
            <env key="TEST_DATA" value="${helium.dir}/tests"/>
            <arg line="${python.tools}/coverage.py -x ${python.tools}/nosetests-script.py -v ${nose.args}"/>
        </exec>
        <script language="jython" setbeans="false">
import sys
import os
os.putenv('TEST_DATA', os.path.join(os.environ['HELIUM_HOME'], 'tests'))
sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'external/python/lib/common/nose-0.11.1-py2.6.egg'))
sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'external/python/lib/common/mocker-0.10.1-py2.5.egg'))
import nose
args = project.getProperty('nose.args')
if ' ' in args:
    nose.run(argv=['-v', 'scripttests'])
elif 'cpython' not in args:
    nose.run(argv=['-v', args])
print >> sys.stderr
        </script>
    </target>
    
    <!-- Shortcut for Python unit tests. -->
    <target name="pt" depends="do-py-unittest"/>
    
        
    <!-- Create Python code coverage statistics. -->
    <target name="py-unittest-coverage">
        <mkdir dir="${helium.build.dir}/coverage"/>
        <pathconvert pathsep=" " property="python.modules.coverage">
            <fileset dir="${helium.dir}">
                <include name="tools/**/*.py"/>
                <include name="extensions/nokia/tools/**/*.py"/>
                <exclude name="tools/startup/bootstrap/site.py"/>
            </fileset>
        </pathconvert>
        <exec executable="python" failonerror="true">
            <arg line="${python.tools}/coverage.py -a -d ${helium.build.dir}/coverage ${python.modules.coverage}"/>
        </exec>
                        
        <!-- backup the old line coverage report and create the new one -->
        <mkdir dir="${helium.build.dir}/coverage/report"/>        
        <if>
            <available file="${helium.build.dir}/coverage/report/line_coverage.txt"/>
            <then>
                <copy file="${helium.build.dir}/coverage/report/line_coverage.txt" tofile="${helium.build.dir}/coverage/report/line_coverage_old.txt" overwrite="true"/>
            </then>    
        </if>        
        <hlm:record name="${helium.build.dir}/coverage/report/line_coverage.txt" action="start"/>        
        <exec executable="python" failonerror="true">
            <arg line="${python.tools}/coverage.py -r ${python.modules.coverage}"/>
        </exec>
        <hlm:record name="${helium.build.dir}/coverage/report/line_coverage.txt" action="stop"/>
        <replace file="${helium.build.dir}/coverage/report/line_coverage.txt">
            <replacetoken><![CDATA[[exec]]]></replacetoken>
            <replacevalue><![CDATA[]]></replacevalue>
        </replace>
        <hlm:python>
for line in open(r'${helium.build.dir}/coverage/report/line_coverage.txt'):
    if 'TOTAL' in line and ' 0%' in line:
        raise Exception('Coverage at 0%')
        </hlm:python>
        <delete file="${helium.dir}/.coverage"/>
    </target>
    
    
    <!-- Run Python unit test cases. -->
    <target name="py-unittest" depends="do-py-unittest,py-unittest-coverage"/>
        
    
    <!-- Run Ant unit tests. -->
    <target name="ant-unittest">
        <mkdir dir="${helium.build.dir}/temp"/>
        <mkdir dir="${helium.build.dir}/report/antunit"/>
        <au:antunit>
            <propertyset>
                <propertyref name="cache.dir"/>
            </propertyset>
            <fileset dir="${helium.dir}" includes="tools/**/test_*.ant.xml"/>
            <fileset dir="${helium.dir}" includes="extensions/nokia/tools/**/test_*.ant.xml"/>
            <au:plainlistener/>
            <au:xmllistener toDir="${helium.build.dir}/report/antunit"/>
        </au:antunit>
    </target>
    
    
    <!-- Run JUnit unit tests. -->
    <target name="ju-unittest" depends="build-java-src">
        <!-- Source location for test class -->
        <!-- Source location for junit test class.
        @type string
        @scope private
        -->
        <property name="src" location="tools/common/java/test" /> 
        <!-- Source classes location -->
        <!-- Java source files location for helium library.
        @type string
        @scope private
        -->
        <property name="src.classes" location="tools/common/java/src" />
        
        <delete dir="${build.temp.dir}/junit_classes"/>
        <mkdir dir="${build.temp.dir}/junit_classes" />
                
        <!-- Compile the test classes  -->
        <javac srcdir="${src}" destdir="${build.temp.dir}/junit_classes" debug="true">    
            <include name="**/*.java"/>
            <classpath>                         
                <pathelement path="${java.class.path}/"/>
            </classpath>
        </javac>
        
        <path id="build.classpath">
            <pathelement location="${build.temp.dir}/class" />
            <pathelement location="${build.temp.dir}/junit_classes" />
        </path>
        <emma enabled="true">
            <instr instrpathref="build.classpath"  
            destdir="${build.temp.dir}/emma/instrumented"  
            metadatafile="${build.temp.dir}/metadata.emma"
            merge="true">
                <filter excludes="org.apache.log4j.*" />
            </instr>
        </emma>
                                                    
        <!-- Execute JUnit-->
        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="yes" >
            <formatter type="brief" usefile="false"/>
            <jvmarg value="-Demma.coverage.out.file=${build.temp.dir}/coverage.emma" />
            <jvmarg value="-Demma.coverage.out.merge=false" />
            <classpath>
                <pathelement path="${build.temp.dir}/emma/instrumented"/>
                <pathelement path="${java.class.path}/"/>
            </classpath>    
            <batchtest fork="yes" todir="${build.temp.dir}/junit_test">
                <fileset dir="${src}">
                    <include name="**/*Test*.java"/>
                </fileset>
            </batchtest>
        </junit>
        
        <emma enabled="true">
            <report>
                <sourcepath>
                    <dirset dir="${src.classes}" />
                </sourcepath>
                <infileset dir="${build.temp.dir}" includes="*.emma" />
                <txt outfile="${build.temp.dir}/coverage.txt" depth="method" />
                <html outfile="${build.temp.dir}/coverage.html" />
            </report>
        </emma>
        <loadfile property="message" srcFile="${build.temp.dir}/coverage.txt"/>
        <echo message="${message}"/>
    </target>    
    
</project>
