Bug 1465527 - Log parent test result stacks. r?jgraham draft
authorAndreas Tolfsen <ato@sny.no>
Wed, 30 May 2018 18:34:45 +0100
changeset 802810 c780b2b82b2db42d9fab4ada012912df82f47895
parent 802805 afa9afc44e19e1e435af329cd6dcd6f4d379aff1
child 802811 273d3ba78cf99830fdceefd25b73db5bded1d230
push id111970
push userbmo:ato@sny.no
push dateFri, 01 Jun 2018 13:58:52 +0000
reviewersjgraham
bugs1465527
milestone62.0a1
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
testing/web-platform/meta/MANIFEST.json
testing/web-platform/tests/tools/wptrunner/wptrunner/executors/base.py
testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py
testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py
--- 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