Bug 1465527 - Log parent test result stacks. r?jgraham
Parent tests may also have stacktraces and this patch adds a new,
optional keyword argument to the Result class for logging the stack
to the test_end log entry.
MozReview-Commit-ID: HMp3J0BcC7B
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -555512,17 +555512,17 @@
"51cf20e605aa791e3d63c4902377aa3aca987ad7",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-025.html": [
"9393c2e2250dfc1bf3ffdd68f2c352890d1e0ee8",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/sync-tests-filter": [
- "2c4512ec008c997d1254b5822ade227c057b7e24",
+ "3055eafd3bf887f11c0c386419397910ad438d23",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/sync-tests.sh": [
"1c18dc5fdcddbbd08dbdc812f538a175e58892d7",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list": [
"3d686cfc2e832a735cc69da4e62b5fc82ff981db",
@@ -580416,17 +580416,17 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
"html/semantics/forms/the-label-element/iframe-label-attributes.html": [
"3629d93c34f27a575114b15256803941c9893f6e",
"support"
],
"html/semantics/forms/the-label-element/label-attributes.html": [
- "612957c0c5b28b8797118eb5975bb41bc240d257",
+ "2482d37cd516b5f79e7bbf39c157e7c20e2f2100",
"testharness"
],
"html/semantics/forms/the-label-element/labelable-elements.html": [
"80275984254360d8b713b5b330c18ae34138b670",
"testharness"
],
"html/semantics/forms/the-label-element/proxy-click-to-associated-element.html": [
"49f17bfea3e8080fd8690b7be4bc3aa0c82e63e2",
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/base.py
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/base.py
@@ -62,28 +62,31 @@ class TestharnessResultConverter(object)
2: "TIMEOUT",
3: "NOTRUN"}
def __call__(self, test, result, extra=None):
"""Convert a JSON result into a (TestResult, [SubtestResult]) tuple"""
result_url, status, message, stack, subtest_results = result
assert result_url == test.url, ("Got results from %s, expected %s" %
(result_url, test.url))
- harness_result = test.result_cls(self.harness_codes[status], message, extra=extra)
+ harness_result = test.result_cls(self.harness_codes[status], message, extra=extra, stack=stack)
return (harness_result,
[test.subtest_result_cls(st_name, self.test_codes[st_status], st_message, st_stack)
for st_name, st_status, st_message, st_stack in subtest_results])
testharness_result_converter = TestharnessResultConverter()
def reftest_result_converter(self, test, result):
- return (test.result_cls(result["status"], result["message"],
- extra=result.get("extra", {})), [])
+ return (test.result_cls(
+ result["status"],
+ result["message"],
+ extra=result.get("extra", {}),
+ stack=result.get("stack")), [])
def pytest_result_converter(self, test, data):
harness_data, subtest_data = data
if subtest_data is None:
subtest_data = []
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py
@@ -590,17 +590,18 @@ class TestRunnerManager(threading.Thread
int(assertion_count),
test.min_assertion_count,
test.max_assertion_count)
self.logger.test_end(test.id,
status,
message=file_result.message,
expected=expected,
- extra=file_result.extra)
+ extra=file_result.extra,
+ stack=file_result.stack)
restart_before_next = (test.restart_after or
file_result.status in ("CRASH", "EXTERNAL-TIMEOUT", "INTERNAL-ERROR") or
((subtest_unexpected or is_unexpected) and
self.restart_on_unexpected))
if (not file_result.status == "CRASH" and
self.pause_after_test or
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py
@@ -4,23 +4,24 @@ from collections import defaultdict
from wptmanifest.parser import atoms
atom_reset = atoms["Reset"]
enabled_tests = set(["testharness", "reftest", "wdspec"])
class Result(object):
- def __init__(self, status, message, expected=None, extra=None):
+ def __init__(self, status, message, expected=None, extra=None, stack=None):
if status not in self.statuses:
raise ValueError("Unrecognised status %s" % status)
self.status = status
self.message = message
self.expected = expected
self.extra = extra if extra is not None else {}
+ self.stack = stack
def __repr__(self):
return "<%s.%s %s>" % (self.__module__, self.__class__.__name__, self.status)
class SubtestResult(object):
def __init__(self, name, status, message, stack=None, expected=None):
self.name = name