mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

gary_williams
22.18.2008 1d57697f64077ab0d3435ac746a12d5816602926
Issue 2752: ensure well formed XML in test reports (part 1)
4 files modified
527 ■■■■ changed files
opends/tests/staf-tests/functional-tests/shared/xsl/gen-groups-report.xsl 2 ●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/xsl/gen-suites-report.xsl 2 ●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/python/common.py 30 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/tests/runTestJob.xml 493 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/xsl/gen-groups-report.xsl
@@ -43,7 +43,7 @@
  <xsl:variable name="testware"       select="$id/testware"/>
  <xsl:variable name="mailto"         select="normalize-space($id/mailto)"/>
  <xsl:variable name="tests-dir"      select="normalize-space($id/tests-dir)"/>
  <xsl:variable name="url"            select="normalize-space($sut/tests-url)"/>
  <xsl:variable name="url"            select="normalize-space($id/tests-url)"/>
  <xsl:variable name="hostname"       select="normalize-space($sut/hostname)"/>
  <xsl:variable name="version"        select="normalize-space($sut/version)"/>
  <xsl:variable name="buildid"        select="normalize-space($sut/buildid)"/>
opends/tests/staf-tests/functional-tests/shared/xsl/gen-suites-report.xsl
@@ -45,7 +45,7 @@
  <xsl:variable name="sut"            select="$id/sut"/>
  <xsl:variable name="mailto"         select="normalize-space($id/mailto)"/>
  <xsl:variable name="tests-dir"      select="normalize-space($id/tests-dir)"/>
  <xsl:variable name="url"            select="normalize-space($sut/tests-url)"/>
  <xsl:variable name="url"            select="normalize-space($id/tests-url)"/>
  <xsl:variable name="hostname"       select="normalize-space($sut/hostname)"/>
  <xsl:variable name="version"        select="normalize-space($sut/version)"/>
  <xsl:variable name="buildid"        select="normalize-space($sut/buildid)"/>
opends/tests/staf-tests/shared/python/common.py
@@ -266,24 +266,36 @@
    return sfx
class staf_service:  
  'Container to hold staf service instance objects'
  def __init__(self,host,name):
    from com.ibm.staf import STAFHandle
    from com.ibm.staf import STAFResult
    from com.ibm.staf import STAFMarshallingContext
    __handle = STAFHandle("varHandle")
    self.name=name
    self.library='Unknown'
    self.executable='Unknown'
    self.options='Unknown'
    self.params='Unknown'
    try:
      __handle = STAFHandle("varHandle")
    except STAFException, e:
      pass
    __cmd = 'QUERY SERVICE %s' % name
    __res = __handle.submit2(host, "SERVICE", __cmd)
    __context = STAFMarshallingContext.unmarshall(__res.result)
    __entryMap = __context.getRootObject()
    self.name=__entryMap['name']
    self.library=__entryMap['library']
    self.executable=__entryMap['executable']
    self.options=__entryMap['options']
    self.params=__entryMap['parameters']
    if (__res.rc == 0):
      __context = STAFMarshallingContext.unmarshall(__res.result)
      __entryMap = __context.getRootObject()
      self.name=__entryMap['name']
      self.library=__entryMap['library']
      self.executable=__entryMap['executable']
      self.options=__entryMap['options']
      self.params=__entryMap['parameters']
  def get_library(self):
    return self.library
opends/tests/staf-tests/shared/tests/runTestJob.xml
@@ -143,7 +143,8 @@
        ServersInfoDict=eval(STAFResult)
        ServerName='unknown'
        ServerPath='%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)
        ServerName='unknown'
        ServerVersion='unknown'
        ServerBuildId='unknown'
        ServerJavaVersion='unknown'
