#! /usr/bin/python
import string
import sys
import cgi
import cgitb
import stat
import datetime
import time
import os
def print_html_start(out):
out.write('Content-type: text/html\n\n')
out.write('
IcedTea6 Mauve report')
def print_html_end(out):
out.write('')
def print_html_error(message, out):
"""
Writes an error page containing message to out
"""
print_html_start(out)
out.write('Error
')
out.write(message)
print_html_end(out)
def print_java_version(out):
"""
Output the java version
"""
try:
version_file = open(base_dir + str(date) + '/icedtea6_version', 'r')
except IOError:
out.write('Version information not found')
return
out.write('')
for line in version_file:
out.write(line)
out.write('')
def generate_report(package, stack, out, mauvefile):
"""
Generate an html page containing the report for this package
"""
mtime = datetime.datetime.fromtimestamp(os.stat(mauvefile)[stat.ST_MTIME])
# print html header and begin of body
print_html_start(out)
out.write('\n\nIcedTea6 Mauve Report - ' + str(mtime) + '\n\n')
# first we generate an index for sub-packages
if (len(stack) > 1):
out.write('\none level up\n')
elif (len(stack)==1):
out.write('one level up\n')
out.write('
')
out.write('raw results')
out.write('
')
# allow browsing previous results
out.write('')
# output the java version
print_java_version(out)
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('| |
')
mycount = count(package)
out.write('| total: | ')
out.write('' + str(subsuccesses) + ' | \n')
out.write('' + str(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]
out.write('')
skip = False
for testcase in testcases:
if (testcase.split(':')[0] == 'PASS'):
color = 'green'
skip = False
elif (testcase.split(':')[0] == 'FAIL'):
color = 'red'
skip = False
else:
color = 'black'
out.write('
')
out.write('' + testcase + '')
out.write('')
skip = True
if (not skip):
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(':')
if (testcase[0] == 'PASS' or testcase[0] == 'FAIL'):
testcase = testcase[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()
# package
if not (form.has_key('package')):
package = ''
else:
package = form['package'].value
# date
if not (form.has_key('date')):
utc_datetime = datetime.datetime.utcnow()
date = datetime.date(utc_datetime.year, utc_datetime.month, utc_datetime.day)
else:
try:
temp_date = datetime.datetime(*(time.strptime(form['date'].value, "%Y-%m-%d")[0:6]))
date = datetime.date(temp_date.year, temp_date.month, temp_date.day)
except ValueError:
utc_datetime = datetime.datetime.utcnow()
date = datetime.date(utc_datetime.year, utc_datetime.month, utc_datetime.day)
script_path, script_name = os.path.split(sys.argv[0])
base_dir = '../logs/'
base_name = 'icedtea6_mauve_output'
mauvefile = base_dir + str(date) + '/' + base_name
original_date = date
check_days = 30
# try to go back up to a month if we cant find today's report
while (check_days != 0) and (not os.path.isfile(mauvefile)):
date = date - datetime.timedelta(days=1)
mauvefile = base_dir + str(date) + '/' + base_name
check_days = check_days - 1;
if (not os.path.isfile(mauvefile)):
print_html_error('No test file found for last 30 days', sys.stdout)
sys.exit(0)
currentpackage = parsemauve(mauvefile)
stack = []
if (package != ''):
for packitem in package.split('.'):
currentpackage = currentpackage[packitem]
stack.append(packitem)
generate_report(currentpackage, stack, sys.stdout, mauvefile)
# all done :)