| Index: webkit/tools/layout_tests/layout_package/json_results_generator.py
|
| ===================================================================
|
| --- webkit/tools/layout_tests/layout_package/json_results_generator.py (revision 26606)
|
| +++ webkit/tools/layout_tests/layout_package/json_results_generator.py (working copy)
|
| @@ -26,6 +26,7 @@
|
| WEBKIT_PATH = "WebKit"
|
| LAYOUT_TESTS_PATH = "layout_tests"
|
| PASS_RESULT = "P"
|
| + SKIP_RESULT = "X"
|
| NO_DATA_RESULT = "N"
|
| VERSION = 1
|
| VERSION_KEY = "version"
|
| @@ -36,9 +37,14 @@
|
| CHROME_SVN = "chromeRevision"
|
| TIME = "secondsSinceEpoch"
|
| TESTS = "tests"
|
| + NON_WONTFIX = "nonWontfixCounts"
|
| + DEFERRED = "deferredCounts"
|
| + ALL = "allCounts"
|
| + FIXABLE_COUNT = "fixableCount"
|
| + FAILURE_CHARS = ["C", "T", "I", "S", "F", "O"]
|
|
|
| def __init__(self, failures, individual_test_timings, builder_name,
|
| - build_number, results_file_path, all_tests):
|
| + build_number, results_file_path, all_tests, result_summary):
|
| """
|
| failures: Map of test name to list of failures.
|
| individual_test_times: Map of test name to a tuple containing the
|
| @@ -47,6 +53,8 @@
|
| build_number: The build number for this run.
|
| results_file_path: Absolute path to the results json file.
|
| all_tests: List of all the tests that were run.
|
| + result_summary: ResultsSummary object containing failure counts for
|
| + different groups of tests.
|
| """
|
| # Make sure all test paths are relative to the layout test root directory.
|
| self._failures = {}
|
| @@ -57,6 +65,8 @@
|
| self._all_tests = [self._GetPathRelativeToLayoutTestRoot(test)
|
| for test in all_tests]
|
|
|
| + self._result_summary = result_summary
|
| +
|
| self._test_timings = {}
|
| for test_tuple in individual_test_timings:
|
| test_path = self._GetPathRelativeToLayoutTestRoot(test_tuple.filename)
|
| @@ -113,7 +123,7 @@
|
| failures_for_json = {}
|
| for test in self._failures:
|
| failures_for_json[test] = ResultAndTime(test, self._all_tests)
|
| - failures_for_json[test].result = self._GetResultsCharForFailure(test)
|
| + failures_for_json[test].result = self._GetResultsCharForTest(test)
|
|
|
| for test in self._test_timings:
|
| if not test in failures_for_json:
|
| @@ -174,6 +184,8 @@
|
| int(time.time()),
|
| self.TIME)
|
|
|
| + self._InsertFailureSummaries(results_for_builder)
|
| +
|
| for test in all_failing_tests:
|
| if test in failures_for_json:
|
| result_and_time = failures_for_json[test]
|
| @@ -194,6 +206,51 @@
|
| results_str = simplejson.dumps(results_json, separators=(',', ':'))
|
| return self.JSON_PREFIX + results_str + self.JSON_SUFFIX
|
|
|
| + def _InsertFailureSummaries(self, results_for_builder):
|
| + """Inserts aggregate pass/failure statistics into the JSON.
|
| +
|
| + Args:
|
| + results_for_builder: Dictionary containing the test results for a single
|
| + builder.
|
| + """
|
| + self._InsertItemIntoRawList(results_for_builder,
|
| + self._result_summary.fixable_count,
|
| + self.FIXABLE_COUNT)
|
| +
|
| + self._InsertItemIntoRawList(results_for_builder,
|
| + self._GetFailureSummaryEntry(self._result_summary.deferred),
|
| + self.DEFERRED)
|
| + self._InsertItemIntoRawList(results_for_builder,
|
| + self._GetFailureSummaryEntry(self._result_summary.non_wontfix),
|
| + self.NON_WONTFIX)
|
| + self._InsertItemIntoRawList(results_for_builder,
|
| + self._GetFailureSummaryEntry(self._result_summary.all),
|
| + self.ALL)
|
| +
|
| + def _GetFailureSummaryEntry(self, result_summary_entry):
|
| + """Creates a summary object to insert into the JSON.
|
| +
|
| + Args:
|
| + result_summary_entry: ResultSummaryEntry for a group of tests
|
| + (e.g. deferred tests).
|
| + """
|
| + entry = {}
|
| + entry[self.SKIP_RESULT] = result_summary_entry.skip_count
|
| + entry[self.PASS_RESULT] = result_summary_entry.pass_count
|
| + for char in self.FAILURE_CHARS:
|
| + # There can be multiple failures that map to "O", so keep existing entry
|
| + # values if they already exist.
|
| + if char in entry:
|
| + count = entry[char]
|
| + else:
|
| + count = 0
|
| +
|
| + for failure in result_summary_entry.failure_counts:
|
| + if char == self._GetResultsCharForFailure([failure]):
|
| + count = result_summary_entry.failure_counts[failure]
|
| + entry[char] = count
|
| + return entry
|
| +
|
| def _InsertItemIntoRawList(self, results_for_builder, item, key):
|
| """Inserts the item into the list with the given key in the results for
|
| this builder. Creates the list if no such list exists.
|
| @@ -264,12 +321,17 @@
|
| results_for_builder[self.TESTS] = {}
|
| return results_for_builder
|
|
|
| - def _GetResultsCharForFailure(self, test):
|
| + def _GetResultsCharForTest(self, test):
|
| """Returns the worst failure from the list of failures for this test
|
| since we can only show one failure per run for each test on the dashboard.
|
| """
|
| failures = [failure.__class__ for failure in self._failures[test]]
|
| + return self._GetResultsCharForFailure(failures)
|
|
|
| + def _GetResultsCharForFailure(self, failures):
|
| + """Returns the worst failure from the list of failures
|
| + since we can only show one failure per run for each test on the dashboard.
|
| + """
|
| if test_failures.FailureCrash in failures:
|
| return "C"
|
| elif test_failures.FailureTimeout in failures:
|
|
|