Title: [91315] trunk/Tools
Revision
91315
Author
[email protected]
Date
2011-07-19 15:56:06 -0700 (Tue, 19 Jul 2011)

Log Message

new-run-webkit-tests should only enable MallocStackLogging for DRT
https://bugs.webkit.org/show_bug.cgi?id=64792

Reviewed by Adam Barth.

The previous code would enable it for all servers launched
by the port, which included Apache, the python websocket server
as well as ImageDiff.  Now only DumpRenderTree will have
MallocStackLogging enabled or the GuardMalloc library injected.

I also cleaned up the websocket_server code to use filesystem
while I was in it.

I also made DRT restart every 1000 tests when running with
--leaks enabled.  I believe this made the --leaks run slightly
faster, but it still takes over an hour on my machine. :(

* Scripts/webkitpy/layout_tests/controllers/worker.py:
* Scripts/webkitpy/layout_tests/port/base.py:
* Scripts/webkitpy/layout_tests/port/chromium_win.py:
* Scripts/webkitpy/layout_tests/port/gtk.py:
* Scripts/webkitpy/layout_tests/port/mac.py:
* Scripts/webkitpy/layout_tests/port/qt.py:
* Scripts/webkitpy/layout_tests/port/server_process.py:
* Scripts/webkitpy/layout_tests/port/webkit.py:
* Scripts/webkitpy/layout_tests/servers/http_server.py:
* Scripts/webkitpy/layout_tests/servers/websocket_server.py:

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (91314 => 91315)


--- trunk/Tools/ChangeLog	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/ChangeLog	2011-07-19 22:56:06 UTC (rev 91315)
@@ -1,3 +1,33 @@
+2011-07-19  Eric Seidel  <[email protected]>
+
+        new-run-webkit-tests should only enable MallocStackLogging for DRT
+        https://bugs.webkit.org/show_bug.cgi?id=64792
+
+        Reviewed by Adam Barth.
+
+        The previous code would enable it for all servers launched
+        by the port, which included Apache, the python websocket server
+        as well as ImageDiff.  Now only DumpRenderTree will have
+        MallocStackLogging enabled or the GuardMalloc library injected.
+
+        I also cleaned up the websocket_server code to use filesystem
+        while I was in it.
+
+        I also made DRT restart every 1000 tests when running with
+        --leaks enabled.  I believe this made the --leaks run slightly
+        faster, but it still takes over an hour on my machine. :(
+
+        * Scripts/webkitpy/layout_tests/controllers/worker.py:
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        * Scripts/webkitpy/layout_tests/port/chromium_win.py:
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        * Scripts/webkitpy/layout_tests/port/server_process.py:
+        * Scripts/webkitpy/layout_tests/port/webkit.py:
+        * Scripts/webkitpy/layout_tests/servers/http_server.py:
+        * Scripts/webkitpy/layout_tests/servers/websocket_server.py:
+
 2011-07-19  Ojan Vafai  <[email protected]>
 
         remove the concept of platform fallbacks

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -68,8 +68,7 @@
         self._filesystem = port.filesystem
         self._batch_count = 0
         self._batch_size = self._options.batch_size
-        tests_run_filename = self._filesystem.join(port.results_directory(),
-                                                   "tests_run%d.txt" % self._worker_number)
+        tests_run_filename = self._filesystem.join(port.results_directory(), "tests_run%d.txt" % self._worker_number)
         self._tests_run_file = self._filesystem.open_text_file_for_writing(tests_run_filename)
 
     def cancel(self):

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -234,7 +234,8 @@
             httpd_path = self._path_to_lighttpd()
 
         try:
-            env = self.setup_environ_for_server()
+            server_name = self._filesystem.basename(httpd_path)
+            env = self.setup_environ_for_server(server_name)
             return self._executive.run_command([httpd_path, "-v"], env=env, return_exit_code=True) == 0
         except OSError:
             _log.error("No httpd found. Cannot run http tests.")
@@ -662,7 +663,7 @@
         """Perform port-specific work at the beginning of a test run."""
         pass
 
-    def setup_environ_for_server(self):
+    def setup_environ_for_server(self, server_name=None):
         """Perform port-specific work at the beginning of a server launch.
 
         Returns:

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -98,7 +98,7 @@
             assert self._version in self.SUPPORTED_VERSIONS, "%s is not in %s" % (self._version, self.SUPPORTED_VERSIONS)
         self._operating_system = 'win'
 
-    def setup_environ_for_server(self):
+    def setup_environ_for_server(self, server_name=None):
         env = chromium.ChromiumPort.setup_environ_for_server(self)
         # Put the cygwin directory first in the path to find cygwin1.dll.
         env["PATH"] = "%s;%s" % (self.path_from_chromium_base("third_party", "cygwin", "bin"), env["PATH"])

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/gtk.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -44,10 +44,11 @@
         display_id = self._worker_number + 1
         run_xvfb = ["Xvfb", ":%d" % (display_id), "-screen",  "0", "800x600x24", "-nolisten", "tcp"]
         self._xvfb_process = subprocess.Popen(run_xvfb)
-        environment = self._port.setup_environ_for_server()
+        server_name = self._port.driver_name()
+        environment = self._port.setup_environ_for_server(server_name)
         # We must do this here because the DISPLAY number depends on _worker_number
         environment['DISPLAY'] = ":%d" % (display_id)
-        self._server_process = server_process.ServerProcess(self._port, self._port.driver_name(), self.cmd_line(), environment)
+        self._server_process = server_process.ServerProcess(self._port, server_name, self.cmd_line(), environment)
 
     def stop(self):
         webkit.WebKitDriver.stop(self)
@@ -64,8 +65,8 @@
     def create_driver(self, worker_number):
         return GtkDriver(self, worker_number)
 
-    def setup_environ_for_server(self):
-        environment = webkit.WebKitPort.setup_environ_for_server(self)
+    def setup_environ_for_server(self, server_name=None):
+        environment = webkit.WebKitPort.setup_environ_for_server(self, server_name)
         environment['GTK_MODULES'] = 'gail'
         environment['LIBOVERLAY_SCROLLBAR'] = '0'
         environment['WEBKIT_INSPECTOR_PATH'] = self._build_path('Programs/resources/inspector')

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/mac.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -118,7 +118,10 @@
     def check_for_leaks(self, process_name, process_pid):
         _log.debug("Checking for leaks in %s" % process_name)
         try:
-            leaks_output = self._port._run_script("run-leaks", self._leaks_args(process_pid), include_configuration_arguments=False)
+            # Oddly enough, run-leaks (or the underlying leaks tool) does not seem to always output utf-8,
+            # thus we pass decode_output=False.  Without this code we've seen errors like:
+            # "UnicodeDecodeError: 'utf8' codec can't decode byte 0x88 in position 779874: unexpected code byte"
+            leaks_output = self._port._run_script("run-leaks", self._leaks_args(process_pid), include_configuration_arguments=False, decode_output=False)
         except ScriptError, e:
             _log.warn("Failed to run leaks tool: %s" % e.message_with_output())
             return
@@ -130,7 +133,7 @@
 
         leaks_filename = self.leaks_file_name(process_name, process_pid)
         leaks_output_path = self._filesystem.join(self._port.results_directory(), leaks_filename)
-        self._filesystem.write_text_file(leaks_output_path, leaks_output)
+        self._filesystem.write_binary_file(leaks_output_path, leaks_output)
 
         # FIXME: Ideally we would not be logging from the worker process, but rather pass the leak
         # information back to the manager and have it log.
@@ -195,6 +198,10 @@
             assert self._version in self.SUPPORTED_VERSIONS, "%s is not in %s" % (self._version, self.SUPPORTED_VERSIONS)
         self._operating_system = 'mac'
         self._leak_detector = LeakDetector(self)
+        if self.get_option("leaks"):
+            # DumpRenderTree slows down noticably if we run more than about 1000 tests in a batch
+            # with MallocStackLogging enabled.
+            self.set_option_default("batch_size", 1000)
 
     def baseline_search_path(self):
         search_paths = self.FALLBACK_PATHS[self._version]
@@ -202,12 +209,13 @@
             search_paths.insert(0, self._wk2_port_name())
         return map(self._webkit_baseline_path, search_paths)
 
-    def setup_environ_for_server(self):
-        env = WebKitPort.setup_environ_for_server(self)
-        if self.get_option('leaks'):
-            env['MallocStackLogging'] = '1'
-        if self.get_option('guard_malloc'):
-            env['DYLD_INSERT_LIBRARIES'] = '/usr/lib/libgmalloc.dylib'
+    def setup_environ_for_server(self, server_name=None):
+        env = WebKitPort.setup_environ_for_server(self, server_name)
+        if server_name == self.driver_name():
+            if self.get_option('leaks'):
+                env['MallocStackLogging'] = '1'
+            if self.get_option('guard_malloc'):
+                env['DYLD_INSERT_LIBRARIES'] = '/usr/lib/libgmalloc.dylib'
         return env
 
     # Belongs on a Platform object.
@@ -244,7 +252,7 @@
         leaks_files = self._leak_detector.leaks_files_in_directory(self.results_directory())
         if not leaks_files:
             return
-        total_bytes, unique_leaks = self.parse_leak_files(leaks_files)
+        total_bytes, unique_leaks = self._leak_detector.parse_leak_files(leaks_files)
         _log.info("%s total leaks found for a total of %s!" % (self._total_leaks, total_bytes))
         _log.info("%s unique leaks found!" % unique_leaks)
 

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/qt.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/qt.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/qt.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -82,8 +82,8 @@
     def _runtime_feature_list(self):
         return None
 
-    def setup_environ_for_server(self):
-        env = WebKitPort.setup_environ_for_server(self)
+    def setup_environ_for_server(self, server_name=None):
+        env = WebKitPort.setup_environ_for_server(self, server_name)
         env['QTWEBKIT_PLUGIN_PATH'] = self._build_path('lib/plugins')
         return env
 

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


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/server_process.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -124,6 +124,7 @@
             self._proc.stdin.write(input)
         except IOError, e:
             self.stop()
+            # stop() calls _reset(), so we have to set crashed to True after calling stop().
             self.crashed = True
 
     def read_line(self, timeout):
@@ -160,8 +161,7 @@
                 string is returned.
         """
         if size <= 0:
-            raise ValueError('ServerProcess.read() called with a '
-                             'non-positive size: %d ' % size)
+            raise ValueError('ServerProcess.read() called with a non-positive size: %d ' % size)
         return self._read(timeout, size)
 
     def _check_for_crash(self):
@@ -236,7 +236,9 @@
         if not self._proc:
             return
 
-        self._port.check_for_leaks(self.name(), self.pid())
+        # Only bother to check for leaks if the process is still running.
+        if self.poll() is None:
+            self._port.check_for_leaks(self.name(), self.pid())
 
         pid = self._proc.pid
         self._proc.stdin.close()

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


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/webkit.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -111,13 +111,13 @@
             config_args.append(port_flag)
         return config_args
 
-    def _run_script(self, script_name, args=None, include_configuration_arguments=True):
+    def _run_script(self, script_name, args=None, include_configuration_arguments=True, decode_output=True):
         run_script_command = [self._config.script_path(script_name)]
         if include_configuration_arguments:
             run_script_command.extend(self._arguments_for_configuration())
         if args:
             run_script_command.extend(args)
-        return self._executive.run_command(run_script_command, cwd=self._config.webkit_base_dir())
+        return self._executive.run_command(run_script_command, cwd=self._config.webkit_base_dir(), decode_output=decode_output)
 
     def _build_driver(self):
         try:
@@ -444,11 +444,12 @@
         return cmd
 
     def start(self):
-        environment = self._port.setup_environ_for_server()
+        server_name = self._port.driver_name()
+        environment = self._port.setup_environ_for_server(server_name)
         environment['DYLD_FRAMEWORK_PATH'] = self._port._build_path()
         # FIXME: We're assuming that WebKitTestRunner checks this DumpRenderTree-named environment variable.
         environment['DUMPRENDERTREE_TEMP'] = str(self._driver_tempdir)
-        self._server_process = server_process.ServerProcess(self._port, self._port.driver_name(), self.cmd_line(), environment)
+        self._server_process = server_process.ServerProcess(self._port, server_name, self.cmd_line(), environment)
 
     def poll(self):
         return self._server_process.poll()

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -180,7 +180,7 @@
                                       os.path.join(tmp_module_path, lib_file))
 
         self._start_cmd = start_cmd
-        self._env = self._port_obj.setup_environ_for_server()
+        self._env = self._port_obj.setup_environ_for_server('lighttpd')
         self._mappings = mappings
 
     def _remove_stale_logs(self):

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py (91314 => 91315)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py	2011-07-19 22:49:32 UTC (rev 91314)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py	2011-07-19 22:56:06 UTC (rev 91315)
@@ -82,16 +82,15 @@
             self._pid_file = self._filesystem.join(self._runtime_path, '%s.pid' % self._name)
 
         # Webkit tests
+        # FIXME: This is the wrong way to detect if we're in Chrome vs. WebKit!
+        # The port objects are supposed to abstract this.
         if self._root:
-            self._layout_tests = os.path.abspath(self._root)
-            self._web_socket_tests = os.path.abspath(
-                os.path.join(self._root, 'http', 'tests',
-                             'websocket', 'tests'))
+            self._layout_tests = self._filesystem.abspath(self._root)
+            self._web_socket_tests = self._filesystem.abspath(self._filesystem.join(self._root, 'http', 'tests', 'websocket', 'tests'))
         else:
             try:
                 self._layout_tests = self._port_obj.layout_tests_dir()
-                self._web_socket_tests = os.path.join(self._layout_tests,
-                     'http', 'tests', 'websocket', 'tests')
+                self._web_socket_tests = self._filesystem.join(self._layout_tests, 'http', 'tests', 'websocket', 'tests')
             except:
                 self._web_socket_tests = None
 
@@ -103,34 +102,32 @@
     def _prepare_config(self):
         time_str = time.strftime('%d%b%Y-%H%M%S')
         log_file_name = self._log_prefix + time_str
+        # FIXME: Doesn't Executive have a devnull, so that we don't have to use os.devnull directly?
         self._wsin = open(os.devnull, 'r')
 
-        error_log = os.path.join(self._output_dir, log_file_name + "-err.txt")
-
-        output_log = os.path.join(self._output_dir, log_file_name + "-out.txt")
+        error_log = self._filesystem.join(self._output_dir, log_file_name + "-err.txt")
+        output_log = self._filesystem.join(self._output_dir, log_file_name + "-out.txt")
         self._wsout = self._filesystem.open_text_file_for_writing(output_log)
 
         from webkitpy.thirdparty.autoinstalled.pywebsocket import mod_pywebsocket
         python_interp = sys.executable
-        pywebsocket_base = os.path.join(
-            os.path.dirname(os.path.dirname(os.path.dirname(
-            os.path.abspath(__file__)))), 'thirdparty',
-            'autoinstalled', 'pywebsocket')
-        pywebsocket_script = os.path.join(pywebsocket_base, 'mod_pywebsocket',
-            'standalone.py')
+        # FIXME: Use self._filesystem.path_to_module(self.__module__) instead of __file__
+        # I think this is trying to get the chrome directory?  Doesn't the port object know that?
+        pywebsocket_base = self._filesystem.join(self._filesystem.dirname(self._filesystem.dirname(self._filesystem.dirname(self._filesystem.abspath(__file__)))), 'thirdparty', 'autoinstalled', 'pywebsocket')
+        pywebsocket_script = self._filesystem.join(pywebsocket_base, 'mod_pywebsocket', 'standalone.py')
         start_cmd = [
             python_interp, '-u', pywebsocket_script,
             '--server-host', '127.0.0.1',
             '--port', str(self._port),
-            '--document-root', os.path.join(self._layout_tests, 'http', 'tests'),
+            # FIXME: Don't we have a self._port_obj.layout_test_path?
+            '--document-root', self._filesystem.join(self._layout_tests, 'http', 'tests'),
             '--scan-dir', self._web_socket_tests,
             '--cgi-paths', '/websocket/tests',
             '--log-file', error_log,
         ]
 
-        handler_map_file = os.path.join(self._web_socket_tests,
-                                        'handler_map.txt')
-        if os.path.exists(handler_map_file):
+        handler_map_file = self._filesystem.join(self._web_socket_tests, 'handler_map.txt')
+        if self._filesystem.exists(handler_map_file):
             _log.debug('Using handler_map_file: %s' % handler_map_file)
             start_cmd.append('--websock-handlers-map-file')
             start_cmd.append(handler_map_file)
@@ -142,7 +139,8 @@
                               '-c', self._certificate])
 
         self._start_cmd = start_cmd
-        self._env = self._port_obj.setup_environ_for_server()
+        server_name = self._filesystem.basename(pywebsocket_script)
+        self._env = self._port_obj.setup_environ_for_server(server_name)
         self._env['PYTHONPATH'] = (pywebsocket_base + os.path.pathsep + self._env.get('PYTHONPATH', ''))
 
     def _remove_stale_logs(self):
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to