#! /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('
') out.write('Results for ') out.write('') out.write('') out.write('
') # output the java version print_java_version(out) 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('') mycount = count(package) out.write('') out.write('\n') out.write('\n') out.write('
packagesuccessesfailures
' + pack + '' + str(subcount[0]) + '' + str(subcount[1]) + '
 
total:' + str(subsuccesses) + '' + str(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] 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 :)