@@ -154,12 +155,12 @@
        ServerJVMLabel='unknown'
        ServerSystemOS='unknown'
        ServerSystemName='unknown'
        ServerSvnRevision='unknown'
        ServerRevision='unknown'
        ServerPackage='%s/%s' % (ZIPPATH,ZIPNAME)
        ServerSNMPJarFile='%s' % SNMP_OPENDMK_JARFILE
        if ServersInfoDict.has_key('%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)):
          ServerInfoDict=ServersInfoDict['%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)]
        if ServersInfoDict.has_key(ServerPath):
          ServerInfoDict=ServersInfoDict[ServerPath]
          ServerName=OPENDSNAME
@@ -204,7 +205,7 @@
            ServerSvnRevision=ServerInfoDict[ServerInfoKey]
        else:
          ServerInfoDict='No key found (%s/%s)' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)
          ServerInfoDict='No key found (%s)' % ServerPath
        if ServerOsString == 'Unknown Operating System':
          ServerOsString=ServerSystemOS
@@ -263,54 +264,64 @@
        txtfh=open(textfile,'w')
      </script>
      <iterate var="thisChild" in="listOfChildren">
      <!-- Defend against not having any test groups run -->
      <if expr="not listOfChildren">
        <sequence>
          <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,thisChild)
            </request>
          </stafcmd>
          <if expr="RC == 0">
            <sequence>
              <script>
                resultQuery=STAFResult
              </script>
              <message>
                'Log Query on STAX_Job_%s Completed. RC=%s' % (thisChild,RC)
              </message>
              <iterate var="line" in="resultQuery">
                <script>
                 txtfh.write('%s\n' % line)
                </script>
              </iterate>
            </sequence>
            <else>
              <sequence>
                <message log="1" level="'Error'">
                  'Unable to perform log query on STAX_Job_%s. RC: %s Result: %s' % (thisChild,RC,STAFResult)
                </message>
                <return>1</return>
              </sequence>
            </else>
          </if>
          <message log="1" level="'Warning'">
            'No test groups have been run.'
          </message>
        </sequence>
      </iterate>
      <else>
        <sequence>
          <iterate var="thisChild" in="listOfChildren">
            <sequence>
              <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,thisChild)
                </request>
              </stafcmd>
              <if expr="RC == 0">
                <sequence>
                  <script>
                    resultQuery=STAFResult
                  </script>
                  <message>
                    'Log Query on STAX_Job_%s Completed. RC=%s' % (thisChild,RC)
                  </message>
                  <iterate var="line" in="resultQuery">
                    <script>
                     txtfh.write('%s\n' % line)
                    </script>
                  </iterate>
                </sequence>
                <else>
                  <sequence>
                    <message log="1" level="'Error'">
                      'Unable to perform log query on STAX_Job_%s. RC: %s Result: %s' % (thisChild,RC,STAFResult)
                    </message>
                    <return>1</return>
                  </sequence>
                </else>
              </if>
            </sequence>
          </iterate>
        </sequence>
      </else>
      </if>
      <script>
        txtfh.close()
      </script>
      <!-- Write XML File for results -->
      <!-- Write error 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>
@@ -411,10 +422,8 @@
        except IOError:
          errorfh.write('Error: Unable to open %s. Reason IOError.' % textfile )
      </script>
      <!-- XML Report Pre -->
      <script>
        # Create the objects
        localstaf =test_env.staf(STAF_LOCAL_HOSTNAME)
        remotestaf=test_env.staf(STAF_REMOTE_HOSTNAME)
