|
"""Generates HTML page containing the testresults""" |
|
from testsuite_common import Result, processLogLine, getLastTwoLines |
|
from runtests import parse_testconfig |
|
import os |
|
import sys |
|
|
|
from datetime import datetime, timedelta |
|
|
|
HTML_HEADING = """<html> |
|
<head> |
|
<title>Moses speed testing</title> |
|
<link rel="stylesheet" type="text/css" href="style.css"></head><body>""" |
|
HTML_ENDING = "</table></body></html>\n" |
|
|
|
TABLE_HEADING = """<table><tr class="heading"> |
|
<th>Date</th> |
|
<th>Time</th> |
|
<th>Testname</th> |
|
<th>Revision</th> |
|
<th>Branch</th> |
|
<th>Time</th> |
|
<th>Prevtime</th> |
|
<th>Prevrev</th> |
|
<th>Change (%)</th> |
|
<th>Time (Basebranch)</th> |
|
<th>Change (%, Basebranch)</th> |
|
<th>Time (Days -2)</th> |
|
<th>Change (%, Days -2)</th> |
|
<th>Time (Days -3)</th> |
|
<th>Change (%, Days -3)</th> |
|
<th>Time (Days -4)</th> |
|
<th>Change (%, Days -4)</th> |
|
<th>Time (Days -5)</th> |
|
<th>Change (%, Days -5)</th> |
|
<th>Time (Days -6)</th> |
|
<th>Change (%, Days -6)</th> |
|
<th>Time (Days -7)</th> |
|
<th>Change (%, Days -7)</th> |
|
<th>Time (Days -14)</th> |
|
<th>Change (%, Days -14)</th> |
|
<th>Time (Years -1)</th> |
|
<th>Change (%, Years -1)</th> |
|
</tr>""" |
|
|
|
def get_prev_days(date, numdays): |
|
"""Gets the date numdays previous days so that we could search for |
|
that test in the config file""" |
|
date_obj = datetime.strptime(date, '%d.%m.%Y').date() |
|
past_date = date_obj - timedelta(days=numdays) |
|
return past_date.strftime('%d.%m.%Y') |
|
|
|
def gather_necessary_lines(logfile, date): |
|
"""Gathers the necessary lines corresponding to past dates |
|
and parses them if they exist""" |
|
|
|
dates = {} |
|
dates[get_prev_days(date, 2)] = ('-2', None) |
|
dates[get_prev_days(date, 3)] = ('-3', None) |
|
dates[get_prev_days(date, 4)] = ('-4', None) |
|
dates[get_prev_days(date, 5)] = ('-5', None) |
|
dates[get_prev_days(date, 6)] = ('-6', None) |
|
dates[get_prev_days(date, 7)] = ('-7', None) |
|
dates[get_prev_days(date, 14)] = ('-14', None) |
|
dates[get_prev_days(date, 365)] = ('-365', None) |
|
|
|
openfile = open(logfile, 'r') |
|
for line in openfile: |
|
if line.split()[0] in dates.keys(): |
|
day = dates[line.split()[0]][0] |
|
dates[line.split()[0]] = (day, processLogLine(line)) |
|
openfile.close() |
|
return dates |
|
|
|
def append_date_to_table(resline): |
|
"""Appends past dates to the html""" |
|
cur_html = '<td>' + str(resline.previous) + '</td>' |
|
|
|
if resline.percentage > 0.05: |
|
cur_html = cur_html + '<td class="better">' + str(resline.percentage) + '</td>' |
|
elif resline.percentage < -0.05: |
|
cur_html = cur_html + '<td class="worse">' + str(resline.percentage) + '</td>' |
|
else: |
|
cur_html = cur_html + '<td class="unchanged">' + str(resline.percentage) + '</td>' |
|
return cur_html |
|
|
|
def compare_rev(filename, rev1, rev2, branch1=False, branch2=False): |
|
"""Compare the test results of two lines. We can specify either a |
|
revision or a branch for comparison. The first rev should be the |
|
base version and the second revision should be the later version""" |
|
|
|
|
|
|
|
|
|
firstidx = 2 |
|
secondidx = 2 |
|
if branch1 == True: |
|
firstidx = 12 |
|
if branch2 == True: |
|
secondidx = 12 |
|
|
|
rev1line = '' |
|
rev2line = '' |
|
resfile = open(filename, 'r') |
|
for line in resfile: |
|
if rev1 == line.split()[firstidx]: |
|
rev1line = line |
|
elif rev2 == line.split()[secondidx]: |
|
rev2line = line |
|
if rev1line != '' and rev2line != '': |
|
break |
|
resfile.close() |
|
if rev1line == '': |
|
raise ValueError('Revision ' + rev1 + " was not found!") |
|
if rev2line == '': |
|
raise ValueError('Revision ' + rev2 + " was not found!") |
|
|
|
logLine1 = processLogLine(rev1line) |
|
logLine2 = processLogLine(rev2line) |
|
res = Result(logLine1.testname, logLine1.real, logLine2.real,\ |
|
logLine2.revision, logLine2.branch, logLine1.revision, logLine1.branch) |
|
|
|
return res |
|
|
|
def produce_html(path, global_config): |
|
"""Produces html file for the report.""" |
|
html = '' |
|
for filenam in os.listdir(global_config.testlogs): |
|
|
|
|
|
(ll1, ll2) = getLastTwoLines(filenam, global_config.testlogs) |
|
logLine1 = processLogLine(ll1) |
|
logLine2 = processLogLine(ll2) |
|
|
|
|
|
res1 = Result(logLine1.testname, logLine1.real, logLine2.real,\ |
|
logLine2.revision, logLine2.branch, logLine1.revision, logLine1.branch) |
|
html = html + '<tr><td>' + logLine2.date + '</td><td>' + logLine2.time + '</td><td>' +\ |
|
res1.testname + '</td><td>' + res1.revision[:10] + '</td><td>' + res1.branch + '</td><td>' +\ |
|
str(res1.current) + '</td><td>' + str(res1.previous) + '</td><td>' + res1.prevrev[:10] + '</td>' |
|
|
|
|
|
if res1.percentage > 0.05: |
|
html = html + '<td class="better">' + str(res1.percentage) + '</td>' |
|
elif res1.percentage < -0.05: |
|
html = html + '<td class="worse">' + str(res1.percentage) + '</td>' |
|
else: |
|
html = html + '<td class="unchanged">' + str(res1.percentage) + '</td>' |
|
|
|
|
|
filenam = global_config.testlogs + '/' + filenam |
|
res2 = compare_rev(filenam, global_config.basebranch, res1.revision, branch1=True) |
|
html = html + '<td>' + str(res2.previous) + '</td>' |
|
|
|
|
|
if res2.percentage > 0.05: |
|
html = html + '<td class="better">' + str(res2.percentage) + '</td>' |
|
elif res2.percentage < -0.05: |
|
html = html + '<td class="worse">' + str(res2.percentage) + '</td>' |
|
else: |
|
html = html + '<td class="unchanged">' + str(res2.percentage) + '</td>' |
|
|
|
|
|
past_dates = list(range(2, 8)) |
|
past_dates.append(14) |
|
past_dates.append(365) |
|
linesdict = gather_necessary_lines(filenam, logLine2.date) |
|
|
|
for days in past_dates: |
|
act_date = get_prev_days(logLine2.date, days) |
|
if linesdict[act_date][1] is not None: |
|
logline_date = linesdict[act_date][1] |
|
restemp = Result(logline_date.testname, logline_date.real, logLine2.real,\ |
|
logLine2.revision, logLine2.branch, logline_date.revision, logline_date.branch) |
|
html = html + append_date_to_table(restemp) |
|
else: |
|
html = html + '<td>N/A</td><td>N/A</td>' |
|
|
|
|
|
|
|
html = html + '</tr>' |
|
|
|
|
|
basebranch_info = '<text><b>Basebranch:</b> ' + res2.prevbranch + ' <b>Revision:</b> ' +\ |
|
res2.prevrev + '</text>' |
|
writeoutstr = HTML_HEADING + basebranch_info + TABLE_HEADING + html + HTML_ENDING |
|
writefile = open(path, 'w') |
|
writefile.write(writeoutstr) |
|
writefile.close() |
|
|
|
if __name__ == '__main__': |
|
CONFIG = parse_testconfig(sys.argv[1]) |
|
produce_html('index.html', CONFIG) |
|
|