blob: 6c7467aaca71a63e2022eb86d162d7ab035b84f5 [file] [log] [blame]
Mike Frysingerc7f15932013-03-20 13:43:35 -04001#!/usr/bin/python
raymes85ef5db2013-02-15 05:20:49 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to compare a baseline results file to a new results file."""
6
7__author__ = "raymes@google.com (Raymes Khoury)"
8
9import sys
raymesdcb06342013-02-15 05:42:44 +000010from utils import logger
raymes6e4677b2013-02-15 10:24:18 +000011from utils import html_tools
raymes85ef5db2013-02-15 05:20:49 +000012
13PASS = "pass"
14FAIL = "fail"
15NOT_EXECUTED = "not executed"
16
raymes6e4677b2013-02-15 10:24:18 +000017class ResultsReport:
18 def __init__(self, report, num_tests_executed, num_passes, num_failures, num_regressions):
19 self.report = report
20 self.num_tests_executed = num_tests_executed
21 self.num_passes = num_passes
22 self.num_failures = num_failures
23 self.num_regressions = num_regressions
24
25 def GetReport(self):
26 return self.report
27
28 def GetNumExecuted(self):
29 return self.num_tests_executed
30
31 def GetNumPasses(self):
32 return self.num_passes
33
34 def GetNumFailures(self):
35 return self.num_failures
36
37 def GetNumRegressions(self):
38 return self.num_regressions
39
40 def GetSummary(self):
41 summary = "Tests executed: %s\n" % str(self.num_tests_executed)
42 summary += "Tests Passing: %s\n" % str(self.num_passes)
43 summary += "Tests Failing: %s\n" % str(self.num_failures)
44 summary += "Regressions: %s\n" % str(self.num_regressions)
45 return summary
46
raymes85ef5db2013-02-15 05:20:49 +000047def Usage():
raymes6e4677b2013-02-15 10:24:18 +000048 print "Usage: %s baseline_results new_results" % sys.argv[0]
raymes85ef5db2013-02-15 05:20:49 +000049 sys.exit(1)
50
raymes6e4677b2013-02-15 10:24:18 +000051def ParseResults(results_filename):
raymes85ef5db2013-02-15 05:20:49 +000052 results = []
raymes6e4677b2013-02-15 10:24:18 +000053 try:
54 results_file = open(results_filename, 'rb')
55 for line in results_file:
56 if line.strip() != "":
57 results.append(line.strip().split("\t"))
58 results_file.close()
59 except IOError:
60 logger.GetLogger().LogWarning("Could not open results file: " +
61 results_filename)
raymes85ef5db2013-02-15 05:20:49 +000062 return results
63
raymes6e4677b2013-02-15 10:24:18 +000064def GenerateResultsReport(baseline_file, new_result_file):
65 baseline_results = ParseResults(baseline_file)
66 new_results = ParseResults(new_result_file)
raymes85ef5db2013-02-15 05:20:49 +000067
68 test_status = {}
69
70 for new_result in new_results:
raymes6e4677b2013-02-15 10:24:18 +000071 new_test_name = new_result[0]
72 new_test_result = new_result[1]
73 test_status[new_test_name] = (new_test_result, NOT_EXECUTED)
raymes85ef5db2013-02-15 05:20:49 +000074
75 for baseline_result in baseline_results:
raymes6e4677b2013-02-15 10:24:18 +000076 baseline_test_name = baseline_result[0]
77 baseline_test_result = baseline_result[1]
78 if baseline_test_name in test_status:
79 new_test_result = test_status[baseline_test_name][0]
80 test_status[baseline_test_name] = (new_test_result, baseline_test_result)
raymes85ef5db2013-02-15 05:20:49 +000081 else:
raymes6e4677b2013-02-15 10:24:18 +000082 test_status[baseline_test_name] = (NOT_EXECUTED, baseline_test_result)
raymes85ef5db2013-02-15 05:20:49 +000083
84 regressions = []
85 for result in test_status.keys():
86 if test_status[result][0] != test_status[result][1]:
87 regressions.append(result)
raymes6e4677b2013-02-15 10:24:18 +000088
raymes85ef5db2013-02-15 05:20:49 +000089 num_tests_executed = len(new_results)
90 num_regressions = len(regressions)
91 num_passes = 0
92 num_failures = 0
93 for result in new_results:
94 if result[1] == PASS:
95 num_passes += 1
96 else:
97 num_failures += 1
98
raymes6e4677b2013-02-15 10:24:18 +000099 report = html_tools.GetPageHeader("Test Summary")
100 report += html_tools.GetHeader("Test Summary")
101 report += html_tools.GetListHeader()
102 report += html_tools.GetListItem("Tests executed: " + str(num_tests_executed))
103 report += html_tools.GetListItem("Passes: " + str(num_passes))
104 report += html_tools.GetListItem("Failures: " + str(num_failures))
105 report += html_tools.GetListItem("Regressions: " + str(num_regressions))
106 report += html_tools.GetListFooter()
107 report += html_tools.GetHeader("Regressions", 2)
108 report += html_tools.GetTableHeader(["Test name", "Expected result",
109 "Actual result"])
110
raymes85ef5db2013-02-15 05:20:49 +0000111 for regression in regressions:
raymes6e4677b2013-02-15 10:24:18 +0000112 report += html_tools.GetTableRow([regression[:150], test_status[regression][1],
113 test_status[regression][0]])
114 report += "\n"
115 report += html_tools.GetTableFooter()
116 report += html_tools.GetHeader("All Tests", 2)
117 report += html_tools.GetTableHeader(["Test name", "Expected result", "Actual result"])
raymes85ef5db2013-02-15 05:20:49 +0000118 for result in test_status.keys():
raymes6e4677b2013-02-15 10:24:18 +0000119 report += html_tools.GetTableRow([result[:150], test_status[result][1],
120 test_status[result][0]])
121 report += "\n"
122 report += html_tools.GetTableFooter()
123 report += html_tools.GetFooter()
124 return ResultsReport(report, num_tests_executed, num_passes, num_failures, num_regressions)
raymes85ef5db2013-02-15 05:20:49 +0000125
126def Main(argv):
127 if len(argv) < 2:
128 Usage()
129
raymes6e4677b2013-02-15 10:24:18 +0000130 print GenerateResultsReport(argv[1], argv[2])[0]
raymes85ef5db2013-02-15 05:20:49 +0000131
132if __name__ == "__main__":
133 Main(sys.argv)