@@ -425,219 +434,145 @@
        http = test_env.http(STAF_LOCAL_HOSTNAME)
        dsml = test_env.dsml(STAF_LOCAL_HOSTNAME)
        xmlfh.write('&lt;qa&gt;\n')
        xmlfh.write('  &lt;functional-tests&gt;\n')
        xmlfh.write('    &lt;identification&gt;\n')
        xmlfh.write('      &lt;sut product="opends"&gt;\n')
        xmlfh.write('        &lt;name&gt;\n')
        xmlfh.write('          %s\n' % ServerName)
        xmlfh.write('        &lt;/name&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;hostname&gt;\n')
        xmlfh.write('          %s\n' % STAF_REMOTE_HOSTNAME)
        xmlfh.write('        &lt;/hostname&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-label&gt;\n')
        xmlfh.write('          %s\n' % ServerJVMString)
        xmlfh.write('        &lt;/jvm-label&gt;\n')
        xmlfh.write('        &lt;jvm-vendor&gt;\n')
        xmlfh.write('          %s\n' % ServerJVMVendor)
        xmlfh.write('        &lt;/jvm-vendor&gt;\n')
        xmlfh.write('        &lt;jvm-arch&gt;\n')
        xmlfh.write('          %s\n' % ServerJVMArchitecture)
        xmlfh.write('        &lt;/jvm-arch&gt;\n')
        xmlfh.write('        &lt;jvm-args&gt;\n')
        xmlfh.write('          TBD\n')
        xmlfh.write('        &lt;/jvm-args&gt;\n')
        xmlfh.write('        &lt;jvm-home&gt;\n')
        xmlfh.write('          TBD\n')
        xmlfh.write('        &lt;/jvm-home&gt;\n')
        xmlfh.write('        &lt;jvm-bin&gt;\n')
        xmlfh.write('          TBD\n')
        xmlfh.write('        &lt;/jvm-bin&gt;\n')
        xmlfh.write('        &lt;os-label&gt;\n')
        xmlfh.write('          %s\n' % ServerOsString)
        xmlfh.write('        &lt;/os-label&gt;\n')
        xmlfh.write('        &lt;server-package&gt;\n')
        xmlfh.write('          %s\n' % ServerPackage)
        xmlfh.write('        &lt;/server-package&gt;\n')
        xmlfh.write('        &lt;snmp-jarfile&gt;\n')
        xmlfh.write('          %s\n' % ServerSNMPJarFile)
        xmlfh.write('        &lt;/snmp-jarfile&gt;\n')
        xmlfh.write('        &lt;md5-sum&gt;\n')
        xmlfh.write('          TDB\n')
        xmlfh.write('        &lt;/md5-sum&gt;\n')
        xmlfh.write('      &lt;/sut&gt;\n')
        xmlfh.write('      &lt;sut product="dsml"&gt;\n')
        xmlfh.write('        &lt;name&gt;\n')
        xmlfh.write('          %s\n' % DSMLName)
        xmlfh.write('        &lt;/name&gt;\n')
        xmlfh.write('        &lt;dsml-container&gt;\n')
        xmlfh.write('          %s\n' % DSMLContainer)
        xmlfh.write('        &lt;/dsml-container&gt;\n')
        xmlfh.write('        &lt;dsml-package&gt;\n')
        xmlfh.write('          %s\n' % DSMLPackage)
        xmlfh.write('        &lt;/dsml-package&gt;\n')
        xmlfh.write('        &lt;md5-sum&gt;\n')
        xmlfh.write('          TDB\n')
        xmlfh.write('        &lt;/md5-sum&gt;\n')
        xmlfh.write('      &lt;/sut&gt;\n')
        xmlfh.write('      &lt;testware&gt;\n')
        xmlfh.write('        &lt;staf&gt;\n')
        xmlfh.write('          &lt;local&gt;\n')
        xmlfh.write('            &lt;hostname&gt;\n')
        xmlfh.write('              %s\n' % STAF_LOCAL_HOSTNAME)
        xmlfh.write('            &lt;/hostname&gt;\n')
        xmlfh.write('            &lt;version&gt;\n')
        xmlfh.write('              %s\n' % localstaf.version)
        xmlfh.write('            &lt;/version&gt;\n')
        xmlfh.write('            &lt;rootdir&gt;\n')
        xmlfh.write('              %s\n' % localstaf.root)
        xmlfh.write('            &lt;/rootdir&gt;\n')
        xmlfh.write('          &lt;/local&gt;\n')
        xmlfh.write('          &lt;remote&gt;\n')
        xmlfh.write('            &lt;hostname&gt;\n')
        xmlfh.write('              %s\n' % STAF_REMOTE_HOSTNAME)
        xmlfh.write('            &lt;/hostname&gt;\n')
        xmlfh.write('            &lt;version&gt;\n')
        xmlfh.write('              %s\n' % remotestaf.version)
        xmlfh.write('            &lt;/version&gt;\n')
        xmlfh.write('            &lt;rootdir&gt;\n')
        xmlfh.write('              %s\n' % remotestaf.root)
        xmlfh.write('            &lt;/rootdir&gt;\n')
        xmlfh.write('          &lt;/remote&gt;\n')
        xmlfh.write('        &lt;/staf&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % stax.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % stax.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % stax.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % stax.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % stax.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % stax.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % event.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % event.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % event.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % event.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % event.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % event.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % eventman.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % eventman.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % eventman.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % eventman.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % eventman.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % eventman.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % email.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % email.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % email.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % email.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % email.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % email.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % http.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % http.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % http.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % http.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % http.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % http.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('        &lt;service name="%s"&gt;\n' % dsml.name)
        xmlfh.write('          &lt;version&gt;\n')
        xmlfh.write('            %s\n' % dsml.version)
        xmlfh.write('          &lt;/version&gt;\n')
        xmlfh.write('          &lt;library&gt;\n')
        xmlfh.write('            %s\n' % dsml.library)
        xmlfh.write('          &lt;/library&gt;\n')
        xmlfh.write('          &lt;executable&gt;\n')
        xmlfh.write('            %s\n' % dsml.executable)
        xmlfh.write('          &lt;/executable&gt;\n')
        xmlfh.write('          &lt;options&gt;\n')
        xmlfh.write('            %s\n' % dsml.options)
        xmlfh.write('          &lt;/options&gt;\n')
        xmlfh.write('          &lt;params&gt;\n')
        xmlfh.write('            %s\n' % dsml.params)
        xmlfh.write('          &lt;/params&gt;\n')
        xmlfh.write('        &lt;/service&gt;\n')
        xmlfh.write('      &lt;/testware&gt;\n')
        xmlfh.write('      &lt;tests-dir&gt;\n')
        xmlfh.write('        %s\n' % logsDir)
        xmlfh.write('      &lt;/tests-dir&gt;\n')
        xmlfh.write('      &lt;tests-url&gt;\n')
        xmlfh.write('        %s\n' % logsURI)
        xmlfh.write('      &lt;/tests-url&gt;\n')
        xmlfh.write('      &lt;mailto&gt;\n')
        xmlfh.write('        %s\n' % SEND_MAIL_TO)
        xmlfh.write('      &lt;/mailto&gt;\n')
        xmlfh.write('    &lt;/identification&gt;\n')
        xmlfh.write('    &lt;results&gt;\n')
      </script>
        # Build the XML results file
        from xml.dom.minidom import Document
      <!-- XML Report Results -->
      <script>
        def write_text_elements(parent,elements):
          for sutElement in elements:
            label,text = sutElement
            element = doc.createElement(label)
            parent.appendChild(element)
            try:
              element.appendChild(doc.createTextNode(text))
            except TypeError,details:
              element.appendChild(doc.createTextNode('TypeError: %s' % details))
        # Create the test results document
        doc = Document()
        # Create the qa base element
        qa = doc.createElement("qa")
        doc.appendChild(qa)
        # Create the functional-tests element
        ft = doc.createElement("functional-tests")
        qa.appendChild(ft)
        # Create the identification element
        id = doc.createElement("identification")
        ft.appendChild(id)
        # Create the sut opends element
        sut = doc.createElement("sut")
        sut.setAttribute("product", "opends")
        id.appendChild(sut)
        # Create the sut opends elements
        sutElementList=[]
        sutElementList.append(['name',ServerName])
        sutElementList.append(['path',ServerPath])
        sutElementList.append(['version',ServerVersion])
        sutElementList.append(['buildid',ServerBuildId])
        sutElementList.append(['revision',ServerRevision])
        sutElementList.append(['hostname',STAF_REMOTE_HOSTNAME])
        sutElementList.append(['platform',ServerSystemOS])
        sutElementList.append(['jvm-version',ServerJVMVersion])
        sutElementList.append(['jvm-label',ServerJVMString])
        sutElementList.append(['jvm-vendor',ServerJVMVendor])
        sutElementList.append(['jvm-arch',ServerJVMArchitecture])
        sutElementList.append(['jvm-args','TBD'])
        sutElementList.append(['jvm-home','TBD'])
        sutElementList.append(['jvm-bin','TBD'])
        sutElementList.append(['os-label',ServerOsString])
        sutElementList.append(['server-package',ServerPackage])
        sutElementList.append(['snmp-jarfile',ServerSNMPJarFile])
        sutElementList.append(['md5-sum','TDB'])
        write_text_elements(sut,sutElementList)
        # Create the sut dsml element
        sut = doc.createElement("sut")
        sut.setAttribute("product", "dsml")
        id.appendChild(sut)
        # Create the sut dsml elements
        sutElementList=[]
        sutElementList.append(['name',DSMLName])
        sutElementList.append(['dsml-container',DSMLContainer])
        sutElementList.append(['dsml-package',DSMLPackage])
        sutElementList.append(['md5-sum','TDB'])
        write_text_elements(sut,sutElementList)
        sutElementList=[]
        # Create the testware element
        testware = doc.createElement("testware")
        id.appendChild(testware)
        # Create the staf testware element
        staf = doc.createElement("staf")
        testware.appendChild(staf)
        # Create the staf local element
        local = doc.createElement("local")
        staf.appendChild(local)
        # Create the staf local testware elements
        testwareElementList=[]
        testwareElementList.append(['hostname',STAF_LOCAL_HOSTNAME])
        testwareElementList.append(['version',localstaf.version])
        testwareElementList.append(['rootdir',localstaf.root])
        write_text_elements(local,testwareElementList)
        # Create the staf remote testware element
        remote = doc.createElement("remote")
        staf.appendChild(remote)
        # Create the staf remote testware elements
        testwareElementList=[]
        testwareElementList.append(['hostname',STAF_REMOTE_HOSTNAME])
        testwareElementList.append(['version',remotestaf.version])
        testwareElementList.append(['version',remotestaf.root])
        write_text_elements(remote,testwareElementList)
        for serviceType in [stax,event,eventman,email,http,dsml]:
          # Create the service testware element
          service = doc.createElement("service")
          service.setAttribute("name", serviceType.name)
          testware.appendChild(service)
          # Create the service testware elements
          testwareElementList=[]
          testwareElementList.append(['version',serviceType.version])
          testwareElementList.append(['library',serviceType.library])
          testwareElementList.append(['executable',serviceType.executable])
          testwareElementList.append(['options','%s' % serviceType.options])
          testwareElementList.append(['params','%s' % serviceType.params])
          write_text_elements(service,testwareElementList)
        testwareElementList=[]
        # Create the id elements
        idElementList=[]
        idElementList.append(['tests-dir',logsDir])
        idElementList.append(['tests-url',logsURI])
        idElementList.append(['mailto',SEND_MAIL_TO])
        write_text_elements(id,idElementList)
        idElementList=[]
        # Create the results element
        results = doc.createElement("results")
        ft.appendChild(results)
        # Create the results elements and attributes
        for tcname in testCaseList:
          if testDict.has_key(tcname):
@@ -689,21 +624,31 @@
          tcdurationsecs=test_time().timeToSeconds(tcduration)
          xmlfh.write('      &lt;testgroup name="%s"&gt;\n' % tcgroup)
          xmlfh.write('        &lt;testsuite name="%s"&gt;\n' % tcsuite)
          xmlfh.write('          &lt;testcase group="%s" suite="%s" name="%s" result="%s" start="%s" stop="%s" duration="%s"/&gt;\n' % (tcgroup,tcsuite,tcname,tcresult,tcstart,tcstop,tcdurationsecs))
          xmlfh.write('        &lt;/testsuite&gt;\n')
          xmlfh.write('      &lt;/testgroup&gt;\n')
      </script>
          # Create the testgroup element
          group = doc.createElement("testgroup")
          group.setAttribute("name", tcgroup)
          results.appendChild(group)
          # Create the testsuite element
          suite = doc.createElement("testsuite")
          suite.setAttribute("name", tcsuite)
          group.appendChild(suite)
          # Create the testcase element
          case = doc.createElement("testcase")
          case.setAttribute("group", "%s" %tcgroup)
          case.setAttribute("suite", "%s" %tcsuite)
          case.setAttribute("name", "%s" %tcname)
          case.setAttribute("result", "%s" %tcresult)
          case.setAttribute("start", "%s" %tcstart)
          case.setAttribute("stop", "%s" %tcstop)
          case.setAttribute("duration", "%s" % tcdurationsecs)
          suite.appendChild(case)
      <!-- 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>
        # Write out the results
        xmlfile= '%s/results.xml' % logsReportDir
        xmlfh=open(xmlfile,'w')
        xmlfh.writelines(doc.toprettyxml(indent="  "))
        xmlfh.close()
        errorfh.close()
      </script>