#! /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('')
# detailed version information
print_java_version(out)
# first we generate an index for sub-packages
keys = package.keys()
keys.sort()
out.write('')
out.write('| package | successes | failures |
')
successes, failures = count(package)
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('| subpackages | ')
out.write('' + str(subsuccesses) + ' | \n')
out.write('' + str(subfailures) + ' |
\n')
out.write('| this package | ')
out.write('' + str(successes -subsuccesses) + ' | \n')
out.write('' + str(failures - 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:
result = ' '.join(testcase.split()).split()
if (result[1] in pass_indicators):
color = 'green'
skip = False
elif (result[1] in fail_indicators):
color = 'red'
skip = False
else:
color = 'black'
out.write('
')
out.write('' + testcase + '')
out.write('')
skip = True
if (not skip):
out.write('- ')
out.write('
' + result[1][:-1] + ': ' + result[0] + ' ')
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 :)