diff options
Diffstat (limited to 'buildscripts/promote_silent_failures.py')
| -rw-r--r-- | buildscripts/promote_silent_failures.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/buildscripts/promote_silent_failures.py b/buildscripts/promote_silent_failures.py new file mode 100644 index 00000000000..d8d45872685 --- /dev/null +++ b/buildscripts/promote_silent_failures.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +"""Convert silent test failures into non-silent failures. + +Any test files with at least 2 executions in the report.json file that have a "silentfail" status, +this script will change the outputted report to have a "fail" status instead. +""" + +import collections +import json +import optparse +import os +import sys + +# Get relative imports to work when the package is not installed on the PYTHONPATH. +if __name__ == "__main__" and __package__ is None: + sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from buildscripts.resmokelib.testing import report + + +def read_json_file(json_file): + """Return contents of a JSON file.""" + with open(json_file) as json_data: + return json.load(json_data) + + +def main(): + """Execute Main program.""" + + usage = "usage: %prog [options] report.json" + parser = optparse.OptionParser(usage=usage) + parser.add_option( + "-o", "--output-file", dest="outfile", default="-", + help=("If '-', then the report file is written to stdout." + " Any other value is treated as the output file name. By default," + " output is written to stdout.")) + + (options, args) = parser.parse_args() + + if len(args) != 1: + parser.error("Requires a single report.json file.") + + report_file_json = read_json_file(args[0]) + test_report = report.TestReport.from_dict(report_file_json) + + # Count number of "silentfail" per test file. + status_dict = collections.defaultdict(int) + for test_info in test_report.test_infos: + if test_info.evergreen_status == "silentfail": + status_dict[test_info.test_id] += 1 + + # For test files with more than 1 "silentfail", convert status to "fail". + for test_info in test_report.test_infos: + if status_dict[test_info.test_id] >= 2: + test_info.evergreen_status = "fail" + + result_report = test_report.as_dict() + if options.outfile != "-": + with open(options.outfile, "w") as fp: + json.dump(result_report, fp) + else: + print(json.dumps(result_report)) + + +if __name__ == "__main__": + main() |
