Title: [97931] trunk/Tools
Revision
97931
Author
e...@webkit.org
Date
2011-10-19 21:22:20 -0700 (Wed, 19 Oct 2011)

Log Message

Reviewed by Adam Barth.

Teach new-run-webkit-tests about #CRASHED and #CRASHED - WebProcess
https://bugs.webkit.org/show_bug.cgi?id=63683

* Scripts/webkitpy/common/net/layouttestresults.py:
* Scripts/webkitpy/common/net/resultsjsonparser.py:
* Scripts/webkitpy/layout_tests/layout_package/manager.py:
* Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:
* Scripts/webkitpy/layout_tests/layout_package/test_failures.py:
* Scripts/webkitpy/layout_tests/layout_package/test_failures_unittest.py:
* Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:
* Scripts/webkitpy/layout_tests/layout_package/worker.py:
* Scripts/webkitpy/layout_tests/port/base.py:
* Scripts/webkitpy/layout_tests/port/server_process.py:
* Scripts/webkitpy/layout_tests/port/webkit.py:
* Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (97930 => 97931)


--- trunk/Tools/ChangeLog	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/ChangeLog	2011-10-20 04:22:20 UTC (rev 97931)
@@ -1,3 +1,23 @@
+2011-10-19  Eric Seidel  <e...@webkit.org>
+
+        Reviewed by Adam Barth.
+
+        Teach new-run-webkit-tests about #CRASHED and #CRASHED - WebProcess
+        https://bugs.webkit.org/show_bug.cgi?id=63683
+
+        * Scripts/webkitpy/common/net/layouttestresults.py:
+        * Scripts/webkitpy/common/net/resultsjsonparser.py:
+        * Scripts/webkitpy/layout_tests/layout_package/manager.py:
+        * Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:
+        * Scripts/webkitpy/layout_tests/layout_package/test_failures.py:
+        * Scripts/webkitpy/layout_tests/layout_package/test_failures_unittest.py:
+        * Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:
+        * Scripts/webkitpy/layout_tests/layout_package/worker.py:
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        * Scripts/webkitpy/layout_tests/port/server_process.py:
+        * Scripts/webkitpy/layout_tests/port/webkit.py:
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+
 2011-10-19  Jochen Eisinger  <joc...@chromium.org>
 
         Chromium doesn't support git branch builds, so don't add the branch to the product dir

Modified: trunk/Tools/Scripts/webkitpy/common/net/layouttestresults.py (97930 => 97931)


--- trunk/Tools/Scripts/webkitpy/common/net/layouttestresults.py	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/Scripts/webkitpy/common/net/layouttestresults.py	2011-10-20 04:22:20 UTC (rev 97931)
@@ -90,7 +90,7 @@
         if table_title == cls.crash_key:
             return [test_failures.FailureCrash()]
         if table_title == cls.webprocess_crash_key:
-            return [test_failures.FailureCrash()]
+            return [test_failures.FailureCrash(process_name="WebProcess")]
         if table_title == cls.timeout_key:
             return [test_failures.FailureTimeout()]
         if table_title == cls.missing_key:

Modified: trunk/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py (97930 => 97931)


--- trunk/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py	2011-10-20 04:22:20 UTC (rev 97931)
@@ -116,6 +116,7 @@
         elif actual == test_expectations.TIMEOUT:
             return [test_failures.FailureTimeout()]
         elif actual == test_expectations.CRASH:
+            # NOTE: We don't know what process crashed from the json, just that a process crashed.
             return [test_failures.FailureCrash()]
         elif actual == test_expectations.MISSING:
             return [test_failures.FailureMissingResult(), test_failures.FailureMissingImageHash(), test_failures.FailureMissingImage()]

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/driver.py (97930 => 97931)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/driver.py	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/driver.py	2011-10-20 04:22:20 UTC (rev 97931)
@@ -39,7 +39,8 @@
 class DriverOutput(object):
     """Groups information about a output from driver for easy passing of data."""
 
-    def __init__(self, text, image, image_hash, audio, crash=False, test_time=0, timeout=False, error=''):
+    def __init__(self, text, image, image_hash, audio, crash=False,
+            test_time=0, timeout=False, error='', crashed_process_name=None):
         # FIXME: Args could be renamed to better clarify what they do.
         self.text = text
         self.image = image  # May be empty-string if the test crashes.
@@ -47,6 +48,7 @@
         self.image_diff = None  # image_diff gets filled in after construction.
         self.audio = audio  # Binary format is port-dependent.
         self.crash = crash
+        self.crashed_process_name = crashed_process_name
         self.test_time = test_time
         self.timeout = timeout
         self.error = error  # stderr output

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process.py (97930 => 97931)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process.py	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process.py	2011-10-20 04:22:20 UTC (rev 97931)
@@ -73,6 +73,9 @@
         self.crashed = False
         self.timed_out = False
 
