#!/usr/bin/python import string import sys import cgi import cgitb import stat import datetime import os def print_html_start(out): out.write('Content-type: text/html\n\n') out.write('Mauve report') def print_html_end(out): out.write('') def print_select_env(sel_rt, sel_comp, RUNTIMES, COMPILERS, out, stack): out.write('
Runtime: Compiler:
') def generate_report(package, stack, out, mauvefile, rtversion, compversion, RUNTIMES, COMPILERS): mtime = datetime.datetime.fromtimestamp(os.stat(mauvefile)[stat.ST_MTIME]) # print html header and begin of body print_html_start(out) print_select_env(rtversion, compversion, RUNTIMES, COMPILERS, out, stack) out.write('

Last update: ' + str(mtime) + '

') out.write('

Generated with:

') # first we generate an index for sub-packages if (len(stack) > 3): out.write('one level up
\n') elif (len(stack)==3): out.write('one level up
\n') keys = package.keys() keys.sort() out.write('') out.write('') subfailures = 0 subsuccesses = 0 for pack in keys: if (pack[0] in string.uppercase): continue out.write('\n') subcount = count(package[pack]) out.write('\n') out.write('\n') subfailures = subfailures + subcount[1] subsuccesses = subsuccesses + subcount[0] out.write('') out.write('') mycount = count(package) out.write('\n') out.write('\n') out.write('
packagesuccessesfailures
' + pack + '' + str(subcount[0]) + '' + str(subcount[1]) + '
 
this package:' + str(mycount[0]-subsuccesses) + '' + str(mycount[1]-subfailures) + '
') # then we generate the output list for all classes in the current package for pack in keys: if (not pack[0] in string.uppercase): continue out.write('

') for item in stack: out.write(item + '.') out.write(pack + '

') testcases = package[pack] testcases.sort() out.write('') # print html end print_html_end(out) out.close() def count(package): """ Counts the failures and successes inside a package recursivly and returns a tuple (successes, failures). """ successes = 0 failures = 0 for pack in package.keys(): if (not pack[0] in string.uppercase): # recursivly count the subpackages subcount = count(package[pack]) successes = successes + subcount[0] failures = failures + subcount[1] else: # count failures and successes in the current package for classitem in package[pack]: testcasesplit = classitem.split(':') if testcasesplit[0] == 'PASS': successes = successes + 1 elif testcasesplit[0] == 'FAIL': failures = failures + 1 return (successes, failures) def parsemauve(mauvefile): # parse command line options # read mauve output file f = file(mauvefile) # top level packages tlp = {} line = None while(line != ''): line = f.readline() if (line == ''): break # extract testcase package information testcase = line.split(':')[1].strip() packages = testcase.split('.') # create packages in hierarchy if necessary pack = tlp for package in packages: # handle classes if (package[0] in string.uppercase): # if class is not already in package list, add it with new list if (not pack.has_key(package)): pack[package] = [] # add current line to the current class pack[package].append(line) break # add package with new map in hierarchy if not already present if (not pack.has_key(package)): pack[package] = {} pack = pack[package] # end packages loop # end input read loop return tlp # for each package generate one html report page (recursivly) cgitb.enable() form = cgi.FieldStorage() if not (form.has_key('package')): package = '' else: package = form['package'].value ## parse configuration ### import ConfigParser CONFIGFILE='/var/www/mauve/mauve.cfg' RUNTIMES={} COMPILERS={} # parse RUNTIMES and COMPILERS config = ConfigParser.ConfigParser() config.read(CONFIGFILE) # compilers compilers = config.get('compilers', 'compilers').split(',') for compiler in compilers: version = config.get('compilers', compiler + '.version') COMPILERS[compiler] = version # runtimes runtimes = config.get('runtimes', 'runtimes').split(',') for runtime in runtimes: version = config.get('runtimes', runtime + '.version') RUNTIMES[runtime] = version if not (form.has_key('runtime')): myruntime = runtimes[0] else: myruntime = form['runtime'].value if not (form.has_key('compiler')): mycompiler = compilers[0] else: mycompiler = form['compiler'].value mauvefile = 'mauve-' + myruntime + '-' + mycompiler + '-out' currentpackage = parsemauve(mauvefile) stack = [] if (package != ''): for packitem in package.split('.'): currentpackage = currentpackage[packitem] stack.append(packitem) generate_report(currentpackage, stack, sys.stdout, mauvefile, myruntime, mycompiler, RUNTIMES, COMPILERS) # all done :)