#!/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('')
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:
')
out.write('- Runtime: ' + RUNTIMES[rtversion] + '
')
out.write('- Compiler: ' + COMPILERS[compversion] + '
')
# 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('| package | successes | failures |
')
subfailures = 0
subsuccesses = 0
for pack in keys:
if (pack[0] in string.uppercase):
continue
out.write('| ' + pack + ' | \n')
subcount = count(package[pack])
out.write('' + str(subcount[0]) + ' | \n')
out.write('' + str(subcount[1]) + ' |
\n')
subfailures = subfailures + subcount[1]
subsuccesses = subsuccesses + subcount[0]
out.write('| |
')
out.write('| this package: | ')
mycount = count(package)
out.write('' + str(mycount[0]-subsuccesses) + ' | \n')
out.write('' + str(mycount[1]-subfailures) + ' |
\n')
out.write('
')
# 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('')
for testcase in testcases:
if (testcase.split(':')[0] == 'PASS'):
color = 'green'
elif (testcase.split(':')[0] == 'FAIL'):
color = 'red'
else:
color = 'orange'
out.write('- ')
out.write('
' + testcase + ' ')
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 :)