Title: [114577] trunk/Tools
Revision
114577
Author
[email protected]
Date
2012-04-18 16:17:38 -0700 (Wed, 18 Apr 2012)

Log Message

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

Modified Paths

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,
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to