summaryrefslogtreecommitdiffstats
path: root/tests/test-framework/vmware/cdashreporter.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-framework/vmware/cdashreporter.py')
-rw-r--r--tests/test-framework/vmware/cdashreporter.py156
1 files changed, 156 insertions, 0 deletions
diff --git a/tests/test-framework/vmware/cdashreporter.py b/tests/test-framework/vmware/cdashreporter.py
new file mode 100644
index 000000000..5acaa783e
--- /dev/null
+++ b/tests/test-framework/vmware/cdashreporter.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+import datetime, socket, os, sys, traceback, time, tempfile, httplib, urllib
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesNSImpl
+import result, utils
+from result import exitStatusAsString
+from xmlutils import startElement, endElement, writeElement
+
+checkerResultAsString = { result.CheckerResult.Passed:u"passed", result.CheckerResult.Failed:u"failed", result.CheckerResult.NotRun:u"notRun" }
+
+def formatDate( date ):
+ return date.strftime( '%Y%m%d-%H%M' )
+
+def writeExecutionResult( gen, name, r ):
+ if r == None or r.hasError():
+ stat = "failed"
+ else:
+ stat = "passed"
+
+ startElement( gen, None, "Test", { u"Status":stat } )
+ writeElement( gen, None, "Name", name )
+ writeElement( gen, None, "FullName", name )
+ startElement( gen, None, "NamedMeasurement", { u"type":u"text/string", u"name":u"Exit Code"} )
+ if r:
+ msg = "(Unexpected)"
+ ec = r.exitCode
+ if ec == 0:
+ msg = "(Success)"
+ elif ec == 1:
+ msg = "(Failed)"
+ elif ec == 2:
+ msg = "(Canceled)"
+
+ writeElement( gen, None, "Value", "Exit status: {0}; Installer exit code: {1} {2}".format( exitStatusAsString( r.exitStatus ), str( r.exitCode ), msg ) )
+ else:
+ writeElement( gen, None, "Value", "Could not determine installation result." )
+
+ endElement( gen, None, "NamedMeasurement" )
+
+
+ if r:
+ startElement( gen, None, "NamedMeasurement", { u"type":u"numeric/double", u"name":u"Execution Time"} )
+ writeElement( gen, None, "Value", str( r.executionTime ) )
+ endElement( gen, None, "NamedMeasurement" )
+
+
+ endElement( gen, None, "Test" )
+
+def writeInternalError( gen, errorstr, num ):
+ startElement( gen, None, "Test", { u"Status":u"failed"} )
+ name = "InternalError{0}".format( num )
+ writeElement( gen, None, "Name", name )
+ writeElement( gen, None, "FullName", name )
+ startElement( gen, None, "NamedMeasurement", { u"type":u"text/string", u"name":u"Completion Status"} )
+ writeElement( gen, None, "Value", errorstr )
+ endElement( gen, None, "NamedMeasurement" )
+ endElement( gen, None, "Test" )
+
+def writeTest( gen, test ):
+ startElement( gen, None, "Test", { u"Status":checkerResultAsString[test.result]} )
+ writeElement( gen, None, "Name", test.name )
+ writeElement( gen, None, "FullName", test.name )
+ startElement( gen, None, "NamedMeasurement", { u"type":u"text/string", u"name":u"Completion Status"} )
+ writeElement( gen, None, "Value", test.errorString )
+ endElement( gen, None, "NamedMeasurement" )
+ endElement( gen, None, "Test" )
+
+class CDashReporter:
+ def __init__( self, host, location, project ):
+ self._host = host
+ self._location = location
+ self._project = project
+
+ def reportException( self ):
+ sys.stderr.write( traceback.format_exc( 15 ) + '\n' )
+ #TODO
+
+ def reportResult( self, result ):
+ self._buildStamp = '{0}-Nightly'.format( datetime.datetime.now().strftime( '%Y%m%d-%H%M' ), utils.randomString( 4 ) )
+ try:
+ #generate XML
+ self.genXml( self.genTestXml, result )
+ #generate Tests.xml
+ #submitFile('Tests.xml')
+ except:
+ raise
+
+ def genTestXml( self, gen, result ):
+ name = "{0} on {1}".format( result._installer.sourceFilename, result._vm.name() )
+ startElement( gen, None, "Site", { u"BuildStamp":self._buildStamp, u"Name":name, u"Generator":u"VMTester 0.1" } )
+ startElement( gen, None, "Testing" )
+ writeElement( gen, None, "StartDateTime", formatDate( result._testStart ) )
+ startElement( gen, None, "TestList" )
+ internal = result._internalErrors
+ for i in range( 0, len( internal ) - 1 ):
+ writeElement( gen, None, "Test", "InternalError{0}".format( i ) )
+
+ for stepNum in range( len( result._stepResults ) ):
+ step = result._stepResults[stepNum]
+ writeElement( gen, None, "Test", "installer-run{0}".format( stepNum ) )
+ for i in step.checkerResults:
+ writeElement( gen, None, "Test", i.name )
+ endElement( gen, None, "TestList" )
+
+ for i in range( 0, len( internal ) - 1 ):
+ writeInternalError( gen, internal[i], i )
+ for stepNum in range( len( result._stepResults ) ):
+ step = result._stepResults[stepNum]
+ writeExecutionResult( gen, "installer-run{0}".format( stepNum ), step.executionResult )
+ for i in step.checkerResults:
+ writeTest( gen, i )
+ endElement( gen, None, "Testing" )
+ endElement( gen, None, "Site" )
+
+ def genXml( self, fillFunc, result ):
+ f = None
+ try:
+ f = tempfile.NamedTemporaryFile( delete=False )
+ gen = XMLGenerator( f, 'utf-8' )
+ gen.startDocument()
+ fillFunc( gen, result )
+ gen.endDocument()
+ f.close()
+ self.submitFile( f.name )
+ finally:
+ if f:
+ os.unlink( f.name )
+
+ def submitFile( self, path ):
+ f = file( path )
+ params = urllib.urlencode( {'project': self._project} )
+ conn = None
+ try:
+ try:
+ conn = httplib.HTTPConnection( self._host )
+ conn.request( "POST", "{0}/submit.php?project={1}".format( self._location, self._project ), f )
+ response = conn.getresponse()
+ print response.status, response.reason
+ #TODO check result
+ finally:
+ if conn:
+ conn.close()
+ except:
+ #TODO: if submitting to cdash fails, try to notify the admin (mail?)
+ raise
+
+if __name__ == "__main__":
+ r = result.Result()
+ r.testStarted()
+ r.addCheckerResult( result.CheckerResult( "test1", result.CheckerResult.Passed, "" ) )
+ r.addCheckerResult( result.CheckerResult( "test2", result.CheckerResult.Failed, "Something went wrong, dude!" ) )
+ time.sleep( 1 )
+ r.testFinished()
+ cr = CDashReporter( "http://localhost", "/CDash", "test1" )
+ cr.reportResult( r )
+