runTestJob.xml revision d81978a0815d5b8a75633c35e3e1f8708d36f017
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "/shared/stax.dtd">
<!--
! CDDL HEADER START
!
! The contents of this file are subject to the terms of the
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
!
! You can obtain a copy of the license at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE
! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
! See the License for the specific language governing permissions
! and limitations under the License.
!
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
! Copyright 2006-2008 Sun Microsystems, Inc.
! -->
<stax>
<defaultcall function="start_job"/>
<function name="start_job">
<function-single-arg>
<function-optional-arg name="config" default="''"/>
</function-single-arg>
<sequence>
<script>
STAXLogMessage = 1
</script>
<script>
if config:
import os, sys
myconfigpath,myconfigfile=os.path.split(config)
sys.path.append("%s" % myconfigpath )
from config import *
else:
myconfigpath='%s/config' % TESTS_DIR
myconfigfile='config.py'
</script>
<job name="'Job: %s %s' % (STAF_REMOTE_HOSTNAME,TEST_OS_STRING) " monitor="1" clearlogs="'Enabled'" logtcstartstop="'Enabled'">
<job-file>'%s/testcases/runStressTests.xml' % TESTS_DIR</job-file>
<job-scriptfiles machine="STAF_LOCAL_HOSTNAME">['%s/%s' % (myconfigpath,myconfigfile) ]</job-scriptfiles>
<job-action>
<log>'Started sub-job %s on %s' % (STAXSubJobID,STAF_REMOTE_HOSTNAME)</log>
</job-action>
</job>
<if expr="RC == 0">
<message>
'Sub-job %s completed. Result: %s' % (STAXSubJobID, STAXResult)
</message>
<else>
<sequence>
<message log="1" level="'Error'">'Sub-job %s could not be started. RC: %s Result: %s' % (STAXSubJobID,RC,STAFResult)</message>
<return>1</return>
</sequence>
</else>
</if>
<!--- Import required shared xml libraries -->
<import machine="STAF_LOCAL_HOSTNAME"
file="'%s/stafcmd.xml' % TESTS_FUNCTIONS_DIR" />
<!--
dirty workaround because utils.xml now depends on environment.xml
to avoid loading environment.xml I'll just set the required vars here
allegedly ugly
-=arnaud=-
-->
<script>
NO_CHECK = 'noCheck'
</script>
<import machine="STAF_LOCAL_HOSTNAME"
file="'%s/utils.xml' % (TESTS_FUNCTIONS_DIR)" />
<!-- Get Directory Server Variables -->
<call function="'GetVar'">
{ 'location' : STAF_REMOTE_HOSTNAME,
'type' : 'shared',
'variable' : 'Job%s_ServerInfo' % STAXSubJobID
}
</call>
<if expr="RC != 0">
<script>
STAFResult='{}'
</script>
</if>
<!-- Build the Servers Information Dictionary -->
<script>
ServersInfoDict=eval(STAFResult)
ServerVersion='unknown'
ServerBuildId='unknown'
ServerJavaVersion='unknown'
ServerJavaVendor='unknown'
ServerJVMVersion='unknown'
ServerJVMVendor='unknown'
ServerSystemOS='unknown'
ServerSystemName='unknown'
ServerSvnRevision='unknown'
if ServersInfoDict.has_key('%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)):
ServerInfoDict=ServersInfoDict['%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)]
ServerInfoKey='server version'
if ServerInfoDict.has_key(ServerInfoKey):
ServerVersion=ServerInfoDict[ServerInfoKey]
ServerInfoKey='server buildid'
if ServerInfoDict.has_key(ServerInfoKey):
ServerBuildId=ServerInfoDict[ServerInfoKey]
ServerInfoKey='java version'
if ServerInfoDict.has_key(ServerInfoKey):
ServerJavaVersion=ServerInfoDict[ServerInfoKey]
ServerInfoKey='java vendor'
if ServerInfoDict.has_key(ServerInfoKey):
ServerJavaVendor=ServerInfoDict[ServerInfoKey]
ServerInfoKey='jvm version'
if ServerInfoDict.has_key(ServerInfoKey):
ServerJVMVersion=ServerInfoDict[ServerInfoKey]
ServerInfoKey='jvm vendor'
if ServerInfoDict.has_key(ServerInfoKey):
ServerJVMVendor=ServerInfoDict[ServerInfoKey]
ServerInfoKey='system os'
if ServerInfoDict.has_key(ServerInfoKey):
ServerSystemOS=ServerInfoDict[ServerInfoKey]
ServerInfoKey='system name'
if ServerInfoDict.has_key(ServerInfoKey):
ServerSystemName=ServerInfoDict[ServerInfoKey]
ServerInfoKey='svn revision'
if ServerInfoDict.has_key(ServerInfoKey):
ServerSvnRevision=ServerInfoDict[ServerInfoKey]
else:
ServerInfoDict='No key found (%s/%s)' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)
</script>
<message>'Server= %s' % ServerInfoDict </message>
<stafcmd name="'STAF Command: Log Query All'">
<location>'%s' % STAF_LOCAL_HOSTNAME </location>
<service>'log'</service>
<request>
'QUERY ALL MACHINE %s LOGNAME STAX_Job_%s' % (STAXServiceMachine,STAXSubJobID)
</request>
</stafcmd>
<if expr="RC == 0">
<sequence>
<script>
resultQuery= STAFResult
</script>
<message>
'Log Query on STAX_Job_%s Completed. RC=%s' % (STAXSubJobID,RC)
</message>
</sequence>
<else>
<sequence>
<message log="1" level="'Error'">
'Unable to perform log query on STAX_Job_%s. RC: %s Result: %s' % (STAXSubJobID,RC,STAFResult)
</message>
<return>1</return>
</sequence>
</else>
</if>
<!-- Get logsDir Variable -->
<call function="'GetVar'">
{ 'location' : STAF_REMOTE_HOSTNAME,
'type' : 'shared',
'variable' : 'Job%s_LogsDir' % STAXSubJobID
}
</call>
<if expr="RC == 0">
<script>
logsDir=STAFResult
</script>
<else>
<sequence>
<message>
'Unable to retrieve LogsDir variable, RC=%s,Result=%s.' % (RC,STAFResult)
</message>
<script>
logsDir='%s' % TMPDIR
</script>
</sequence>
</else>
</if>
<script>
logsReportDir='%s/reports' % logsDir
</script>
<call function="'createFolder'">
{ 'location' : STAF_LOCAL_HOSTNAME,
'foldername' : logsReportDir }
</call>
<!-- Write Text File for results -->
<script>
textfile= '%s/results.txt' % logsReportDir
txtfh=open(textfile,'w')
</script>
<iterate var="line" in="resultQuery">
<script>
txtfh.write('%s\n' % line)
</script>
</iterate>
<script>
txtfh.close()
</script>
<message>
'TEXT Report Written to %s.' % textfile
</message>
<!-- Write XML File for results -->
<script>
import re
xmlfile= '%s/results.xml' % logsReportDir
xmlfh=open(xmlfile,'w')
errorfile= '%s/results.errors' % logsReportDir
errorfh=open(errorfile,'w')
</script>
<!-- Build the test case dictionary object -->
<script>
testDict={}
testCaseList=[]
</script>
<iterate var="element" in="resultQuery">
<script>
level=element['level']
message=element['message']
timestamp=element['timestamp']
startValueDict={}
stopValueDict={}
statusValueDict={}
if level == 'Start':
tcpattern=re.compile("(Testcase): (.*)")
tcmatch = tcpattern.search(message)
if tcmatch:
tctype=tcmatch.group(1)
tcname=tcmatch.group(2)
if testDict.has_key(tcname):
for key in testDict[tcname].keys():
value=testDict[tcname][key]
startValueDict[key]=value
startValueDict['start']=timestamp
testDict[tcname]=startValueDict
testCaseList.append(tcname)
else:
errorfh.write('Warning: No match Start element %s.\n' % element)
elif level == 'Stop':
tcpattern=re.compile("(Testcase): (.*), ElapsedTime: (.*)")
tcmatch = tcpattern.search(message)
if tcmatch:
tctype=tcmatch.group(1)
tcname=tcmatch.group(2)
tctime=tcmatch.group(3)
if testDict.has_key(tcname):
for key in testDict[tcname].keys():
value=testDict[tcname][key]
stopValueDict[key]=value
stopValueDict['stop']=timestamp
stopValueDict['duration']=tctime
testDict[tcname]=stopValueDict
else:
errorfh.write('Warning: No match Stop element %s.\n' % element)
elif level == 'Status':
tcpattern=re.compile("(Testcase): (.*), Pass: (.*), Fail: (.*), ElapsedTime: (.*), NumStarts: (.*)")
tcmatch = tcpattern.search(message)
if tcmatch:
tctype=tcmatch.group(1)
tcname=tcmatch.group(2)
tcpass=tcmatch.group(3)
tcfail=tcmatch.group(4)
tctime=tcmatch.group(5)
tcnums=tcmatch.group(6)
if testDict.has_key(tcname):
for key in testDict[tcname].keys():
value=testDict[tcname][key]
statusValueDict[key]=value
statusValueDict['pass']=tcpass
statusValueDict['fail']=tcfail
testDict[tcname]=statusValueDict
else:
errorfh.write('Warning: No match Status element %s.\n' % element)
elif level == 'Info':
errorfh.write('Warning: Info element %s.\n' % element)
else:
errorfh.write('Error: Unknown element %s.\n' % element)
</script>
</iterate>
<!-- XML Report Pre -->
<script>
xmlfh.write('&lt;qa&gt;\n')
xmlfh.write(' &lt;functional-tests&gt;\n')
xmlfh.write(' &lt;identification&gt;\n')
xmlfh.write(' &lt;version&gt;\n')
xmlfh.write(' %s\n' % ServerVersion)
xmlfh.write(' &lt;/version&gt;\n')
xmlfh.write(' &lt;buildid&gt;\n')
xmlfh.write(' %s\n' % ServerBuildId)
xmlfh.write(' &lt;/buildid&gt;\n')
xmlfh.write(' &lt;revision&gt;\n')
xmlfh.write(' %s\n' % ServerSvnRevision)
xmlfh.write(' &lt;/revision&gt;\n')
xmlfh.write(' &lt;platform&gt;\n')
xmlfh.write(' %s\n' % ServerSystemOS)
xmlfh.write(' &lt;/platform&gt;\n')
xmlfh.write(' &lt;jvm-version&gt;\n')
xmlfh.write(' %s\n' % ServerJVMVersion)
xmlfh.write(' &lt;/jvm-version&gt;\n')
xmlfh.write(' &lt;jvm-vendor&gt;\n')
xmlfh.write(' %s\n' % ServerJVMVendor)
xmlfh.write(' &lt;/jvm-vendor&gt;\n')
xmlfh.write(' &lt;/identification&gt;\n')
xmlfh.write(' &lt;results&gt;\n')
</script>
<!-- XML Report Results -->
<script>
for tcname in testCaseList:
if testDict.has_key(tcname):
tcnamesplit=tcname.split(":")
if tcnamesplit[0]:
testgroup=tcnamesplit[0]
if tcnamesplit[1]:
testsuite=tcnamesplit[1]
else:
testsuite=testgroup
else:
testgroup=tcname
testsuite=tcname
if testDict[tcname].has_key('pass'):
tcpass=testDict[tcname]['pass']
else:
tcpass='0'
if testDict[tcname].has_key('fail'):
tcfail=testDict[tcname]['fail']
else:
tcfail='0'
if testDict[tcname].has_key('start'):
tcstart=testDict[tcname]['start']
else:
tcstart='unknown'
if testDict[tcname].has_key('stop'):
tcstop=testDict[tcname]['stop']
else:
tcstop='unknown'
if testDict[tcname].has_key('duration'):
tcduration=testDict[tcname]['duration']
else:
duration='unknown'
else:
errorfh.write('No key for testcase %s.\n' % tcname)
if int(tcfail) == 0 and int(tcpass) > 0:
tcresult='pass'
elif int(tcfail) == 0 and int(tcpass) == 0:
tcresult='unknown'
else:
tcresult='fail'
xmlfh.write(' &lt;testgroup name="%s"&gt;\n' % testgroup)
xmlfh.write(' &lt;testsuite name="%s"&gt;\n' % testsuite)
xmlfh.write(' &lt;testcase name="%s" result="%s" start="%s" stop="%s" duration="%s"/&gt;\n' % (tcname,tcresult,tcstart,tcstop,tcduration))
xmlfh.write(' &lt;/testsuite&gt;\n')
xmlfh.write(' &lt;/testgroup&gt;\n')
</script>
<!-- XML Report Post -->
<script>
xmlfh.write(' &lt;/results&gt;\n')
xmlfh.write(' &lt;/functional-tests&gt;\n')
xmlfh.write('&lt;/qa&gt;\n')
</script>
<script>
xmlfh.close()
errorfh.close()
</script>
<message>
'XML Report Written to %s.' % xmlfile
</message>
<!-- Transform Report XML into HTML -->
<script>
xslfile= '%s/xsl/gen-alltests-report.xsl' % TESTS_SHARED_DIR
htmlfile= '%s/results.html' % logsReportDir
</script>
<message>
'Writing HTML (with stylesheet %s) Report to %s.' % (xslfile,htmlfile)
</message>
<script>
_message=''
try:
from java.io import FileInputStream
from java.io import FileOutputStream
from java.io import ByteArrayOutputStream
from javax.xml.transform import TransformerFactory
from javax.xml.transform.stream import StreamSource
from javax.xml.transform.stream import StreamResult
xslSource = StreamSource(FileInputStream("%s" % xslfile))
xslTemplate = TransformerFactory.newInstance().newTemplates(xslSource)
transformer = xslTemplate.newTransformer()
source = StreamSource(FileInputStream("%s" % xmlfile))
result = StreamResult(FileOutputStream("%s" % htmlfile))
# the original report
transformer.transform(source, result)
#the new report transformation
TransformerFactory.newInstance().newTemplates(StreamSource(FileInputStream("%s/xsl/my-report.xsl" % TESTS_SHARED_DIR))).newTransformer().transform(StreamSource(FileInputStream("%s/tests-log.xml" % TMPDIR)), StreamResult(FileOutputStream("%s/my-report.html" % TMPDIR)))
_message='Generated drill-down HTML report'
except:
_message='Could not generate drill-down HTML report'
</script>
<message>_message</message>
<if expr="SEND_MAIL_AFTER_TEST_RUN == 'TRUE'">
<sequence>
<message>
'Sending Email Test Report to %s.' % SEND_MAIL_TO
</message>
<script>
MailToList= SEND_MAIL_TO.split(",")
MailSubject= 'OpenDS Test Report for %s' % STAF_REMOTE_HOSTNAME
MailSendTo= ' '
</script>
<iterate var="Recipient" in="MailToList">
<script>
MailSendTo='to %s %s' % (Recipient,MailSendTo)
</script>
</iterate>
<stafcmd name="'STAF Command: Send test report %s' % MailSendTo">
<location>'%s' % STAF_LOCAL_HOSTNAME </location>
<service>'email'</service>
<request>
'send %s contenttype "text/html" file %s subject "%s" noheader' % (MailSendTo,htmlfile,MailSubject)
</request>
</stafcmd>
<if expr="RC != 0">
<message log="1" level="'Error'">
'Send test report failed. RC: %s STAFResult: %s' % (RC,STAFResult)
</message>
<else>
<message>
'Send test report successful. RC: %s' % (RC)
</message>
</else>
</if>
</sequence>
</if>
</sequence>
</function>
</stax>