summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2012-12-17 00:54:58 -0800
committerKenneth Graunke <kenneth@whitecape.org>2012-12-17 00:54:58 -0800
commitffde5dec5c9e45d8e79e5f97710439ad75390d75 (patch)
tree6353ca9a87ed245e0fdfdad98c41a25c2722aca7
parent9ae5537647144f2bd85578eb7a37daf4fc53a31b (diff)
result detail generation
-rw-r--r--framework/database.py4
-rwxr-xr-xprograms/report.py50
2 files changed, 38 insertions, 16 deletions
diff --git a/framework/database.py b/framework/database.py
index a7415a7..4087d50 100644
--- a/framework/database.py
+++ b/framework/database.py
@@ -92,6 +92,6 @@ class ResultDatabase:
def getResults(self, run):
c = self.connection.cursor()
- query = 'SELECT test_name, result, return_code, errors, output FROM results WHERE run_name = ?'
+ query = 'SELECT test_name, command, result, return_code, errors, output FROM results WHERE run_name = ?'
rs = c.execute(query, [run])
- return dict([(r[0], {'result': r[1], 'return_code': r[2], 'errors': r[3], 'output': r[4]}) for r in rs])
+ return dict([(r[0], {'command': r[1], 'result': r[2], 'return_code': r[3], 'errors': r[4], 'output': r[5]}) for r in rs])
diff --git a/programs/report.py b/programs/report.py
index 7cf93df..6119899 100755
--- a/programs/report.py
+++ b/programs/report.py
@@ -40,7 +40,9 @@ def writefile(filename, text):
templateDir = path.join(path.dirname(path.realpath(__file__)), 'templates')
templates = {
- 'index': readfile(path.join(templateDir, 'index.html'))
+ 'index': readfile(path.join(templateDir, 'index.html')),
+ 'result_test': readfile(path.join(templateDir, 'result_test.html')),
+ 'result_detail': readfile(path.join(templateDir, 'result_detail.html')),
}
#############################################################################
@@ -135,10 +137,10 @@ def build_navbox(current_page):
return ''.join([link(p[0], p[1]) for p in pages])
-def testResult(run_name, full_name, status):
+def testResult(run_name, full_name, status, detail_filename):
html = '<a class="%(status)s" href="%(link)s">%(status)s</a>' % {
'status': status if status else 'skip',
- 'link': path.join(run_name, escape(full_name) + '.html')
+ 'link': path.join(escape(run_name), detail_filename)
}
return html
@@ -169,7 +171,7 @@ def buildGroupResultHeader(p):
return '<div class="head %(status)s">%(pass)d/%(total)d</div>' % {
'status': status, 'total': p.totalRun(), 'pass': p.passnr }
-def buildTable(run_names, results):
+def buildTable(run_names, results, detailFilenames):
# If the test list is empty, just return now.
if not results:
return ('', [''])
@@ -212,7 +214,7 @@ def buildTable(run_names, results):
stack[-1].name_html += '<div>' + test + '</div>\n';
for i in range(num_runs):
passv = toPassVector(results[full_test][i]['result'])
- html = testResult(run_names[i], full_test, results[full_test][i]['result'])
+ html = testResult(run_names[i], full_test, results[full_test][i]['result'], detailFilenames[full_test])
stack[-1].results[i].add(passv)
stack[-1].column_html[i] += html
@@ -224,8 +226,8 @@ def buildTable(run_names, results):
return (stack[0].name_html, stack[0].column_html)
-def writeSummaryHtml(run_names, results, resultsDir, page, filename):
- names, columns = buildTable(run_names, results)
+def writeSummaryHtml(run_names, results, resultsDir, page, filename, detailFilenames):
+ names, columns = buildTable(run_names, results, detailFilenames)
def makeColumn(name, contents):
return ''.join(['<div class="resultColumn"><a class="title" href="%s/index.html">%s</a>' % (escape(name), name), contents, '</div>'])
@@ -241,12 +243,28 @@ def writeSummaryHtml(run_names, results, resultsDir, page, filename):
})
#############################################################################
-##### Detail pages
+##### Detail page generation
#############################################################################
-def writeDetailPages(run_name, results, i):
+def interesting(r):
+ return r and r['result'] and r['result'] != 'skip' and r['result'] != 'pass'
+
+# Create result<N>.html pages containing the test result details for a
+# single testrun.
+def writeDetailPages(dirname, run_name, results, filenames, col):
+ pages = {}
for test in results.keys():
- result = results[test][i]
+ r = results[test][col]
+ if interesting(r):
+ p = filenames[test]
+ if p not in pages:
+ pages[p] = []
+
+ pages[p].append(templates['result_test'] % dict(r, test=test, run=run_name))
+
+ for p in pages.keys():
+ writefile(path.join(dirname, p),
+ templates['result_detail'] % {'run': run_name, 'details': ''.join(pages[p])})
#############################################################################
##### Main program
@@ -298,18 +316,22 @@ def main(argv, config):
results = getCombinedResults(db, run_names, args.intersect)
- for i in range(len(run_names)):
- dirname = path.join(reportDir, escape(run_names[i]))
+ detailFilenames = {}
+ for i, test in enumerate(results.keys()):
+ detailFilenames[test] = 'result%d.html' % (i % 100)
+
+ for col in range(len(run_names)):
+ dirname = path.join(reportDir, escape(run_names[col]))
os.mkdir(dirname)
# XXX: write system info
- writeDetailPages(run_names[i], results, i)
+ writeDetailPages(dirname, run_names[col], results, detailFilenames, col)
def writeSummaryPage(page, filename, filterFunc = None):
cut_results = {}
for t in results.keys():
if filterFunc is None or filterFunc([r['result'] for r in results[t]]):
cut_results[t] = results[t]
- writeSummaryHtml(run_names, cut_results, reportDir, page, filename)
+ writeSummaryHtml(run_names, cut_results, reportDir, page, filename, detailFilenames)
os.link(path.join(templateDir, 'index.css'),
path.join(reportDir, 'index.css'))