| """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) |
|
|