blob: f70e8923ed6bb20b029d6e534a8a45b9008fba54 [file] [log] [blame]
<!--
-
- 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="qpid-python-test-ant" default="test" >
<!-- Ant wrapper around qpid-python-test. Starts Qpid broker; runs
qpid-python-test, and formats the test output. -->
<!-- Directories etc -->
<property name="python.dir" value="${basedir}"/>
<property name="qpid.root.dir" value="${basedir}/.."/>
<property name="java.dir" value="${basedir}/../java"/>
<property name="cpp.dir" value="${basedir}/../cpp"/>
<property name="build.dir" value="${python.dir}/build"/>
<property name="test.results.dir" value="${build.dir}/results"/>
<property name="test.work.dir" value="${build.dir}/work"/>
<!-- Qpid Broker Executable/Url/Port -->
<property name="qpid.port" value="15672"/>
<property name="qpid.python.broker.url" value="amqp://guest/guest@localhost:${qpid.port}"/>
<property name="qpid.executable" value="${java.dir}/build/bin/qpid-server"/>
<property name="qpid.executable.args" value="-p ${qpid.port}"/>
<!-- Additional modules to be added to command. Property must include -M -->
<property name="python.test.modules" value=""/>
<!-- Ignore file. Property must include -I -->
<property name="python.test.ignore" value=""/>
<!-- Time to wait for socket to be bound -->
<property name="ensurefree.maxwait" value="1000"/>
<property name="start.maxwait" value="20000"/>
<property name="stop.maxwait" value="10000"/>
<property name="socket.checkevery" value="1000"/>
<!-- Success message -->
<property name="passed.message" value=" 0 failed"/>
<target name="test" depends="clean, init, ensure-port-free, start-broker, run-tests, stop-broker, kill-broker, report"/>
<target name="init">
<mkdir dir="${test.results.dir}"/>
<mkdir dir="${test.work.dir}"/>
</target>
<target name="clean">
<delete dir="${test.results.dir}"/>
<delete dir="${test.work.dir}"/>
</target>
<target name="ensure-port-free" depends="init" unless="skip.ensure-port-free">
<await-port-free port="${qpid.port}" maxwait="${ensurefree.maxwait}" checkevery="${socket.checkevery}" timeoutproperty="ensurefree.timeout"/>
<fail message="Broker port ${qpid.port} is not free" if="ensurefree.timeout"/>
</target>
<target name="start-broker" depends="init">
<echo>Starting Qpid with ${qpid.executable} ${qpid.executable.args}</echo>
<exec executable="${qpid.executable}" spawn="true">
<env key="QPID_WORK" value="${test.work.dir}"/>
<arg line="${qpid.executable.args}"/>
</exec>
<await-port-bound port="${qpid.port}" maxwait="${start.maxwait}" checkevery="${socket.checkevery}" timeoutproperty="start.timeout"/>
<antcall target="wait-for-broker-ready"/>
</target>
<target name="wait-for-broker-ready" if="java.broker">
<await-broker-log path="${test.work.dir}/log/qpid.log" entry="BRK-1004" maxwait="${start.maxwait}" checkevery="${socket.checkevery}" timeoutproperty="start.timeout"/>
</target>
<target name="stop-broker" depends="init">
<get-pid port="${qpid.port}" targetProperty="pid" resultproperty="stopresultproperty"/>
<echo>Stopping Qpid with pid '${pid}'</echo>
<kill-pid pid="${pid}" signo="-15"/>
<await-port-free port="${qpid.port}" maxwait="${stop.maxwait}" checkevery="${socket.checkevery}" timeoutproperty="stop.timeout"/>
</target>
<target name="kill-broker" depends="init" if="stop.timeout">
<get-pid port="${qpid.port}" targetProperty="pid" resultproperty="killresultproperty"/>
<echo>Killing Qpid with pid '${pid}'</echo>
<kill-pid pid="${pid}" signo="-9"/>
</target>
<target name="run-tests" depends="init" unless="start.timeout">
<echo>Running test-suite</echo>
<exec executable="${python.dir}/qpid-python-test" output="${test.results.dir}/results.out" error="${test.results.dir}/results.err">
<env key="PYTHONPATH" value="${qpid.root.dir}/tests/src/py:${qpid.root.dir}/extras/qmf/src/py:${qpid.root.dir}/tools/src/py"/>
<arg line="-b ${qpid.python.broker.url} -x ${test.results.dir}/TEST-python.xml ${python.test.modules} ${python.test.ignore}"/>
</exec>
<condition property="tests.passed">
<isfileselected file="${test.results.dir}/results.out">
<contains text="${passed.message}"/>
</isfileselected>
</condition>
</target>
<target name="report" depends="init" unless="tests.passed">
<fail message="Test(s) failed" unless="tests.passed"/>
<echo message="Test(s) passed" if="tests.passed"/>
</target>
<macrodef name="get-pid">
<attribute name="targetProperty"/>
<attribute name="port"/>
<attribute name="resultproperty"/>
<sequential>
<exec executable="lsof" outputproperty="@{targetProperty}" resultproperty="@{resultproperty}">
<arg value="-t"/> <!-- Terse output -->
<arg value="-i"/> <arg value=":@{port}"/>
</exec>
<fail message="lsof failed to determine the pid using port @{port}, exit status ${@{resultproperty}}">
<condition>
<not>
<equals arg1="${@{resultproperty}}" arg2="0"/>
</not>
</condition>
</fail>
</sequential>
</macrodef>
<macrodef name="kill-pid">
<attribute name="pid"/>
<attribute name="signo"/>
<sequential>
<exec executable="kill">
<arg value="@{signo}"/>
<arg value="@{pid}"/>
</exec>
</sequential>
</macrodef>
<macrodef name="await-port-free">
<attribute name="maxwait"/>
<attribute name="checkevery"/>
<attribute name="timeoutproperty"/>
<attribute name="port"/>
<sequential>
<waitfor maxwait="@{maxwait}" maxwaitunit="millisecond" checkevery="@{checkevery}" checkeveryunit="millisecond" timeoutproperty="@{timeoutproperty}">
<not>
<socket server="localhost" port="@{port}"/>
</not>
</waitfor>
</sequential>
</macrodef>
<macrodef name="await-port-bound">
<attribute name="maxwait"/>
<attribute name="checkevery"/>
<attribute name="timeoutproperty"/>
<attribute name="port"/>
<sequential>
<waitfor maxwait="@{maxwait}" maxwaitunit="millisecond" checkevery="@{checkevery}" checkeveryunit="millisecond" timeoutproperty="@{timeoutproperty}">
<socket server="localhost" port="@{port}"/>
</waitfor>
</sequential>
</macrodef>
<macrodef name="await-broker-log">
<attribute name="maxwait"/>
<attribute name="checkevery"/>
<attribute name="timeoutproperty"/>
<attribute name="entry"/>
<attribute name="path"/>
<sequential>
<echo message="Waiting for entry '@{entry}' in '@{path}' "/>
<waitfor maxwait="@{maxwait}" maxwaitunit="millisecond" checkevery="@{checkevery}" checkeveryunit="millisecond" timeoutproperty="@{timeoutproperty}">
<resourcecontains resource="@{path}" substring="@{entry}"/>
</waitfor>
<echo message="Timeout @{timeoutproperty}"/>
</sequential>
</macrodef>
</project>