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()