summaryrefslogtreecommitdiff
path: root/buildscripts/promote_silent_failures.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/promote_silent_failures.py')
-rw-r--r--buildscripts/promote_silent_failures.py65
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()