From 54f87027a2d4eb0bc63e97f6b53594b63c756e58 Mon Sep 17 00:00:00 2001
From: al_xipe <al_xipe@localhost>
Date: Sun, 15 Oct 2006 22:25:34 +0000
Subject: [PATCH] added "1-click" platform independent integration tests target added code coverage for the integration tests added the ability to merge the code coverage results from unit tests and integration tests into a global report (in build/coverage/reports/global) added a dependency on package Adapated the unit tests form the main build.xml file to match the suite-specific coverage reports model
---
opends/tests/integration-tests-testng/build.xml | 264 +++++++++++++++++++++++++++++++++----------
opends/build.xml | 28 ++--
opends/tests/integration-tests-testng/testng.xml.stubs | 17 +-
3 files changed, 227 insertions(+), 82 deletions(-)
diff --git a/opends/build.xml b/opends/build.xml
index 9c8783a..fbdbfa7 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -77,12 +77,13 @@
<property name="dsml.classes.dir" location="${build.dir}/dsml/classes" />
<!-- Properties for code coverage testing. -->
- <property name="coverage.dir" location="build/coverage" />
- <property name="coverage.report.dir" location="${coverage.dir}/report" />
+ <property name="coverage.dir" location="build/coverage" />
+ <property name="coverage.report.dir"
+ location="${coverage.dir}/reports/unit" />
<property name="coverage.instr.dir"
- location="${coverage.dir}/instrumentedcode" />
+ location="${coverage.dir}/instrumentedcode" />
<property name="coverage.data.dir"
- location="${coverage.dir}/gathereddata" />
+ location="${coverage.dir}/gathereddata" />
<!-- Properties for the EMMA code coverage tool. -->
<property name="emma.dir" location="${ext.dir}/emma/lib" />
@@ -685,7 +686,7 @@
<include name="*.jar" />
</fileset>
</classpath>
- <jvmarg value="-Demma.coverage.out.file=${coverage.data.dir}/coverage.emma" />
+ <jvmarg value="-Demma.coverage.out.file=${coverage.data.dir}/unit.emma" />
<jvmarg value="-Demma.coverage.out.merge=false" />
<jvmarg value="-Dorg.opends.server.BuildRoot=${basedir}" />
<jvmarg value="-Xmx${MEM}" />
@@ -693,15 +694,17 @@
<xmlfileset dir="${unittest.resource.dir}" includes="testng.xml" />
</testng>
+ <echo message="Generating unit tests coverage report..."/>
<emma enabled="${coverage.enabled}" >
<report sourcepath="${src.dir}" >
- <!-- <property name="verbosity.level" value="verbose" /> -->
- <fileset dir="${coverage.data.dir}" >
- <include name="*.emma" />
- </fileset>
+ <!-- <property name="verbosity.level" value="verbose" /> -->
+ <fileset dir="${coverage.data.dir}" >
+ <include name="unit.emma" />
+ <include name="metadata.emma" />
+ </fileset>
- <txt outfile="${coverage.report.dir}/coverage.txt" />
- <html outfile="${coverage.report.dir}/index.html" />
+ <txt outfile="${coverage.report.dir}/coverage.txt" />
+ <html outfile="${coverage.report.dir}/index.html" />
</report>
</emma>
@@ -736,7 +739,8 @@
<target name="integration-tests"
- description="Builds the integration tests">
+ description="Builds the integration tests"
+ depends="package">
<ant dir="${functest.testng.dir}" />
</target>
diff --git a/opends/tests/integration-tests-testng/build.xml b/opends/tests/integration-tests-testng/build.xml
index 67eea5f..0ef6d0d 100644
--- a/opends/tests/integration-tests-testng/build.xml
+++ b/opends/tests/integration-tests-testng/build.xml
@@ -31,12 +31,22 @@
OpenDS Directory Server. See the
BUILDING file in this directory for build instructions.
</description>
+
+ <!-- generate the timestamp we'll use to tag/store the test results -->
+ <tstamp>
+ <format property="run.time" pattern="yyyy.MM.dd-HH.mm.ss" />
+ </tstamp>
<!-- General build-wide properties -->
- <property name="opends.dir" location="../.." />
- <property name="tests.src.dir" location="src/server" />
+ <property name="opends.dir" location="../.." />
+ <property name="tests.src.dir" location="src/server" />
<property name="tests.build.dir"
location="${opends.dir}/build/integration-tests" />
+ <property name="tests.classes"
+ location="${tests.build.dir}/classes" />
+ <property name="tests.run.dir"
+ location="${tests.build.dir}/run/${run.time}" />
+
<property name="lib.dir" location="${opends.dir}/lib" />
<property name="ext.dir" location="${opends.dir}/ext" />
<property name="testng.dir" location="${ext.dir}/testng" />
@@ -45,17 +55,27 @@
<property name="opends.build.dir" location="${opends.dir}/build" />
<property name="opends.package.dir" location="${opends.build.dir}/package" />
<property name="opends.classes" location="${opends.build.dir}/classes" />
+ <property name="opends.src" location="${opends.dir}/src/server" />
- <!-- default configuration values for opends -->
- <property name="install.dir.default" value="${basedir}/install" />
+ <!-- product values for opends -->
<property name="product.version" value="0.1" />
<property name="product.name" value="OpenDS" />
-
- <!-- generate the timestamp we'll use to tag/store the test results -->
- <tstamp>
- <format property="run.time" pattern="yyyy.mm.dd-HH.mm.ss" />
- </tstamp>
+ <!-- Properties for code coverage -->
+ <property name="emma.lib.dir" value="${ext.dir}/emma/lib" />
+ <property name="opends.coverage.dir"
+ location="${opends.build.dir}/coverage" />
+ <property name="coverage.instr.dir"
+ location="${opends.coverage.dir}/instrumentedcode" />
+ <property name="coverage.data.dir"
+ location="${opends.coverage.dir}/gathereddata" />
+ <property name="coverage.report.dir"
+ location="${opends.coverage.dir}/reports" />
+ <property name="integration.coverage.report.dir"
+ location="${coverage.report.dir}/integration" />
+ <property name="global.coverage.report.dir"
+ location="${coverage.report.dir}/global" />
+
<!-- assertion to determine the operating system -->
<condition property="isWindows">
<os family="windows"/>
@@ -65,32 +85,85 @@
<os family="windows"/>
</not>
</condition>
-
- <!-- edit or create this file if you need custom port or install path
+
+ <!-- integration-tests.properties ...
+ edit or create this file if you need custom port or install path
it can have any of the following properties
port.ldap
+ port.ssl
install.dir
+ host.name
+ bindDN
+ password
+
+ see set-default-props target for default values
-->
<property file="integration-tests.properties" />
+
+ <target name="set-default-props"
+ description="defines the default values if no custom values were provided">
+ <property name="install.dir" value="${tests.build.dir}/install" />
+ <property name="port.ldap" value="1389" />
+ <property name="port.ssl" value="1636" />
+ <property name="host.name" value="localhost" />
+ <property name="bindDN" value="cn=Directory Manager" />
+ <property name="password" value="password" />
+ <property name="full.install.dir"
+ value="${install.dir}/${product.name}-${product.version}" />
+ <property name="MEM" value="128M" />
+ </target>
+
+ <!-- this is a private target that checks for emma instrumented opends
+ classes
+ -->
+ <target name="check-opends-instrumentation">
+ <available file="${coverage.instr.dir}/org/opends/server"
+ type="dir"
+ property="is-opends-instrumented"
+ value="true" />
+ </target>
+
+ <target name="coverage"
+ if="is-opends-instrumented"
+ depends="check-opends-instrumentation"
+ description="initialize emma">
+ <echo message="Found opends emma instrumentation, configuring emma to gather code coverage during integration tests run"/>
+ <mkdir dir="${coverage.data.dir}" />
+ <mkdir dir="${coverage.report.dir}" />
+ <mkdir dir="${global.coverage.report.dir}" />
+ <mkdir dir="${integration.coverage.report.dir}" />
+ </target>
+
+ <target name="init"
+ description="initialize properties and create directories to allow for the integration tests to run succesfully"
+ depends="set-default-props">
+ <path id="emma.lib">
+ <pathelement location="${emma.lib.dir}/emma.jar" />
+ <pathelement location="${emma.lib.dir}/emma_ant.jar" />
+ </path>
+ <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+ </target>
+
<!-- The build target that should be used to build everything. -->
<target name="all"
- depends="uninstall,clean,tests,install,configure,start,run-tests,stop"
+ depends="init,clean,tests,bootstrap,run-tests,wipeout"
description="Build using all defined targets." />
<!-- Remove all dynamically-generated build files. -->
<target name="clean"
- description="Clean up any files generated during the build process">
- <delete dir="${tests.build.dir}" />
+ description="Clean up the compiled integration tests"
+ depends="set-default-props">
+ <delete dir="${tests.classes}" />
</target>
<!-- Compile the functional tests source files. -->
<target name="tests"
description="Compile the functional tests source files.">
- <mkdir dir="${tests.build.dir}" />
+ <mkdir dir="${tests.classes}" />
- <javac srcdir="${tests.src.dir}" destdir="${tests.build.dir}" optimize="true"
+ <javac srcdir="${tests.src.dir}" destdir="${tests.classes}" optimize="true"
debug="on" debuglevel="lines,source" source="1.5" target="1.5"
deprecation="true" fork="true" >
<compilerarg value="-Xlint:all" />
@@ -111,7 +184,7 @@
<target name="run-tests"
description="run the integration test suite"
- depends="set-default-install-props">
+ depends="init,coverage">
<taskdef resource="testngtasks">
<classpath>
<fileset dir="${testng.lib.dir}">
@@ -120,64 +193,106 @@
</classpath>
</taskdef>
- <property name="run.dir" value="${basedir}/run/${run.time}" />
- <mkdir dir="${run.dir}" />
- <mkdir dir="${run.dir}/logs" />
- <mkdir dir="${run.dir}/backup" />
- <mkdir dir="${run.dir}/report" />
-
+ <mkdir dir="${tests.run.dir}" />
+ <mkdir dir="${tests.run.dir}/backup" />
+ <mkdir dir="${tests.run.dir}/logs/tests" />
+ <mkdir dir="${tests.run.dir}/reports/testng" />
+ <mkdir dir="${tests.run.dir}/reports/junit" />
+ <mkdir dir="${tests.run.dir}/logs/server"/>
+
<echo message="generating tests xml file ..."/>
<copy file="testng.xml.stubs"
- tofile="testng.xml"
+ tofile="${tests.run.dir}/testng.xml"
overwrite="true" >
<filterchain>
<expandproperties/>
</filterchain>
</copy>
- <fileset id="testng.xml" dir="${basedir}" >
+
+ <!-- where for testng to go pick the test suite definition -->
+ <fileset id="testng.xml" dir="${tests.run.dir}" >
<include name="testng.xml" />
</fileset>
- <testng outputdir="${run.dir}/report"
+
+ <testng outputdir="${tests.run.dir}/reports/testng"
haltonfailure="true"
enableAssert="false"
- listener="org.opends.server.OpenDSTestListener"
- dumpCommand="true">
+ listener="org.opends.server.OpenDSTestListener">
<classpath>
+ <!-- where to get the instrumented server classes (if built) -->
+ <pathelement location="${coverage.instr.dir}"/>
+ <!-- where to get the server classes -->
+ <pathelement location="${opends.classes}" />
<!-- where to get the testng library -->
<fileset dir="${testng.lib.dir}">
<include name="*.jar" />
</fileset>
+
<!-- where to get the test classes -->
- <pathelement location="${tests.build.dir}" />
- <!-- where to get the server classes -->
- <pathelement location="${opends.classes}"/>
+ <pathelement location="${tests.classes}" />
+ <!-- last but not least, where to get the emma library -->
+ <path refid="emma.lib"/>
</classpath>
+ <!-- coverage specific jvm options -->
+ <!-- where to store the run-time coverage data -->
+ <jvmarg value="-Demma.coverage.out.file=${coverage.data.dir}/integration.emma" />
+ <!-- do not keep previous run coverage data, start from scratch everytime -->
+ <jvmarg value="-Demma.coverage.out.merge=false" />
+
+ <!-- give the jvm some extra room -->
+ <jvmarg value="-Xmx${MEM}" />
+ <jvmarg value="-Xms${MEM}" />
+
<!-- where to get the test suite definition -->
- <xmlfileset dir="${basedir}" includes="testng.xml"/>
+ <xmlfileset dir="${tests.run.dir}" includes="testng.xml"/>
</testng>
- </target>
-
- <target name="set-default-install-props"
- description="defines the default values if no custom values were provided">
- <property name="install.dir" value="${install.dir.default}" />
- <property name="port.ldap" value="1389" />
- <property name="port.ssl" value="1636" />
- <property name="host.name" value="localhost" />
- <property name="bindDN" value="cn=Directory Manager" />
- <property name="password" value="password" />
- <property name="full.install.dir"
- value="${install.dir}/${product.name}-${product.version}" />
+
+ <!-- convert the testng results to junit -->
+ <junitreport todir="${tests.run.dir}/reports/junit">
+ <fileset dir="${tests.run.dir}/reports/testng/${product.name}">
+ <include name="*.xml"/>
+ </fileset>
+ </junitreport>
+
+
+ <!-- some cleanup from the tests themselves-->
+ <delete dir="${tests.run.dir}/backup" />
+ <!-- save the server log files for issues investigation -->
+ <copy todir="${tests.run.dir}/logs/server">
+ <fileset dir="${full.install.dir}/logs"/>
+ </copy>
+
+
+ <emma enabled="${is-opends-instrumented}" >
+ <!-- generate the integration test coverage report -->
+ <report sourcepath="${opends.src}" >
+ <fileset dir="${coverage.data.dir}" >
+ <include name="integration.emma" />
+ <include name="metadata.emma" />
+ </fileset>
+ <txt outfile="${integration.coverage.report.dir}/coverage.txt" />
+ <html outfile="${integration.coverage.report.dir}/index.html" />
+ </report>
+ </emma>
+
+ <emma enabled="${is-opends-instrumented}">
+ <!-- generate the global test coverage report -->
+ <report sourcepath="${opends.src}" >
+ <fileset dir="${coverage.data.dir}" >
+ <include name="*.emma" />
+ </fileset>
+ <txt outfile="${global.coverage.report.dir}/coverage.txt" />
+ <html outfile="${global.coverage.report.dir}/index.html" />
+ </report>
+ </emma>
</target>
<target name="install"
- description="deploy the server bits"
- depends="set-default-install-props" >
+ description="deploy the opends bits"
+ depends="set-default-props" >
<property name="config.file"
location="${full.install.dir}/config/config.ldif"/>
- <!-- Set the defaults
- Does not override the custom values provided in the
- integration-tests.properties file if any -->
<mkdir dir="${install.dir}"/>
<unzip dest="${install.dir}">
<fileset dir="${opends.package.dir}">
@@ -185,17 +300,22 @@
</fileset>
</unzip>
</target>
+
+ <target name="uninstall"
+ description="Uninstall opends"
+ depends="set-default-props" >
+ <delete dir="${install.dir}" />
+ </target>
<target name="configure"
description="configures opends to listen on the right port number"
- depends="set-default-install-props"
+ depends="set-default-props"
>
<java classname="org.opends.server.tools.ConfigureDS">
<!-- building the classpath to run the configurator -->
<classpath>
- <pathelement path="${full.install.dir}/classes"/>
- <fileset dir="${full.install.dir}">
- <include name="lib/*.jar"/>
+ <fileset dir="${full.install.dir}/lib">
+ <include name="*.jar"/>
</fileset>
</classpath>
@@ -205,10 +325,14 @@
<arg value="--configFile" />
<arg value="${full.install.dir}/config/config.ldif" />
<arg line="-p ${port.ldap}" />
+ <arg value="-D"/>
+ <arg value="${bindDN}"/>
+ <arg value="-w"/>
+ <arg value="${password}"/>
</java>
</target>
- <!-- Windows specific start / stop / configure commands -->
+ <!-- Windows specific start / stop commands -->
<target name="start-windows" if="isWindows">
<echo message="Starting in the background ..."/>
<exec
@@ -227,7 +351,7 @@
</exec>
</target>
- <!-- Unix specific start / stop / configure commands -->
+ <!-- Unix specific start / stop commands -->
<target name="start-unix" if="isUnix" >
<echo message="Starting in the background ..."/>
<exec
@@ -248,17 +372,33 @@
<!-- platform independent start / stop targets -->
<target name="start"
- description="stop the server"
- depends="set-default-install-props,start-windows,start-unix" />
+ description="start the server"
+ depends="set-default-props,start-windows,start-unix" />
<target name="stop"
description="stop the server"
- depends="set-default-install-props,stop-windows,stop-unix" />
+ depends="set-default-props,stop-windows,stop-unix" />
- <target name="uninstall"
- description="Uninstalls the server"
- depends="set-default-install-props" >
- <delete dir="${install.dir}" />
+
+
+ <target name="sleep">
+ <!--
+ this is somewhat based on experience
+ before we can delete the installation directory
+ we have to wait for opends to exit gracefully and free all the locks on
+ the various resources it uses.
+ this may need to be computed based on the tests execution time to try
+ to approximate the machine speed
+ right now it's hardcoded to 15 seconds
+ -->
+ <sleep seconds="15"/>
</target>
+ <target name="bootstrap"
+ description="bootstrap opends"
+ depends="install,configure,start" />
+ <target name="wipeout"
+ description="stop and uninstall opends"
+ depends="stop,sleep,uninstall" />
+
</project>
diff --git a/opends/tests/integration-tests-testng/testng.xml.stubs b/opends/tests/integration-tests-testng/testng.xml.stubs
index 3eb8383..bae0429 100644
--- a/opends/tests/integration-tests-testng/testng.xml.stubs
+++ b/opends/tests/integration-tests-testng/testng.xml.stubs
@@ -1,15 +1,16 @@
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="OpenDS" verbose="1" >
<test name="integration-tests">
- <parameter name="hostname" value="${host.name}"/>
- <parameter name="port" value="${port.ldap}"/>
- <parameter name="sport" value="${port.ssl}"/>
- <parameter name="bindDN" value="${bindDN}"/>
- <parameter name="bindPW" value="${password}"/>
- <parameter name="integration_test_home" value="${tests.build.dir}/org/opends/server/integration"/>
- <parameter name="logDir" value="${run.dir}/logs"/>
+ <parameter name="hostname" value="${host.name}"/>
+ <parameter name="port" value="${port.ldap}"/>
+ <parameter name="sport" value="${port.ssl}"/>
+ <parameter name="bindDN" value="${bindDN}"/>
+ <parameter name="bindPW" value="${password}"/>
+ <parameter name="integration_test_home"
+ value="${tests.classes}/org/opends/server/integration"/>
+ <parameter name="logDir" value="${tests.run.dir}/logs/tests"/>
<parameter name="dsee_home" value="${full.install.dir}"/>
- <parameter name="backupDir" value="${run.dir}/backup"/>
+ <parameter name="backupDir" value="${tests.run.dir}/backup"/>
<groups>
<run>
<include name="quickstart"/>
--
Gitblit v1.10.0