| Index: generate_test_report.py
|
| diff --git a/generate_test_report.py b/generate_test_report.py
|
| index d84e6159c141824a8207715e5e30b8402bfba6bc..33ec0a6ead47abea8982e9045b1dd0d7d9d3a1af 100755
|
| --- a/generate_test_report.py
|
| +++ b/generate_test_report.py
|
| @@ -113,7 +113,13 @@ class ReportGenerator(object):
|
| if testdir.startswith(self._options.strip):
|
| testdir = testdir.replace(self._options.strip, '', 1)
|
|
|
| - self._results[testdir] = {'status': status,
|
| + crashes = []
|
| + regex = re.compile('Received crash notification for ([-\w]+).+ (sig \d+)')
|
| + for match in regex.finditer(status_raw):
|
| + crashes.append('%s %s' % match.groups())
|
| +
|
| + self._results[testdir] = {'crashes': crashes,
|
| + 'status': status,
|
| 'perf': perf}
|
|
|
| def _CollectResultsRec(self, resdir):
|
| @@ -176,6 +182,7 @@ class ReportGenerator(object):
|
| width = self.GetTestColumnWidth()
|
| line = ''.ljust(width + 5, '-')
|
|
|
| + crashes = {}
|
| tests_pass = 0
|
| print line
|
| for test in tests:
|
| @@ -205,6 +212,14 @@ class ReportGenerator(object):
|
| perf_value_entry = self._color.Color(Color.BOLD, perf[perf_key])
|
| print perf_key_entry + perf_value_entry
|
|
|
| + # Ignore top-level entry, since it's just a combination of all the
|
| + # individual results.
|
| + if result['crashes'] and test != tests[0]:
|
| + for crash in result['crashes']:
|
| + if not crash in crashes:
|
| + crashes[crash] = set([])
|
| + crashes[crash].add(test)
|
| +
|
| print line
|
|
|
| total_tests = len(tests)
|
| @@ -212,6 +227,24 @@ class ReportGenerator(object):
|
| pass_str = '%d/%d (%d%%)' % (tests_pass, total_tests, percent_pass)
|
| print 'Total PASS: ' + self._color.Color(Color.BOLD, pass_str)
|
|
|
| + if self._options.crash_detection:
|
| + print ''
|
| + if crashes:
|
| + print self._color.Color(Color.RED, 'Crashes detected during testing:')
|
| + print line
|
| +
|
| + for crash_name, crashed_tests in sorted(crashes.iteritems()):
|
| + print self._color.Color(Color.RED, crash_name)
|
| + for crashed_test in crashed_tests:
|
| + print ' '*self._KEYVAL_INDENT + crashed_test
|
| +
|
| + print line
|
| + print 'Total unique crashes: ' + self._color.Color(Color.BOLD,
|
| + str(len(crashes)))
|
| + else:
|
| + print self._color.Color(Color.GREEN,
|
| + 'No crashes detected during testing.')
|
| +
|
| # Print out the client debug information for failed tests.
|
| if self._options.print_debug:
|
| for test in tests_with_errors:
|
| @@ -243,7 +276,8 @@ class ReportGenerator(object):
|
| self._CollectResults()
|
| self._GenerateReportText()
|
| for v in self._results.itervalues():
|
| - if v['status'] != 'PASS':
|
| + if v['status'] != 'PASS' or (self._options.crash_detection
|
| + and v['crashes']):
|
| sys.exit(1)
|
|
|
|
|
| @@ -255,6 +289,9 @@ def main():
|
| help='Use color for text reports [default if TTY stdout]')
|
| parser.add_option('--no-color', dest='color', action='store_false',
|
| help='Don\'t use color for text reports')
|
| + parser.add_option('--no-crash-detection', dest='crash_detection',
|
| + action='store_false', default=True,
|
| + help='Don\'t report crashes or error out when detected')
|
| parser.add_option('--perf', dest='perf', action='store_true',
|
| default=True,
|
| help='Include perf keyvals in the report [default]')
|
| @@ -268,7 +305,7 @@ def main():
|
| help='Don\'t strip a prefix from test directory names')
|
| parser.add_option('--no-debug', dest='print_debug', action='store_false',
|
| default=True,
|
| - help='Do not print out the debug log when a test fails.')
|
| + help='Don\'t print out the debug log when a test fails.')
|
| (options, args) = parser.parse_args()
|
|
|
| if not args:
|
|
|