| <!-- |
| - |
| - 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> |