+    def process_name(self):
+        return self._name
+
     def _start(self):
         if self._proc:
             raise ValueError("%s already running" % self._name)

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py (97930 => 97931)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py	2011-10-20 04:03:22 UTC (rev 97930)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py	2011-10-20 04:22:20 UTC (rev 97931)
@@ -420,6 +420,11 @@
     def __init__(self, port, worker_number):
         Driver.__init__(self, port, worker_number)
         self._driver_tempdir = port._filesystem.mkdtemp(prefix='%s-' % self._port.driver_name())
+        # WebKitTestRunner can report back subprocess crashes by printing
+        # "#CRASHED - PROCESSNAME".  Since those can happen at any time
+        # and ServerProcess won't be aware of them (since the actual tool
+        # didn't crash, just a subprocess) we record the crashed subprocess name here.
+        self._crashed_subprocess_name = None
 
         # stderr reading is scoped on a per-test (not per-block) basis, so we store the accumulated
         # stderr output, as well as if we've seen #EOF on this driver instance.
@@ -458,17 +463,36 @@
         # FIXME: We're assuming that WebKitTestRunner checks this DumpRenderTree-named environment variable.
         environment['DUMPRENDERTREE_TEMP'] = str(self._driver_tempdir)
         environment['LOCAL_RESOURCE_ROOT'] = self._port.layout_tests_dir()
+        self._crashed_subprocess_name = None
         self._server_process = server_process.ServerProcess(self._port, server_name, self.cmd_line(), environment)
 
     def poll(self):
         return self._server_process.poll()
 
-    def detected_crash(self):
-        # FIXME: We can't just check self._server_process.crashed for two reasons:
-        # 1. WebKitTestRunner will print "#CRASHED - WebProcess" and then exit if the WebProcess crashes.
-        # 2. Adam Roben tells me Windows DumpRenderTree can print "#CRASHED" yet still exit cleanly.
-        return self._server_process.crashed
+    def _check_for_driver_crash(self, error_line):
+        if error_line == "#CRASHED\n":
+            # This is used on Windows to report that the process has crashed
+            # See http://trac.webkit.org/changeset/65537.
+            self._server_process.crash = True
+        elif error_line == "#CRASHED - WebProcess\n":
+            # WebKitTestRunner uses this to report that the WebProcess subprocess crashed.
+            self._subprocess_crashed("WebProcess")
+        return self._detected_crash()
 
+    def _detected_crash(self):
+        # We can't just check self._server_process.crashed because WebKitTestRunner
+        # can report subprocess crashes at any time by printing
+        # "#CRASHED - WebProcess", we want to count those as crashes as well.
+        return self._server_process.crashed or self._crashed_subprocess_name
+
+    def _subprocess_crashed(self, subprocess_name):
+        self._crashed_subprocess_name = subprocess_name
+
+    def _crashed_process_name(self):
+        if not self._detected_crash():
+            return None
+        return self._crashed_subprocess_name or self._server_process.process_name()
+
     def _command_from_driver_input(self, driver_input):
         uri = self._port.test_to_uri(driver_input.test_name)
         command = uri[7:] if uri.startswith("file:///") else uri
@@ -507,8 +531,9 @@
         # We may not have read all output (if an error occured), but we certainly should have read all error bytes.
         assert not self._server_process._error, "Unprocessed error output: %s" % self._server_process._error
         return DriverOutput(text, image, actual_image_hash, audio,
-            crash=self.detected_crash(), test_time=time.time() - start_time,
-            timeout=self._server_process.timed_out, error=self.error_from_test)
+            crash=self._detected_crash(), test_time=time.time() - start_time,
+            timeout=self._server_process.timed_out, error=self.error_from_test,
+            crashed_process_name=self._crashed_process_name())
 
     def _read_header(self, block, line, header_text, header_attr, header_filter=None):
         if line.startswith(header_text) and getattr(block, header_attr) is None:
@@ -541,7 +566,7 @@
             if out_seen_eof and (self.err_seen_eof or not wait_for_stderr_eof):
                 break
 
-            if self._server_process.timed_out or self.detected_crash():
+            if self._server_process.timed_out or self._detected_crash():
                 break
 
             timeout = deadline - time.time()
@@ -569,8 +594,9 @@
                 if block._content_length is not None and not block.content:
                     block.content = self._server_process.read_stdout(deadline - time.time(), block._content_length)
 
-            # FIXME: Need to handle "#CRASHED - WebProcess" and "#CRASHED".
             if err_line:
+                if self._check_for_driver_crash(err_line):
+                    break
                 self.error_from_test += err_line
 
         block.decode_content()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to