From b99b1dc96d69451e3e42ee1a77bbd1e8b3d3d5a2 Mon Sep 17 00:00:00 2001
From: al_xipe <al_xipe@localhost>
Date: Wed, 08 Aug 2007 13:18:54 +0000
Subject: [PATCH] first commit towards the support of the new report format and the integration of the code coverage for the functional tests
---
opendj-sdk/opends/tests/functional-tests/shared/functions/topology.xml | 1171 +++++++++++++++++++++++++-------------------------
opendj-sdk/opends/tests/functional-tests/shared/functions/utils.xml | 177 +++++++
2 files changed, 745 insertions(+), 603 deletions(-)
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/functions/topology.xml b/opendj-sdk/opends/tests/functional-tests/shared/functions/topology.xml
index f559b1f..8689dd9 100755
--- a/opendj-sdk/opends/tests/functional-tests/shared/functions/topology.xml
+++ b/opendj-sdk/opends/tests/functional-tests/shared/functions/topology.xml
@@ -26,34 +26,32 @@
! Portions Copyright 2006-2007 Sun Microsystems, Inc.
! -->
<stax>
-
<function name="createTopology">
<function-prolog>
- This function creates the topology required by the Test Group/Suite.
- </function-prolog>
- <function-map-args>
- <function-arg-def name="topologyDescFile" type="optional" default="None">
- <function-arg-description>
- Topology Description file
- </function-arg-description>
- <function-arg-property name="type" value="filePath"/>
- </function-arg-def>
- <function-arg-def name="initialiseInstance" type="optional" default="False">
- <function-arg-description>
- Specifies whether the instance should be initialised with some default data.
- </function-arg-description>
- <function-arg-property name="type" value="boolean"/>
- </function-arg-def>
- <function-arg-def name="sharedDataFolder" type="optional" default="''">
- <function-arg-description>
- Specifies a relative folder that holds the shared data for the tests
- </function-arg-description>
- <function-arg-property name="type" value="string"/>
- </function-arg-def>
- </function-map-args>
+ This function creates the topology required by the Test Group/Suite.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topologyDescFile" type="optional" default="None">
+ <function-arg-description>
+ Topology Description file
+ </function-arg-description>
+ <function-arg-property name="type" value="filePath"/>
+ </function-arg-def>
+ <function-arg-def name="initialiseInstance" type="optional" default="False">
+ <function-arg-description>
+ Specifies whether the instance should be initialised with some default data.
+ </function-arg-description>
+ <function-arg-property name="type" value="boolean"/>
+ </function-arg-def>
+ <function-arg-def name="sharedDataFolder" type="optional" default="''">
+ <function-arg-description>
+ Specifies a relative folder that holds the shared data for the tests
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ </function-map-args>
- <sequence>
-
+ <sequence>
<script>
if not sharedDataFolder and CurrentTestPath.has_key('group'):
sharedDataFolder=CurrentTestPath['group']
@@ -61,94 +59,83 @@
<call function="'prepareInstanceCreation'">
{ 'groupDataDir' : sharedDataFolder }
- </call>
+ </call>
- <if expr="topologyDescFile == None">
- <!-- SINGLE instance deployment: read parameters from config.py (done by default) -->
- <sequence>
- <message>
- 'SINGLE instance deployment: read parameters from config.py'
- </message>
-
- <call function="'createInstance'"></call>
-
+ <if expr="topologyDescFile == None">
+ <!-- SINGLE instance deployment: read parameters from config.py (done by default) -->
+ <sequence>
+ <message>
+ 'SINGLE instance deployment: read parameters from config.py'
+ </message>
+ <call function="'createInstance'" />
<if expr="RC == 0 and initialiseInstance == True">
<sequence>
-
- <!-- Load the server with default data -->
- <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
- file="'%s/testcases/quickstart/quickstart.xml' % (TESTS_DIR)" />
- <call function="'main_quickstart'"/>
-
- </sequence>
- </if>
-
- </sequence>
-
- <else>
- <!-- MULTIPLE instance deployment: read parameters from topologyDescFile -->
- <sequence>
-
- <message>
- 'MULTIPLE instance deployment: read parameters from %s' % topologyDescFile
- </message>
-
- <!-- Parse the topology description file and set _topologyServerList -->
- <call function="'readTopology'">
- { 'file' : topologyDescFile }
- </call>
-
- <message>
- 'Number of server instances required by the deployment: %s' % len(_topologyServerList)
- </message>
-
- <iterate var="server" in="_topologyServerList">
- <sequence>
- <!-- Create the instance-->
- <call function="'createInstance'">
- { 'dsHost' : server.getHostname(),
- 'dsDir' : server.getDir(),
- 'dsPort' : server.getPort(),
- 'dsSslPort' : server.getSslPort(),
- 'dsJmxPort' : server.getJmxPort(),
- 'dsBindDN' : server.getRootDn(),
- 'dsBindPwd' : server.getRootPwd(),
- 'dsBaseDN' : server.getBaseDn() }
- </call>
-
- <!-- Configure replication if required so by the server
- ! (i.e. server is a changelog server and/or has synchronized suffixes) -->
- <if expr="server.requiresSynchronization()">
- <sequence>
- <message> 'Instance requires REPLICATION configuration.' </message>
-
- <call function="'configureReplication'">
- [server]
- </call>
- </sequence>
- </if>
-
- </sequence>
-
- </iterate>
-
- </sequence>
-
- </else>
- </if>
-
- </sequence>
-
+ <!-- Load the server with default data -->
+ <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+ file="'%s/testcases/quickstart/quickstart.xml' % (TESTS_DIR)" />
+ <call function="'main_quickstart'"/>
+ </sequence>
+ </if>
+ </sequence>
+ <else>
+ <!-- MULTIPLE instance deployment: read parameters from topologyDescFile -->
+ <sequence>
+ <message>
+ 'MULTIPLE instance deployment: read parameters from %s' % topologyDescFile
+ </message>
+
+ <!-- Parse the topology description file and set _topologyServerList -->
+ <call function="'readTopology'">
+ { 'file' : topologyDescFile }
+ </call>
+
+ <message>
+ 'Number of server instances required by the deployment: %s' % len(_topologyServerList)
+ </message>
+
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+ <!-- Create the instance-->
+ <call function="'createInstance'">
+ { 'dsHost' : server.getHostname(),
+ 'dsDir' : server.getDir(),
+ 'dsPort' : server.getPort(),
+ 'dsSslPort' : server.getSslPort(),
+ 'dsJmxPort' : server.getJmxPort(),
+ 'dsBindDN' : server.getRootDn(),
+ 'dsBindPwd' : server.getRootPwd(),
+ 'dsBaseDN' : server.getBaseDn()
+ }
+ </call>
+
+ <!-- Configure replication if required so by the server
+ ! (i.e. server is a changelog server and/or has synchronized suffixes)
+ -->
+ <if expr="server.requiresSynchronization()">
+ <sequence>
+ <message>
+ 'Instance requires REPLICATION configuration.'
+ </message>
+ <call function="'configureReplication'">
+ [server]
+ </call>
+ </sequence>
+ </if>
+ </sequence>
+ </iterate>
+ </sequence>
+ </else>
+ </if>
+ </sequence>
</function>
-
-
+
<function name="prepareInstanceCreation">
<function-prolog>
- This function prepares locally the necessary
- files to create an instance: data zip file and OpenDS zip file.
- </function-prolog>
+ This function prepares locally the necessary
+ files to create an instance: data zip file and OpenDS zip file.
+ </function-prolog>
<function-map-args>
<function-arg-def name="groupDataDir" type="optional" default="''">
<function-arg-description>
@@ -158,204 +145,202 @@
</function-arg-def>
</function-map-args>
<sequence>
-
<!-- ON LOCAL HOST: get data ready to copy to remote host -->
- <script>
- testsGroupDir='%s/%s/%s' % (TESTS_DIR,relativeDataDir,groupDataDir)
- localTestsGroupDir='%s/%s' % (logsLocalDataDir,groupDataDir)
- remoteTestsGroupDir='%s/%s' % (logsRemoteDataDir,groupDataDir)
- </script>
-
- <call function="'GetEntry'">
- { 'location' : STAXServiceMachine,
- 'entry' : localTestsGroupDir,
- 'attribute' : 'TYPE' }
- </call>
-
- <!-- If the test data is already created then don't redo it -->
- <if expr="RC == 48">
+ <script>
+ testsGroupDir='%s/%s/%s' % (TESTS_DIR,relativeDataDir,groupDataDir)
+ localTestsGroupDir='%s/%s' % (logsLocalDataDir,groupDataDir)
+ remoteTestsGroupDir='%s/%s' % (logsRemoteDataDir,groupDataDir)
+ </script>
- <sequence>
-
+ <call function="'GetEntry'">
+ { 'location' : STAXServiceMachine,
+ 'entry' : localTestsGroupDir,
+ 'attribute' : 'TYPE' }
+ </call>
+
+ <!-- If the test data is already created then don't redo it -->
+ <if expr="RC == 48">
+ <sequence>
<!-- Locally copy static data files to temporary staging area -->
<!-- LDIF (.ldif) test data files -->
- <message>
- 'Copy ldif data files locally to %s.' % localTestsGroupDir
- </message>
- <call function="'CopyFolderByExtension'">
- { 'location' : STAXServiceMachine,
- 'srcfolder' : testsGroupDir,
- 'destfolder' : localTestsGroupDir,
- 'extension' : 'ldif' }
- </call>
-
+ <message>
+ 'Copy ldif data files locally to %s.' % localTestsGroupDir
+ </message>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : STAXServiceMachine,
+ 'srcfolder' : testsGroupDir,
+ 'destfolder' : localTestsGroupDir,
+ 'extension' : 'ldif'
+ }
+ </call>
<!-- LDIF (.ldif) files for quickinstall -->
- <script>
- quickStartGroupDir='%s/%s/quickstart' % (TESTS_DIR,relativeDataDir)
- quickStartLocalTestsGroupDir='%s/quickstart' % (logsLocalDataDir)
- </script>
- <message>
- 'Copy ldif data files locally to %s.' % quickStartLocalTestsGroupDir
- </message>
- <call function="'CopyFolderByExtension'">
- { 'location' : STAXServiceMachine,
- 'srcfolder' : quickStartGroupDir,
- 'destfolder' : quickStartLocalTestsGroupDir,
- 'extension' : 'ldif' }
- </call>
-
- <!-- PWD (.pwd) files -->
- <message>
- 'Copy pwd data files locally to %s.' % localTestsGroupDir
- </message>
- <call function="'CopyFolderByExtension'">
- { 'location' : STAXServiceMachine,
- 'srcfolder' : testsGroupDir,
- 'destfolder' : localTestsGroupDir,
- 'extension' : 'pwd' }
- </call>
-
- <!-- Archive (.gz) files -->
- <message>
- 'Copy gz data files locally to %s.' % localTestsGroupDir
- </message>
- <call function="'CopyFolderByExtension'">
- { 'location' : STAXServiceMachine,
- 'srcfolder' : testsGroupDir,
- 'destfolder' : localTestsGroupDir,
- 'extension' : 'gz' }
- </call>
-
- <!-- Delete the any existing testdata archive -->
- <message>
- 'Delete %s/testdata.zip' % logsTempDir
- </message>
- <call function="'deleteFile'">
- { 'location' : STAXServiceMachine,
- 'filename' : '%s/testdata.zip' % logsTempDir }
- </call>
-
- <!-- Zip up contents of tests directory -->
- <message>
- 'Zip up local data directory %s/testdata.zip' % logsTempDir
- </message>
- <call function="'zipUpFile'">
- { 'location' : STAXServiceMachine,
- 'zipfile' : '%s/testdata.zip' % logsTempDir ,
- 'folder' : '%s' % localTestsGroupDir ,
- 'relativeto' : logsTestDataDir }
- </call>
-
- <message>
- 'Zip up local quickstart directory %s/testdata.zip' % logsTempDir
- </message>
- <call function="'zipUpFile'">
- { 'location' : STAXServiceMachine,
- 'zipfile' : '%s/testdata.zip' % logsTempDir ,
- 'folder' : '%s' % quickStartLocalTestsGroupDir ,
- 'relativeto' : logsTestDataDir }
- </call>
- </sequence>
-
- <else>
- <message>'Test data is already created.'</message>
- </else>
+ <script>
+ quickStartGroupDir='%s/%s/quickstart' % (TESTS_DIR,relativeDataDir)
+ quickStartLocalTestsGroupDir='%s/quickstart' % (logsLocalDataDir)
+ </script>
+ <message>
+ 'Copy ldif data files locally to %s.' % quickStartLocalTestsGroupDir
+ </message>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : STAXServiceMachine,
+ 'srcfolder' : quickStartGroupDir,
+ 'destfolder' : quickStartLocalTestsGroupDir,
+ 'extension' : 'ldif'
+ }
+ </call>
- </if>
-
- </sequence>
-
- </function>
+ <!-- PWD (.pwd) files -->
+ <message>
+ 'Copy pwd data files locally to %s.' % localTestsGroupDir
+ </message>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : STAXServiceMachine,
+ 'srcfolder' : testsGroupDir,
+ 'destfolder' : localTestsGroupDir,
+ 'extension' : 'pwd'
+ }
+ </call>
+
+ <!-- Archive (.gz) files -->
+ <message>
+ 'Copy gz data files locally to %s.' % localTestsGroupDir
+ </message>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : STAXServiceMachine,
+ 'srcfolder' : testsGroupDir,
+ 'destfolder' : localTestsGroupDir,
+ 'extension' : 'gz'
+ }
+ </call>
+
+ <!-- Delete the any existing testdata archive -->
+ <message>
+ 'Delete %s/testdata.zip' % logsTempDir
+ </message>
+ <call function="'deleteFile'">
+ { 'location' : STAXServiceMachine,
+ 'filename' : '%s/testdata.zip' % logsTempDir
+ }
+ </call>
+
+ <!-- Zip up contents of tests directory -->
+ <message>
+ 'Zip up local data directory %s/testdata.zip' % logsTempDir
+ </message>
+ <call function="'zipUpFile'">
+ { 'location' : STAXServiceMachine,
+ 'zipfile' : '%s/testdata.zip' % logsTempDir ,
+ 'folder' : '%s' % localTestsGroupDir ,
+ 'relativeto' : logsTestDataDir
+ }
+ </call>
+
+ <message>
+ 'Zip up local quickstart directory %s/testdata.zip' % logsTempDir
+ </message>
+ <call function="'zipUpFile'">
+ { 'location' : STAXServiceMachine,
+ 'zipfile' : '%s/testdata.zip' % logsTempDir ,
+ 'folder' : '%s' % quickStartLocalTestsGroupDir ,
+ 'relativeto' : logsTestDataDir
+ }
+ </call>
+ </sequence>
+ <else>
+ <message>
+ 'Test data is already created.'
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </function>
-
-
<function name="createInstance">
<function-prolog>
- This function creates an instance on a given host.
- It copies both data and OpenDS zip files onto the host,
- unzips them, and configures OpenDS.
- </function-prolog>
-
- <function-map-args>
- <function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
- <function-arg-description>
- Hostname where the instance is to be created
- </function-arg-description>
- <function-arg-property name="type" value="hostname"/>
- </function-arg-def>
- <function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
- <function-arg-description>
- Directory where OpenDS will be installed
- </function-arg-description>
- <function-arg-property name="type" value="filepath"/>
+ This function creates an instance on a given host.
+ It copies both data and OpenDS zip files onto the host,
+ unzips them, and configures OpenDS.
+ </function-prolog>
+
+ <function-map-args>
+ <function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
+ <function-arg-description>
+ Hostname where the instance is to be created
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
</function-arg-def>
- <function-arg-def name="dsPort" type="optional" default="DIRECTORY_INSTANCE_PORT">
- <function-arg-description>
- Directory Server port number
- </function-arg-description>
- <function-arg-property name="type" value="Port number"/>
- </function-arg-def>
- <function-arg-def name="dsSslPort" type="optional" default="DIRECTORY_INSTANCE_SSL_PORT">
- <function-arg-description>
- Directory Server SSL port number
- </function-arg-description>
- <function-arg-property name="type" value="Port number"/>
- </function-arg-def>
- <function-arg-def name="dsJmxPort" type="optional" default="None">
- <function-arg-description>
- Directory Server JMX port number
- </function-arg-description>
- <function-arg-property name="type" value="Port number"/>
- </function-arg-def>
- <function-arg-def name="dsBindDN" type="optional" default="DIRECTORY_INSTANCE_DN">
- <function-arg-description>
- Directory Manager DN
- </function-arg-description>
- <function-arg-property name="type" value="DN"/>
- </function-arg-def>
- <function-arg-def name="dsBindPwd" type="optional" default="DIRECTORY_INSTANCE_PSWD">
- <function-arg-description>
- Directory Server SSL port number
- </function-arg-description>
- <function-arg-property name="type" value="string"/>
- </function-arg-def>
- <function-arg-def name="dsBaseDN" type="optional" default="DIRECTORY_INSTANCE_SFX">
- <function-arg-description>
- Directory Server base suffix dn
- </function-arg-description>
- <function-arg-property name="type" value="DN"/>
- </function-arg-def>
- </function-map-args>
-
+ <function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
+ <function-arg-description>
+ Directory where OpenDS will be installed
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="dsPort" type="optional" default="DIRECTORY_INSTANCE_PORT">
+ <function-arg-description>
+ Directory Server port number
+ </function-arg-description>
+ <function-arg-property name="type" value="Port number"/>
+ </function-arg-def>
+ <function-arg-def name="dsSslPort" type="optional" default="DIRECTORY_INSTANCE_SSL_PORT">
+ <function-arg-description>
+ Directory Server SSL port number
+ </function-arg-description>
+ <function-arg-property name="type" value="Port number"/>
+ </function-arg-def>
+ <function-arg-def name="dsJmxPort" type="optional" default="None">
+ <function-arg-description>
+ Directory Server JMX port number
+ </function-arg-description>
+ <function-arg-property name="type" value="Port number"/>
+ </function-arg-def>
+ <function-arg-def name="dsBindDN" type="optional" default="DIRECTORY_INSTANCE_DN">
+ <function-arg-description>
+ Directory Manager DN
+ </function-arg-description>
+ <function-arg-property name="type" value="DN"/>
+ </function-arg-def>
+ <function-arg-def name="dsBindPwd" type="optional" default="DIRECTORY_INSTANCE_PSWD">
+ <function-arg-description>
+ Directory Server SSL port number
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="dsBaseDN" type="optional" default="DIRECTORY_INSTANCE_SFX">
+ <function-arg-description>
+ Directory Server base suffix dn
+ </function-arg-description>
+ <function-arg-property name="type" value="DN"/>
+ </function-arg-def>
+ </function-map-args>
<sequence>
-
- <message>
- 'Create instance in host %s at directory %s' % (dsHost,dsDir)
- </message>
-
-
+ <message>
+ 'Create instance in host %s at directory %s' % (dsHost,dsDir)
+ </message>
+
<!-- ON REMOTE HOST: copy files, unzip, configure instance -->
<!--- Delete folder if it exists on remote host-->
<message>
'Delete folder %s/%s on host %s' % (dsDir,OPENDSNAME,dsHost)
</message>
<call function="'deleteFolder'">
- { 'location' : dsHost,
- 'foldername' : '%s/%s' % (dsDir,OPENDSNAME) }
+ { 'location' : dsHost,
+ 'foldername' : '%s/%s' % (dsDir,OPENDSNAME)
+ }
</call>
-
- <!--- Create folder on remote host-->
+
+ <!--- Create folder on remote host -->
<message>
'Create folder %s on host %s' % (dsDir,dsHost)
</message>
<call function="'createFolder'">
- { 'location' : dsHost,
- 'foldername' : '%s' % dsDir }
- </call>
-
+ { 'location' : dsHost,
+ 'foldername' : '%s' % dsDir
+ }
+ </call>
+
<!--- Copy staging data to remote host -->
<message>
'Copy %s/testdata.zip to %s on %s' % (logsTestDataDir,dsDir,dsHost)
@@ -363,54 +348,73 @@
<call function="'copyFile'">
{ 'srcfile' : '%s/testdata.zip' % logsTempDir,
'destfile' : '%s/testdata.zip' % dsDir,
- 'remotehost' : dsHost }
+ 'remotehost' : dsHost
+ }
</call>
-
+
<!--- Unzip contents of staging data on remote host -->
<message>
'Extract contents of test data %s on %s' % (dsDir,dsHost)
</message>
<call function="'unZipFile'">
{ 'location' : dsHost,
- 'zipfile' : '%s/testdata.zip' % dsDir,
- 'unzipdir' : dsDir }
+ 'zipfile' : '%s/testdata.zip' % dsDir,
+ 'unzipdir' : dsDir
+ }
</call>
-
+
<!--- Install DS Copy zip file -->
<message>
'Copy DS zip archive %s/%s to %s' % (logsTempDir,ZIPNAME,dsHost)
</message>
<call function="'copyFile'">
- { 'srcfile' : '%s/%s' % (ZIPPATH,ZIPNAME),
+ { 'srcfile' : '%s/%s' % (ZIPPATH,ZIPNAME),
'destfile' : '%s/%s' % (dsDir,ZIPNAME),
- 'remotehost' : dsHost }
+ 'remotehost' : dsHost
+ }
</call>
-
+
<!--- Install DS Extract zip file -->
<message>
'Extract DS zip archive to %s on %s' % (dsDir,dsHost)
</message>
<call function="'unZipFile'">
- { 'location' : dsHost,
- 'zipfile' : '%s/%s' % (dsDir,ZIPNAME),
- 'unzipdir' : dsDir }
+ { 'location' : dsHost,
+ 'zipfile' : '%s/%s' % (dsDir,ZIPNAME),
+ 'unzipdir' : dsDir
+ }
</call>
-
+
<!-- fixMe: Windows Services are not enabled -->
<if expr="isWindows">
-
<script>
enableWindowsService=''
</script>
-
- <else>
-
- <script>
- enableWindowsService=''
- </script>
-
- </else>
+ <else>
+ <script>
+ enableWindowsService=''
+ </script>
+ </else>
</if>
+
+ <!-- configure the coverage dump file -->
+ <script>
+ mylog='::coverage: begin\n'
+ emmaprops = '%s/%s/classes/emma.properties' % (dsDir,OPENDSNAME)
+ group='emma'
+ if CurrentTestPath['group']:
+ group=CurrentTestPath['group'].strip()
+
+ if os.path.exists('%s' % emmaprops):
+ mylog+='::coverage: setting %s/%s.coverage to file %s\n' % (TMPDIR,group,emmaprops)
+ coveragefh = open(emmaprops,'w')
+ coveragefh.write('coverage.out.file=%s/%s.coverage\n' % (TMPDIR,group) )
+ coveragefh.close()
+
+ </script>
+ <message>
+ '%s' % mylog
+ </message>
<!--- Set up DS -->
<message>
@@ -418,57 +422,54 @@
</message>
<call function="'SetUpDsWithScript'">
- { 'location' : dsHost,
- 'dsPath' : '%s/%s' % (dsDir, OPENDSNAME),
- 'dsPort' : dsPort,
- 'dsJmxPort' : dsJmxPort,
- 'dsBindDN' : dsBindDN,
- 'dsBindPwd' : dsBindPwd,
- 'dsBaseDN' : dsBaseDN,
- 'dsEnableWindowsService' : enableWindowsService}
+ { 'location' : dsHost,
+ 'dsPath' : '%s/%s' % (dsDir, OPENDSNAME),
+ 'dsPort' : dsPort,
+ 'dsJmxPort' : dsJmxPort,
+ 'dsBindDN' : dsBindDN,
+ 'dsBindPwd' : dsBindPwd,
+ 'dsBaseDN' : dsBaseDN,
+ 'dsEnableWindowsService' : enableWindowsService
+ }
</call>
-
+
<call function="'checkRC'">
{ 'returncode' : RC ,
- 'result' : STAXResult }
+ 'result' : STAXResult
+ }
</call>
-
+
<if expr="returncode == 0">
- <message>
- 'Instance created.'
- </message>
- <else>
- <message>
- 'Failed to create instance.'
- </message>
- </else>
- </if>
-
-
- </sequence>
-
+ <message>
+ 'Instance created.'
+ </message>
+ <else>
+ <message>
+ 'Failed to create instance.'
+ </message>
+ </else>
+ </if>
+ </sequence>
</function>
-
-
-
-
-
+
+
+
<function name="DEPRECATEDconfigureReplication">
<function-prolog>
This function configures replication in a given server.
- </function-prolog>
+ </function-prolog>
- <function-list-args>
+ <function-list-args>
<function-arg-def name="syncserverMap" type="required">
- <function-arg-description>
- Map containing a Server class instance representing the server to configure.
- </function-arg-description>
+ <function-arg-description>
+ Map containing a Server class instance representing the server to configure.
+ </function-arg-description>
<function-arg-property name="type" value="map"/>
- </function-arg-def>
- </function-list-args>
+ </function-arg-def>
+ </function-list-args>
<sequence>
- <script>
+ <script>
syncserver = syncserverMap['instance']
filename = 'replication_conf.ldif'
@@ -476,214 +477,211 @@
dataDir = '%s/%s' % (syncserver.getDir(),relativeDataDir)
write_replication_conf_ldif_file(filePath, syncserver)
- </script>
-
- <message>
- 'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
- </message>
-
+ </script>
+
+ <message>
+ 'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
+ </message>
+
<!-- Copy the replication_conf ldif to remote host -->
<message>
- 'Copy %s file from %s to %s' % (filename,logsTestDataDir,dataDir)
- </message>
+ 'Copy %s file from %s to %s' % (filename,logsTestDataDir,dataDir)
+ </message>
<call function="'copyFile'">
{ 'srcfile' : filePath,
'destfile' : '%s/%s' % (dataDir,filename),
- 'remotehost' : syncserver.getHostname() }
+ 'remotehost' : syncserver.getHostname()
+ }
</call>
-
-
- <!--- Add replication configuration entries to config.ldif in server -->
-
- <script>
+
+ <!--- Add replication configuration entries to config.ldif in server -->
+ <script>
remoteFilePath = '%s/%s' % (dataDir, filename)
syncserverPath = '%s/%s' % (syncserver.getDir(),OPENDSNAME)
- </script>
-
-
+ </script>
+
<!--- Start DS -->
<call function="'StartDsWithScript'">
- { 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath }
+ { 'location' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath
+ }
</call>
<call function="'checkRC'">
{ 'returncode' : RC ,
- 'result' : STAXResult }
- </call>
-
- <message>
- 'Add replication configuration entries in %s' % remoteFilePath
- </message>
-
- <call function="'addEntry'">
- { 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
- 'dsInstanceHost' : syncserver.getHostname(),
- 'dsInstancePort' : syncserver.getPort(),
- 'dsInstanceDn' : syncserver.getRootDn(),
- 'dsInstancePswd' : syncserver.getRootPwd(),
- 'entryToBeAdded' : remoteFilePath }
+ 'result' : STAXResult
+ }
</call>
-
+
+ <message>
+ 'Add replication configuration entries in %s' % remoteFilePath
+ </message>
+
+ <call function="'addEntry'">
+ { 'location' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
+ 'dsInstanceHost' : syncserver.getHostname(),
+ 'dsInstancePort' : syncserver.getPort(),
+ 'dsInstanceDn' : syncserver.getRootDn(),
+ 'dsInstancePswd' : syncserver.getRootPwd(),
+ 'entryToBeAdded' : remoteFilePath
+ }
+ </call>
+
<call function="'checkRC'">
{ 'returncode' : RC,
- 'result' : STAXResult }
- </call>
-
-
+ 'result' : STAXResult
+ }
+ </call>
+
<!--- Stop DS -->
<call function="'StopDsWithScript'">
{ 'location' : syncserver.getHostname(),
- 'dsHost' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
+ 'dsHost' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
'dsPort' : syncserver.getPort(),
'dsBindDN' : syncserver.getRootDn(),
- 'dsBindPwd' : syncserver.getRootPwd() }
+ 'dsBindPwd' : syncserver.getRootPwd()
+ }
</call>
<call function="'checkRC'">
{ 'returncode' : RC ,
- 'result' : STAXResult }
- </call>
-
-
- </sequence>
-
- </function>
-
-
-
+ 'result' : STAXResult
+ }
+ </call>
+ </sequence>
+ </function>
+
+
<function name="configureReplication">
<function-prolog>
This function configures replication in a given server.
- </function-prolog>
+ </function-prolog>
- <function-list-args>
+ <function-list-args>
<function-arg-def name="syncserver" type="required">
- <function-arg-description>
- Server class instance representing the server to configure.
- </function-arg-description>
+ <function-arg-description>
+ Server class instance representing the server to configure.
+ </function-arg-description>
<function-arg-property name="type" value="Server"/>
- </function-arg-def>
- </function-list-args>
+ </function-arg-def>
+ </function-list-args>
<sequence>
- <!--- Configure replication using dsconfig -->
- <message>
- 'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
- </message>
-
- <script>
+ <!--- Configure replication using dsconfig -->
+ <message>
+ 'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
+ </message>
+
+ <script>
syncserverPath = '%s/%s' % (syncserver.getDir(),OPENDSNAME)
- </script>
-
-
+ </script>
+
<!--- Start DS -->
<call function="'StartDsWithScript'">
- { 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath }
- </call>
-
- <message>
- 'Create synchronization provider'
- </message>
-
- <call function="'createSyncProvider'">
{ 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
- 'dsInstanceHost' : syncserver.getHostname(),
- 'dsInstancePort' : syncserver.getPort(),
- 'dsInstanceDn' : syncserver.getRootDn(),
- 'dsInstancePswd' : syncserver.getRootPwd() }
+ 'dsPath' : syncserverPath
+ }
</call>
-
+
+ <message>
+ 'Create synchronization provider'
+ </message>
+
+ <call function="'createSyncProvider'">
+ { 'location' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
+ 'dsInstanceHost' : syncserver.getHostname(),
+ 'dsInstancePort' : syncserver.getPort(),
+ 'dsInstanceDn' : syncserver.getRootDn(),
+ 'dsInstancePswd' : syncserver.getRootPwd()
+ }
+ </call>
+
<script>
replicationServer = syncserver.getChangelogServer()
replicatedSuffixList = syncserver.getSynchronizedSuffixList()
- </script>
-
+ </script>
+
<if expr="replicationServer">
<sequence>
<message>
'Create replication server listening on port: %s' % replicationServer.getPort()
</message>
-
- <call function="'createReplicationServer'">
- { 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
- 'dsInstanceHost' : syncserver.getHostname(),
- 'dsInstancePort' : syncserver.getPort(),
- 'dsInstanceDn' : syncserver.getRootDn(),
- 'dsInstancePswd' : syncserver.getRootPwd(),
- 'replicationPort' : replicationServer.getPort(),
- 'replicationServerId' : replicationServer.getId(),
- 'replicationServerList' : replicationServer.getChangelogServerList() }
- </call>
- </sequence>
+ <call function="'createReplicationServer'">
+ { 'location' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
+ 'dsInstanceHost' : syncserver.getHostname(),
+ 'dsInstancePort' : syncserver.getPort(),
+ 'dsInstanceDn' : syncserver.getRootDn(),
+ 'dsInstancePswd' : syncserver.getRootPwd(),
+ 'replicationPort' : replicationServer.getPort(),
+ 'replicationServerId' : replicationServer.getId(),
+ 'replicationServerList' : replicationServer.getChangelogServerList()
+ }
+ </call>
+ </sequence>
</if>
-
-
+
<iterate var="suffix" in="replicatedSuffixList" indexvar="i">
<sequence>
<message>
'Create domain name for suffix: %s' % suffix.getSuffixDn()
</message>
-
- <call function="'createMultimasterDomain'">
- { 'location' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
- 'dsInstanceHost' : syncserver.getHostname(),
- 'dsInstancePort' : syncserver.getPort(),
- 'dsInstanceDn' : syncserver.getRootDn(),
- 'dsInstancePswd' : syncserver.getRootPwd(),
- 'domainName' : 'SUFFIX-%s' % i,
- 'replicationDn' : suffix.getSuffixDn(),
- 'serverId' : suffix.getId(),
- 'replicationServerList' : suffix.getChangelogServerList() }
- </call>
+ <call function="'createMultimasterDomain'">
+ { 'location' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
+ 'dsInstanceHost' : syncserver.getHostname(),
+ 'dsInstancePort' : syncserver.getPort(),
+ 'dsInstanceDn' : syncserver.getRootDn(),
+ 'dsInstancePswd' : syncserver.getRootPwd(),
+ 'domainName' : 'SUFFIX-%s' % i,
+ 'replicationDn' : suffix.getSuffixDn(),
+ 'serverId' : suffix.getId(),
+ 'replicationServerList' : suffix.getChangelogServerList()
+ }
+ </call>
</sequence>
- </iterate>
-
-
+ </iterate>
+
<!--- Stop DS -->
<call function="'StopDsWithScript'">
{ 'location' : syncserver.getHostname(),
- 'dsHost' : syncserver.getHostname(),
- 'dsPath' : syncserverPath,
+ 'dsHost' : syncserver.getHostname(),
+ 'dsPath' : syncserverPath,
'dsPort' : syncserver.getPort(),
'dsBindDN' : syncserver.getRootDn(),
- 'dsBindPwd' : syncserver.getRootPwd() }
- </call>
-
- </sequence>
- </function>
-
-
+ 'dsBindPwd' : syncserver.getRootPwd()
+ }
+ </call>
+ </sequence>
+ </function>
+
+
<function name="readTopology">
<function-prolog>
- This function reads the topology from a given file.
- It parses the topology description file and sets _topologyServerList, a list of the servers
- that form the topology.
- </function-prolog>
+ This function reads the topology from a given file.
+ It parses the topology description file and sets _topologyServerList, a list of the servers
+ that form the topology.
+ </function-prolog>
- <function-map-args>
- <function-arg-def name="file" type="required">
- <function-arg-description>
- File containing the topology description.
- </function-arg-description>
- <function-arg-property name="type" value="filePath"/>
- </function-arg-def>
- </function-map-args>
+ <function-map-args>
+ <function-arg-def name="file" type="required">
+ <function-arg-description>
+ File containing the topology description.
+ </function-arg-description>
+ <function-arg-property name="type" value="filePath"/>
+ </function-arg-def>
+ </function-map-args>
- <sequence>
-
- <message>
- 'Parse file %s for topology parameters' % file
- </message>
-
- <script>
+ <sequence>
+ <message>
+ 'Parse file %s for topology parameters' % file
+ </message>
+
+ <script>
_topologyServerList = []
f = open(file, 'r')
@@ -692,7 +690,7 @@
dir = None
port = None
sslport = None
- jmxport = None
+ jmxport = None
rootDn = None
rootPwd = None
baseDn = None
@@ -715,7 +713,7 @@
elif line.find('Sslport') != -1:
sslport = line[line.find('Sslport') + 8:].strip()
elif line.find('Jmxport') != -1:
- jmxport = line[line.find('Jmxport') + 8:].strip()
+ jmxport = line[line.find('Jmxport') + 8:].strip()
elif line.find('RootDn') != -1:
rootDn = line[line.find('RootDn') + 7:].strip()
elif line.find('RootPwd') != -1:
@@ -753,7 +751,7 @@
dir = None
port = None
sslport = None
- jmxport = None
+ jmxport = None
rootDn = None
rootPwd = None
baseDn = None
@@ -764,7 +762,7 @@
if hostname != None:
server = Server(hostname, dir, port, sslport, jmxport, rootDn, rootPwd, baseDn)
-
+
if changelogport != None:
changelogServer = ChangelogServer(changelogport, serverId)
for item in changelogList:
@@ -772,7 +770,7 @@
prt = item[item.find(':') + 1:]
changelogServer.addChangelogServer(srv, prt)
server.addChangelogServer(changelogServer)
-
+
for suffix in suffixList:
synchroSuffix = SynchronizedSuffix(suffix, serverId)
for item in changelogList:
@@ -784,134 +782,115 @@
_topologyServerList.append(server)
f.close()
- </script>
-
-
- </sequence>
-
- </function>
+ </script>
+ </sequence>
+ </function>
<function name="removeInstance">
<function-prolog>
- This function removes an instance on a given host.
- </function-prolog>
-
- <function-map-args>
- <function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
- <function-arg-description>
- Hostname where the instance is to be created
- </function-arg-description>
+ This function removes an instance on a given host.
+ </function-prolog>
+
+ <function-map-args>
+ <function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
+ <function-arg-description>
+ Hostname where the instance is to be created
+ </function-arg-description>
<function-arg-property name="type" value="hostname"/>
- </function-arg-def>
- <function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
- <function-arg-description>
- Directory where OpenDS will be installed
- </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
+ <function-arg-description>
+ Directory where OpenDS will be installed
+ </function-arg-description>
<function-arg-property name="type" value="filepath"/>
</function-arg-def>
- </function-map-args>
-
-
- <sequence>
-
- <message>
- 'Removing instance %s/%s on host %s' % (dsDir,OPENDSNAME,dsHost)
- </message>
-
-
- <!-- ON REMOTE HOST: remove files and folders -->
- <!--- Delete staging data file on remote host-->
- <message>
- 'Delete staging data file %s/testdata.zip' % dsDir
- </message>
- <call function="'deleteFile'">
- { 'location' : dsHost,
- 'filename' : '%s/testdata.zip' % dsDir }
- </call>
+ </function-map-args>
- <!--- Delete staging data folder on remote host -->
- <message>
- 'Delete staging data folder %s/shared' % dsDir
- </message>
- <call function="'deleteFolder'">
- { 'location' : dsHost,
- 'foldername' : '%s/shared' % dsDir }
- </call>
-
-
-
- <!--- Delete OPENDS zip file on remote host-->
- <message>
- 'Delete OPENDS zip file %s/%s' % (dsDir,ZIPNAME)
- </message>
- <call function="'deleteFile'">
- { 'location' : dsHost,
- 'filename' : '%s/%s' % (dsDir,ZIPNAME) }
- </call>
-
-
+ <sequence>
+ <message>
+ 'Removing instance %s/%s on host %s' % (dsDir,OPENDSNAME,dsHost)
+ </message>
+
+ <!-- ON REMOTE HOST: remove files and folders -->
+ <!--- Delete staging data file on remote host-->
+ <message>
+ 'Delete staging data file %s/testdata.zip' % dsDir
+ </message>
+ <call function="'deleteFile'">
+ { 'location' : dsHost,
+ 'filename' : '%s/testdata.zip' % dsDir
+ }
+ </call>
+
+ <!--- Delete staging data folder on remote host -->
+ <message>
+ 'Delete staging data folder %s/shared' % dsDir
+ </message>
+ <call function="'deleteFolder'">
+ { 'location' : dsHost,
+ 'foldername' : '%s/shared' % dsDir
+ }
+ </call>
+
+ <!--- Delete OPENDS zip file on remote host-->
+ <message>
+ 'Delete OPENDS zip file %s/%s' % (dsDir,ZIPNAME)
+ </message>
+ <call function="'deleteFile'">
+ { 'location' : dsHost,
+ 'filename' : '%s/%s' % (dsDir,ZIPNAME) }
+ </call>
+
<call function="'checkRC'">
{ 'returncode' : RC ,
- 'result' : STAXResult }
+ 'result' : STAXResult
+ }
</call>
-
<if expr="returncode == 0">
- <message>
- 'Instance removed.'
- </message>
- <else>
- <message>
- 'Failed to remove instance.'
- </message>
- </else>
- </if>
-
- </sequence>
-
+ <message>
+ 'Instance removed.'
+ </message>
+ <else>
+ <message>
+ 'Failed to remove instance.'
+ </message>
+ </else>
+ </if>
+ </sequence>
</function>
-
-
+
<function name="removeTopology">
<function-prolog>
- This function removes the topology created for the Test Group/Suite.
- </function-prolog>
- <function-map-args>
- <function-arg-def name="multipleInstanceTopology" type="optional" default="False">
- <function-arg-description>
- Tells whether it is a single (i.e. parameters read from config.py) or
- a multiple-instance topology (i.e. parameters read from topology desc file).
- </function-arg-description>
- <function-arg-property name="type" value="boolean"/>
- </function-arg-def>
- </function-map-args>
-
- <sequence>
-
- <if expr="multipleInstanceTopology == False">
- <!-- SINGLE instance deployment: parameters read from config.py (done by default) -->
-
- <call function="'removeInstance'"></call>
-
- <else>
- <!-- MULTIPLE instance deployment: parameters read from topologyDescFile -->
- <iterate var="server" in="_topologyServerList">
-
- <call function="'removeInstance'">
- { 'dsHost' : server.getHostname(),
- 'dsDir' : server.getDir() }
- </call>
-
- </iterate>
- </else>
- </if>
-
- </sequence>
-
+ This function removes the topology created for the Test Group/Suite.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="multipleInstanceTopology" type="optional" default="False">
+ <function-arg-description>
+ Tells whether it is a single (i.e. parameters read from config.py) or
+ a multiple-instance topology (i.e. parameters read from topology desc file).
+ </function-arg-description>
+ <function-arg-property name="type" value="boolean"/>
+ </function-arg-def>
+ </function-map-args>
+ <sequence>
+ <if expr="multipleInstanceTopology == False">
+ <!-- SINGLE instance deployment: parameters read from config.py (done by default) -->
+ <call function="'removeInstance'" />
+ <else>
+ <!-- MULTIPLE instance deployment: parameters read from topologyDescFile -->
+ <iterate var="server" in="_topologyServerList">
+ <call function="'removeInstance'">
+ { 'dsHost' : server.getHostname(),
+ 'dsDir' : server.getDir()
+ }
+ </call>
+ </iterate>
+ </else>
+ </if>
+ </sequence>
</function>
-
-
</stax>
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/functions/utils.xml b/opendj-sdk/opends/tests/functional-tests/shared/functions/utils.xml
index 728a832..9ee729e 100755
--- a/opendj-sdk/opends/tests/functional-tests/shared/functions/utils.xml
+++ b/opendj-sdk/opends/tests/functional-tests/shared/functions/utils.xml
@@ -434,7 +434,14 @@
</function-prolog>
<function-no-args />
<sequence>
- <message>''</message>
+ <script>
+ testcaseStartTime=strftime("%Y%m%d@%H:%M:%S",localtime())
+ myLog = open('%s/my.log' % TMPDIR, 'a')
+ myLog.seek(0,2)
+ myLog.write('%s - starting testcase: %s\n' % (testcaseStartTime, STAXCurrentTestcase ) )
+ myLog.close()
+ </script>
+ <message level="'start'">'testcase: %s' % STAXCurrentTestcase</message>
<message>'****************************************************'</message>
<message>'*** STARTING TEST CASE %s.' % STAXCurrentTestcase</message>
<message>'***'</message>
@@ -450,7 +457,7 @@
<message>'***'</message>
<message>'*** ENDING TEST CASE %s.' % STAXCurrentTestcase</message>
<message>'****************************************************'</message>
- <message>''</message>
+ <message level="'stop'">'testcase: %s' % STAXCurrentTestcase</message>
</sequence>
</function>
@@ -499,16 +506,98 @@
numFail=int(STAFResult['numFails'])
else:
numFail=int(0)
+
</script>
<if expr="numFail > 0">
- <message>'## Test Verdict: FAIL ##'</message>
+ <message level="'status'">'## Test Verdict: FAIL ##'</message>
<else>
- <message>'## Test Verdict: PASS ##'</message>
+ <message level="'status'">'## Test Verdict: PASS ##'</message>
</else>
- </if>
-
+ </if>
<call function="'testCase_EndBanner'" />
+
+ <script>
+ testcaseEndTime = strftime("%Y%m%d@%H:%M:%S",localtime())
+ </script>
+ <call function="'queryLogs'">
+ { 'location' : STAXServiceMachine,
+ 'logname' : 'STAX_Job_%s_User' % STAXJobID,
+ 'startfrom' : testcaseStartTime,
+ 'endat' : testcaseEndTime }
+ </call>
+ <script>
+ class Test:
+ def __init__(self, group, suite, fullname, start, stop, failures):
+ self.log=''
+ self.group=group
+ self.suite=suite
+ self.fullname=fullname
+ self.start=start
+ self.stop=stop
+ tmp=fullname.split(":")
+ del tmp[0:2]
+ self.name=''.join(tmp)
+ self.duration = 0
+ if failures == 0:
+ self.result='pass'
+ else:
+ self.result='fail'
+
+ def toXML(self):
+ xml = ' <test>\n'
+ xml += ' <name>%s</name>\n' % self.name
+ xml += ' <group>%s</group>\n' % self.group
+ xml += ' <suite>%s</suite>\n' % self.suite
+ xml += ' <start>%s</start>\n' % self.start
+ xml += ' <stop>%s</stop>\n' % self.stop
+ xml += ' <result>%s</result>\n' % self.result
+ xml += ' <duration>%d</duration>\n' % self.duration
+ xml += ' <log>\n'
+ xml += '%s' % self.log
+ xml += ' </log>\n'
+ xml += ' </test>\n'
+ return xml
+
+ def appendLog(self, log):
+ self.log +=' %s<br />\n' % log
+
+ def getName(self):
+ return self.name
+
+ thisTest = Test(CurrentTestPath['group'],CurrentTestPath['suite'],STAXCurrentTestcase, testcaseStartTime,testcaseEndTime,numFail)
+
+ doLog = False
+ testlog=open('%s/test.log' % TMPDIR,'a')
+ testlog.seek(0,2)
+
+ # loop through the log lines
+ for element in STAFResult:
+ level=element['level']
+
+ # this test is BEFORE the append so we don't get the
+ # end of testcase banner in the XML but only the relevant data
+ if level == 'Stop':
+ doLog=False
+
+ # if the current element is actually this test's output then log it
+ if doLog == True:
+ thisTest.appendLog(element['message'])
+
+ # this test is AFTER the append log so we don't get the
+ # "starting testcase ..." header in the XML
+ if level == 'Start':
+ tmp = element['message'].split(':')
+ # this is a verification that we start logging for the right
+ # test case. this is especially useful for tests that execute
+ # within the same second (that is the resolution of the STAF
+ # log facility)
+ if tmp[3] == thisTest.getName():
+ doLog=True
+
+ testlog.write(thisTest.toXML())
+ testlog.close()
+ </script>
</sequence>
</function>
@@ -529,6 +618,18 @@
ThisGroupName=CurrentTestPath['group']
ThisSuiteName=CurrentTestPath['suite']
+
+ mylog='::coverage: begin\n'
+ if os.path.exists('%s/classes' % dsPath):
+ mylog+='::coverage: setting %s/%s.coverage to file %s/classes/emma.properties\n' % (TMPDIR,CurrentTestPath['group'],dsPath)
+ coveragefh = open( '%s/classes/emma.properties' % dsPath, 'w' )
+ coveragefh.write( 'coverage.out.file=%s/%s.coverage\n' % (TMPDIR,CurrentTestPath['group']) )
+ coveragefh.close()
+ coveragefh = open( '%s/classes/emma.properties' % dsPath, 'r' )
+ mylog+='::coverage:contents: %s' % coveragefh.read()
+ coveragefh.close()
+
+
</script>
<!-- Start time of test suite -->
@@ -608,7 +709,7 @@
if not CurrentTestPath.has_key('group'):
CurrentTestPath['group']='unknown-group'
- ThisGroupName=CurrentTestPath['group']
+ ThisGroupName=CurrentTestPath['group']
</script>
<message>'##### %s group preamble #####' % ThisGroupName</message>
@@ -956,4 +1057,66 @@
</sequence>
</function>
+ <function name="runCommand" >
+ <function-description>
+ A general wrapper to run a command without having to write a dedicated
+ function for it
+ </function-description>
+ <function-map-args>
+ <function-arg-def name="command" type="required">
+ <function-arg-description>
+ the command to run
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="path" type="optional" default="'%s' % dsPath">
+ <function-arg-description>
+ the path where the command is to be run from
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="argmunents" type="optional" default="''">
+ <function-arg-description>
+ the path where the command is to be found
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="env"
+ type="optional"
+ default="['PATH=/bin:/usr/bin:%s' % dsPath, 'JAVA_HOME=%s' % JAVA_HOME]">
+ <function-arg-description>
+ the environment variables to set. The default set here should just
+ work for OpenDS commands
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="location"
+ type="optional"
+ default="'%s' % STAXServiceMachine">
+ <function-arg-description>
+ Which machine should the command be executed on
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+ <sequence>
+ <message>
+ '%s' % command
+ </message>
+
+ <process name="'run a system command'">
+ <location>'%s' % location</location>
+ <command>'%s' % command</command>
+ <parms>'%s' % arguments</parms>
+ <workdir>'%s' % path</workdir>
+ <envs>
+ '%s' % env
+ </envs>
+ <console use="'same'"/>
+ <stderr mode="'stdout'"/>
+ <returnstdout/>
+ </process>
+ <script>
+ STAXResult.replace('EMMA: collecting runtime coverage data ...\n','')
+ </script>
+ <return>
+ [ RC , STAXResult ]
+ </return>
+ </sequence>
+ </function>
</stax>
--
Gitblit v1.10.0