| <?xml version="1.0" encoding="UTF-8" ?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <project name="SMOKE TESTS" default="smoke-test"> |
| |
| <import file="test-common.xml"/> |
| <import file="../build-native.xml"/> |
| |
| <property name="smoke.test.src" location="${test.home}/smoke" /> |
| <property name="smoke.test.dir" location="${base.test.dir}/smoke.tests"/> |
| <property name="smoke.test.summary" location="${base.test.dir}/smoke.test.failed"/> |
| <property name="smoke.test.class.path" location="${smoke.test.dir}/classes" /> |
| <property name="smoke.test.native.path" location="${smoke.test.dir}/natives" /> |
| |
| <patternset id="smoke.test.pattern"> |
| <include name="**/*.class"/> |
| <exclude name="**/*$*.class"/> |
| </patternset> |
| |
| <fileset id="smoke.test.native.refid" |
| dir="${smoke.test.src}"> |
| <include name="**/*.c"/> |
| </fileset> |
| <pathconvert property="smoke.test.native.list" |
| refid="smoke.test.native.refid" pathsep="," /> |
| |
| <target name="smoke-test" depends="-init-test, |
| clean, compile-smoke-test, java_test_smoke, build_report"> |
| <available property="test.failed" file="${smoke.test.summary}" /> |
| <fail unless="run.all.tests" if="test.failed"/> |
| </target> |
| |
| <target name="clean"> |
| <delete quiet="true" file="${smoke.test.summary}"/> |
| <delete quiet="true" dir="${smoke.test.dir}/reports" /> |
| </target> |
| |
| <target name="compile-smoke-test" depends="compile-smoke-test-native"> |
| <compile-java src="${smoke.test.src}" dest="${smoke.test.class.path}" /> |
| </target> |
| |
| |
| <target name="compile-smoke-test-native" depends="-plugin-cpptasks"> |
| <mkdir dir="${smoke.test.native.path}" /> |
| |
| <for list="${smoke.test.native.list}" param="full.file.path" delimiter=","> |
| <sequential> |
| <var name="outputdir" unset="true" /> |
| <var name="tmp.outputdir" unset="true" /> |
| <var name="outputfile" unset="true" /> |
| |
| <basename property="outputfile" file="@{full.file.path}" suffix=".c"/> |
| <dirname property="tmp.outputdir" file="@{full.file.path}" /> |
| <basename property="outputdir" file="${tmp.outputdir}" /> |
| |
| <mkdir dir="${smoke.test.native.path}/${outputdir}" /> |
| |
| <echo message="Compiling ${smoke.test.native.path}/${outputdir}/${outputfile}" /> |
| <cc name="${hy.cpp.compiler}" |
| debug="true" |
| runtime="dynamic" |
| multithreaded="true" |
| link="shared" |
| outfile="${smoke.test.native.path}/${outputdir}/${outputfile}"> |
| <includepath path="${test.jdk.home}/include" /> |
| <!--linkerarg value="-lstdc++" if="is.linux"/--> |
| <fileset file="@{full.file.path}" /> |
| </cc> |
| |
| <embed-manifest lib="${smoke.test.native.path}/${outputdir}/${outputfile}${shlib.suffix}" /> |
| </sequential> |
| </for> |
| </target> |
| |
| <target name="java_test_smoke"> |
| <mkdir dir="${smoke.test.dir}/reports" /> |
| <path id="java.class.path"> |
| <pathelement location="${smoke.test.class.path}" /> |
| </path> |
| <echo> |
| ================================== |
| Tested JVM: ${test.jvm.exe} |
| ================================== |
| </echo> |
| <for list="${test.mode}" param="mode" trim="true"> |
| <sequential> |
| <antcall target="java_test_smoke_with_jit_or_interpreter"> |
| <param name="mode.id" value="@{mode}" /> |
| </antcall> |
| </sequential> |
| </for> |
| </target> |
| |
| <target name="build_report"> |
| <gen-test-report dir="${smoke.test.dir}/reports"/> |
| <echo message="The test report is in ${smoke.test.dir}/reports"/> |
| </target> |
| |
| <target name="java_test_smoke_with_jit_or_interpreter"> |
| <propertycopy property="mode.name" from="${mode.id}.name" override="on"/> |
| <propertycopy property="mode.switch" from="${mode.id}.switch" override="on"/> |
| |
| <property name="classes.location" location="${smoke.test.src}" /> |
| <pathconvert property="java.path.property" refid="java.class.path" /> |
| <condition property="int.or.jit.exclude" value="X_int,X_interpreter"> |
| <contains string="${mode.id}" substring="int" /> |
| </condition> |
| <property name="int.or.jit.exclude" value="X_jit,X_jitrino" /> |
| <property name="EXCLUDE_KEYWORDS" value="XXX,X_${build.os},X_${build.arch},X_drl,${int.or.jit.exclude},slow,perf,stress" /> |
| |
| <echo> |
| ================================== |
| Smoke tests on ${mode.name} |
| ================================== |
| </echo> |
| |
| <take-xlist name="exclude.file" file="${excludes.dir}/exclude.drlvm_smoke.${hy.platform}.${mode.id}"/> |
| |
| <convert-test from="test.case" to="test.file"/> |
| |
| <fileset dir="${smoke.test.src}" id="smoke.run.set"> |
| <include name="**/*.java" unless="test.case"/> |
| <include name="${test.file}" if="test.case"/> |
| <excludesfile name="${exclude.file}" if="exclude.file" /> |
| </fileset> |
| <pathconvert property="smoke.run.list" setonempty="no" refid="smoke.run.set"/> |
| <fail unless="smoke.run.list" message="No test found: ${test.case}"/> |
| |
| <for param="test"> |
| <fileset refid="smoke.run.set"/> |
| <sequential> |
| <!-- unset res.code variable to use it for next run--> |
| <var name="res.code" unset="true"/> |
| <var name="outdir" unset="true" /> |
| <var name="tmp.outdir" unset="true" /> |
| |
| <basename property="filename.@{test}" file="@{test}" /> |
| <propertycopy name="fname" override="true" from="filename.@{test}" /> |
| <propertyregex property="classes.location1" override="true" input="${classes.location}" regexp="\\" replace="/" global="true" defaultValue="${classes.location}" /> |
| <propertyregex property="test1" override="true" input="@{test}" regexp="\\" replace="/" global="true" defaultValue="@{test}" /> |
| <propertyregex property="class.name.sep" override="true" input="${test1}" regexp="${classes.location1}/(.*).java" replace="\1" /> |
| <propertyregex property="class.name" override="true" input="${class.name.sep}" regexp="/" replace="\." global="true" defaultValue="${class.name.sep}" /> |
| <loadfile property="@{test}.src.file" srcFile="@{test}" /> |
| <propertycopy name="src.file" override="true" from="@{test}.src.file" /> |
| <propertyregex property="@{test}.keywords" input="${src.file}" regexp="(?m)@keyword(.*)" select="\1" defaultValue="" /> |
| <propertycopy name="file.keywords" override="true" from="@{test}.keywords" /> |
| <dirname property="tmp.outdir" file="@{test}" /> |
| <basename property="outdir" file="${tmp.outdir}" /> |
| |
| <for param="keyword" list="${EXCLUDE_KEYWORDS}" delimiter=","> |
| <sequential> |
| <condition property="@{test}.is.excluded" value="@{keyword}"> |
| <contains string="${file.keywords}" substring="@{keyword}" /> |
| </condition> |
| </sequential> |
| </for> |
| <if> |
| <or> |
| <isset property="test.case"/> |
| <not><isset property="@{test}.is.excluded" /></not> |
| </or> |
| <then> |
| <echo message="Running test : ${class.name}" /> |
| <var name="test.report" value="${smoke.test.dir}/reports/${class.name}_${mode.id}"/> |
| |
| <java newenvironment="yes" |
| dir="${smoke.test.dir}" |
| classname="${class.name}" |
| fork="true" |
| jvm="${test.jvm.exe}" |
| output="${test.report}.out" |
| error="${test.report}.out.err" |
| resultproperty="res.code" |
| timeout="${test.timeout}" > |
| <jvmarg line="${mode.switch} ${test.vmargs}" /> |
| <jvmarg value="-Djava.library.path=${smoke.test.native.path}/${outdir}" /> |
| <jvmarg value="-classpath" /> |
| <jvmarg value="${smoke.test.class.path}" /> |
| <env key="JAVA_HOME" value="${test.jre.home}" /> |
| <env key="LD_LIBRARY_PATH" value="${test.jre.home}/bin:${env.LD_LIBRARY_PATH}" /> |
| </java> |
| |
| <loadfile property="@{test}.out" srcFile="${test.report}.out"> |
| <filterchain> |
| <tokenfilter> |
| <!-- Should escape CDATA end marker --> |
| <replaceregex pattern="]]>" replace="]]&gt;" flags="gi"/> |
| </tokenfilter> |
| </filterchain> |
| </loadfile> |
| <loadfile property="@{test}.err" srcFile="${test.report}.out.err"> |
| <filterchain> |
| <tokenfilter> |
| <!-- Should escape CDATA end marker --> |
| <replaceregex pattern="]]>" replace="]]&gt;" flags="gi"/> |
| </tokenfilter> |
| </filterchain> |
| </loadfile> |
| |
| <!-- loadfile does not define the property if file is empty --> |
| <property name="@{test}.out" value=""/> |
| <property name="@{test}.err" value=""/> |
| |
| <!-- whether DRLVM's output contains PASS and doesn't FAIL --> |
| <condition property="@{test}.is.passed" value="true" else="false"> |
| <and> |
| <contains string="${@{test}.out}" substring="PASS" casesensitive="false" /> |
| <not> |
| <contains string="${@{test}.out}" substring="FAIL" casesensitive="false" /> |
| </not> |
| |
| <!-- the return code must be checked --> |
| <or> |
| <!-- it must be '0' in general --> |
| <equals arg1="${res.code}" arg2="0" /> |
| |
| <!-- some tests passes w/ non-'0' code --> |
| <and> |
| <equals arg1="${class.name}" arg2="init.ErrorInInitializer" /> |
| <equals arg1="${res.code}" arg2="1" /> |
| </and> |
| <and> |
| <equals arg1="${class.name}" arg2="shutdown.TestFatalError" /> |
| <equals arg1="${res.code}" arg2="1" /> |
| </and> |
| <and> |
| <equals arg1="${class.name}" arg2="shutdown.TestInterrupt" /> |
| <equals arg1="${res.code}" arg2="130" /> |
| </and> |
| </or> |
| </and> |
| </condition> |
| |
| <escape-cdata file="${test.report}.out.err" property="@{test}.msg"/> |
| <to-junit-xml xml="${smoke.test.dir}/reports/TEST-${class.name}_${mode.id}.xml" |
| suite="${class.name}_${mode.id}" test="${mode.name}" |
| status="${@{test}.is.passed}" |
| out="${@{test}.out}" err="${@{test}.err}" |
| msg="Exit code: ${res.code}" |
| detail="Exit code: ${res.code} Err: ${@{test}.msg}"/> |
| |
| <if> |
| <istrue value="${@{test}.is.passed}" /> |
| <then> |
| <echo message=" PASSED : ${class.name}" /> |
| </then> |
| <else> |
| <echo message="*** FAILED **** : ${class.name} (${res.code} res code)" /> |
| <echo message="*** FAILED **** : ${class.name} on ${mode.name}${line.separator}" file="${smoke.test.summary}" append="true"/> |
| </else> |
| </if> |
| |
| </then> |
| <else> |
| <propertycopy override="true" property="exclude.reason" from="@{test}.is.excluded" /> |
| <echo message="test ${class.name} is skipped due to ${exclude.reason}" /> |
| </else> |
| </if> |
| </sequential> |
| </for> |
| <echo message="Please find test classes and results at ${smoke.test.dir}/reports" /> |
| </target> |
| |
| </project> |