Diff
Modified: trunk/Tools/ChangeLog (114576 => 114577)
--- trunk/Tools/ChangeLog 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/ChangeLog 2012-04-18 23:17:38 UTC (rev 114577)
@@ -1,5 +1,41 @@
2012-04-18 Dirk Pranke <[email protected]>
+ run-webkit-tests picked up an old crash log
+ https://bugs.webkit.org/show_bug.cgi?id=84196
+
+ Reviewed by Ryosuke Niwa.
+
+ Modify the crash log-finding code so that we can
+ limit our search to logs newer than X - this prevents
+ us from finding old crash logs for a given process/pid
+ combination even when the PIDs might've wrapped.
+
+ Also fix a bug in filesystem_mock where files_under() would
+ return paths that didn't exist.
+
+ * Scripts/webkitpy/common/system/crashlogs.py:
+ (CrashLogs.find_newest_log):
+ (CrashLogs._find_newest_log_darwin):
+ * Scripts/webkitpy/common/system/crashlogs_unittest.py:
+ (CrashLogsTest.test_find_log_darwin):
+ (CrashLogsTest.test_find_log_darwin.bad_read):
+ (CrashLogsTest):
+ * Scripts/webkitpy/common/system/filesystem_mock.py:
+ (MockFileSystem.files_under):
+ * Scripts/webkitpy/layout_tests/port/base.py:
+ (Port._get_crash_log):
+ * Scripts/webkitpy/layout_tests/port/gtk.py:
+ (GtkPort._get_crash_log):
+ * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+ * Scripts/webkitpy/layout_tests/port/mac.py:
+ (MacPort._get_crash_log):
+ * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+ (PortTestCase.test_get_crash_log):
+ * Scripts/webkitpy/layout_tests/port/webkit.py:
+ (WebKitDriver.run_test):
+
+2012-04-18 Dirk Pranke <[email protected]>
+
nrwt: support additional test expectations files
https://bugs.webkit.org/show_bug.cgi?id=84222
Modified: trunk/Tools/Scripts/webkitpy/common/system/crashlogs.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/common/system/crashlogs.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/common/system/crashlogs.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -35,9 +35,9 @@
def __init__(self, filesystem):
self._filesystem = filesystem
- def find_newest_log(self, process_name, pid=None, include_errors=False):
+ def find_newest_log(self, process_name, pid=None, include_errors=False, newer_than=None):
if sys.platform == "darwin":
- return self._find_newest_log_darwin(process_name, pid, include_errors)
+ return self._find_newest_log_darwin(process_name, pid, include_errors, newer_than)
return None
def _log_directory_darwin(self):
@@ -49,7 +49,7 @@
log_directory = self._filesystem.join(log_directory, "CrashReporter")
return log_directory
- def _find_newest_log_darwin(self, process_name, pid, include_errors):
+ def _find_newest_log_darwin(self, process_name, pid, include_errors, newer_than):
def is_crash_log(fs, dirpath, basename):
return basename.startswith(process_name + "_") and basename.endswith(".crash")
@@ -58,14 +58,15 @@
first_line_regex = re.compile(r'^Process:\s+(?P<process_name>.*) \[(?P<pid>\d+)\]$')
errors = ''
for path in reversed(sorted(logs)):
- try:
- f = self._filesystem.read_text_file(path)
- match = first_line_regex.match(f[0:f.find('\n')])
- if match and match.group('process_name') == process_name and (pid is None or int(match.group('pid')) == pid):
- return errors + f
- except IOError, e:
- if include_errors:
- errors += "ERROR: Failed to read '%s': %s\n" % (path, str(e))
+ if not newer_than or self._filesystem.mtime(path) > newer_than:
+ try:
+ f = self._filesystem.read_text_file(path)
+ match = first_line_regex.match(f[0:f.find('\n')])
+ if match and match.group('process_name') == process_name and (pid is None or int(match.group('pid')) == pid):
+ return errors + f
+ except IOError, e:
+ if include_errors:
+ errors += "ERROR: Failed to read '%s': %s\n" % (path, str(e))
if include_errors and errors:
return errors
Modified: trunk/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -100,9 +100,12 @@
self.assertLinesEqual(log, mock_crash_report)
log = crash_logs.find_newest_log("DumpRenderTree", 28531)
self.assertEqual(log, None)
+ log = crash_logs.find_newest_log("DumpRenderTree", newer_than=1.0)
+ self.assertEqual(log, None)
- errors = "ERROR: Failed to read '/Users/mock/Library/Logs/DiagnosticReports/DumpRenderTree_2011-06-13-150721_quadzen.crash': [Errno 2] /Users/mock/Library/Logs/DiagnosticReports/DumpRenderTree_2011-06-13-150721_quadzen.crash: 'No such file or directory'\n"
- log = crash_logs.find_newest_log("DumpRenderTree", 28530, include_errors=True)
- self.assertLinesEqual(log, errors + mock_crash_report)
+ def bad_read(path):
+ raise IOError('No such file or directory')
+
+ filesystem.read_text_file = bad_read
log = crash_logs.find_newest_log("DumpRenderTree", 28531, include_errors=True)
- self.assertEqual(log, errors)
+ self.assertTrue('No such file or directory' in log)
Modified: trunk/Tools/Scripts/webkitpy/common/system/filesystem_mock.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/common/system/filesystem_mock.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/common/system/filesystem_mock.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -132,7 +132,7 @@
file_filter = file_filter or filter_all
files = []
if self.isfile(path):
- if file_filter(self, self.dirname(path), self.basename(path)):
+ if file_filter(self, self.dirname(path), self.basename(path)) and self.files[path] is not None:
files.append(path)
return files
@@ -152,7 +152,7 @@
continue
dirpath, basename = self._split(filename)
- if file_filter(self, dirpath, basename):
+ if file_filter(self, dirpath, basename) and self.files[filename] is not None:
files.append(filename)
return files
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -1072,7 +1072,7 @@
"""Returns the port's driver implementation."""
raise NotImplementedError('Port._driver_class')
- def _get_crash_log(self, name, pid, stdout, stderr):
+ def _get_crash_log(self, name, pid, stdout, stderr, newer_than):
name_str = name or '<unknown process name>'
pid_str = str(pid or '<unknown>')
stdout_lines = (stdout or '<empty>').decode('utf8', 'replace').splitlines()
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -205,7 +205,7 @@
errors = [l.strip() for l in proc.stderr.readlines()]
return (proc.stdout.read(), errors)
- def _get_crash_log(self, name, pid, stdout, stderr):
+ def _get_crash_log(self, name, pid, stdout, stderr, newer_than):
pid_representation = str(pid or '<unknown>')
log_directory = os.environ.get("WEBKIT_CORE_DUMPS_DIRECTORY")
errors = []
@@ -222,7 +222,8 @@
if dumps:
# Get the most recent coredump matching the pid and/or process name.
coredump_path = list(reversed(sorted(dumps)))[0]
- crash_log, errors = self._get_gdb_output(coredump_path)
+ if not newer_than or self._filesystem.mtime(coredump_path) > newer_than:
+ crash_log, errors = self._get_gdb_output(coredump_path)
stderr_lines = errors + (stderr or '<empty>').decode('utf8', 'ignore').splitlines()
errors_str = '\n'.join(('STDERR: ' + l) for l in stderr_lines)
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -75,5 +75,8 @@
port = self.make_port()
port._get_gdb_output = mock_empty_crash_log
- log = port._get_crash_log("DumpRenderTree", 28529, "", "")
+ log = port._get_crash_log("DumpRenderTree", 28529, "", "", newer_than=None)
self.assertLinesEqual(log, mock_empty_crash_log)
+
+ log = port._get_crash_log("DumpRenderTree", 28529, "", "", newer_than=0.0)
+ self.assertLinesEqual(log, mock_empty_crash_log)
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -175,7 +175,7 @@
def release_http_lock(self):
pass
- def _get_crash_log(self, name, pid, stdout, stderr):
+ def _get_crash_log(self, name, pid, stdout, stderr, newer_than):
# Note that we do slow-spin here and wait, since it appears the time
# ReportCrash takes to actually write and flush the file varies when there are
# lots of simultaneous crashes going on.
@@ -187,7 +187,7 @@
_log.debug('looking for crash log for %s:%s' % (name, str(pid)))
deadline = now + 5 * int(self.get_option('child_processes'))
while not crash_log and now <= deadline:
- crash_log = crash_logs.find_newest_log(name, pid, include_errors=True)
+ crash_log = crash_logs.find_newest_log(name, pid, include_errors=True, newer_than=newer_than)
if not crash_log or not [line for line in crash_log.splitlines() if not line.startswith('ERROR')]:
time.sleep(0.1)
now = time.time()
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -311,23 +311,27 @@
def test_get_crash_log(self):
port = self.make_port()
- self.assertEquals(port._get_crash_log(None, None, None, None),
+ self.assertEquals(port._get_crash_log(None, None, None, None, newer_than=None),
('crash log for <unknown process name> (pid <unknown>):\n'
'STDOUT: <empty>\n'
'STDERR: <empty>\n'))
- self.assertEquals(port._get_crash_log('foo', 1234, 'out bar\nout baz', 'err bar\nerr baz\n'),
+ self.assertEquals(port._get_crash_log('foo', 1234, 'out bar\nout baz', 'err bar\nerr baz\n', newer_than=None),
('crash log for foo (pid 1234):\n'
'STDOUT: out bar\n'
'STDOUT: out baz\n'
'STDERR: err bar\n'
'STDERR: err baz\n'))
- self.assertEquals(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar'),
+ self.assertEquals(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=None),
(u'crash log for foo (pid 1234):\n'
u'STDOUT: foo\ufffdbar\n'
u'STDERR: foo\ufffdbar\n'))
+ self.assertEquals(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=1.0),
+ (u'crash log for foo (pid 1234):\n'
+ u'STDOUT: foo\ufffdbar\n'
+ u'STDERR: foo\ufffdbar\n'))
# FIXME: This class and main() should be merged into test-webkitpy.
class EnhancedTestLoader(unittest.TestLoader):
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py (114576 => 114577)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py 2012-04-18 23:10:18 UTC (rev 114576)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py 2012-04-18 23:17:38 UTC (rev 114577)
@@ -543,14 +543,14 @@
return (None, block.content_hash)
def run_test(self, driver_input):
+ start_time = time.time()
if not self._server_process:
self._start(driver_input.is_reftest or self._pixel_tests, [])
self.error_from_test = str()
self.err_seen_eof = False
command = self._command_from_driver_input(driver_input)
- start_time = time.time()
- deadline = time.time() + int(driver_input.timeout) / 1000.0
+ deadline = start_time + int(driver_input.timeout) / 1000.0
self._server_process.write(command)
text, audio = self._read_first_block(deadline) # First block is either text or audio
@@ -564,7 +564,8 @@
crash_log = ''
if self.has_crashed():
- crash_log = self._port._get_crash_log(self._crashed_process_name, self._crashed_pid, text, self.error_from_test)
+ crash_log = self._port._get_crash_log(self._crashed_process_name, self._crashed_pid, text, self.error_from_test,
+ newer_than=start_time)
return DriverOutput(text, image, actual_image_hash, audio,
crash=self.has_crashed(), test_time=time.time() - start_time,