#! /usr/bin/python # vim:ts=4:sw=4:expandtab 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('' + html_page['title'] + '') 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('No version information found') return out.write('
')
    for line in version_file:
        out.write(line)
    out.write('
') def generate_report(package, stack, out, report_file): """ Generate an html page containing the report for this package """ mtime = datetime.datetime.fromtimestamp(os.stat(report_file)[stat.ST_MTIME]) # print html header and begin of body print_html_start(out) out.write('\n\n' + html_page['heading'] + ' - ' + str(mtime) + '\n\n') # 'one level up' link if (len(stack) > 1): out.write('one level up\n') elif (len(stack)==1): out.write('one level up\n') out.write('
') # link to raw results out.write('raw results\n') out.write('
') # allow browsing previous results out.write('
') out.write('Results for ') out.write('') out.write('') out.write('') out.write('
') # detailed version information print_java_version(out) # first we generate an index for sub-packages keys = package.keys() keys.sort() out.write('') out.write('') successes, failures = count(package) 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('') out.write('\n') out.write('\n') out.write('
packagesuccessesfailures
' + pack + '' + str(subcount[0]) + '' + str(subcount[1]) + '
 
subpackages' + str(subsuccesses) + '' + str(subfailures) + '
this package' + str(successes -subsuccesses) + '' + str(failures - 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 = ' '.join(classitem.split()).split() if testcasesplit[1] in pass_indicators: successes = successes + 1 elif testcasesplit[1] in fail_indicators: failures = failures + 1 return (successes, failures) def parse_report(report_file): # read report output file f = file(report_file) # top level packages tlp = {} line = None while(line != ''): line = f.readline() if (line == ''): break # extract testcase package information # line consists of this format: # java/package/name/class.java Passed. Success because everything worked testcase = ' '.join(line.split()).split() if (testcase[1] in pass_indicators or testcase[1] in fail_indicators): testcase = testcase[0].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(' '.join((' '.join(line.split())).split()[:2])) 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 if # end input read loop return tlp # for each package generate one html report page (recursivly) cgitb.enable() form = cgi.FieldStorage() # This program uses the following form fields: # results: what set of results do we want? # one of: jdk|hotspot|langtools # package: the class path. # eg: org/some/path/c.html # date: results are for this date. In ISO 8601 date format. # eg: 2009-03-03 # package if not (form.has_key('package')): package = '' else: package = form['package'].value # results if not (form.has_key('results')): results = 'jdk' else: results = form['results'].value if not (results in ['jdk', 'hotspot', 'langtools']): results = 'jdk' # 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]) # store values for html output html_page = {} html_page['title'] = 'IcedTea6 JTreg Results - ' + results html_page['heading'] = 'IcedTea6 JTreg Results - ' + results pass_indicators = [ 'Passed.' ] fail_indicators = [ 'Failed.' , 'Error.' ] base_dir = '../logs/' base_name = 'icedtea6_jtreg_output' report_file = base_dir + str(date) + '/' + base_name + '-' + results 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(report_file)): date = date - datetime.timedelta(days=1) report_file = base_dir + str(date) + '/' + base_name + '-' + results check_days = check_days - 1; if (not os.path.isfile(report_file)): print_html_error('No test file found for last 30 days', sys.stdout) sys.exit(0) currentpackage = parse_report(report_file) stack = [] if (package != ''): for packitem in package.split('/'): currentpackage = currentpackage[packitem] stack.append(packitem) generate_report(currentpackage, stack, sys.stdout, report_file) # all done :)