diff options
6 files changed, 66 insertions, 54 deletions
diff --git a/webkit/tools/layout_tests/layout_package/apache_http_server.py b/webkit/tools/layout_tests/layout_package/apache_http_server.py index 1950c6b..0094322 100644 --- a/webkit/tools/layout_tests/layout_package/apache_http_server.py +++ b/webkit/tools/layout_tests/layout_package/apache_http_server.py @@ -9,20 +9,14 @@ import optparse import os import subprocess import sys -import time import google.httpd_utils +import http_server_base import path_utils import platform_utils -class LayoutTestApacheHttpd(object): - _PORTS = [ - {'port': 8000}, - {'port': 8080}, - {'port': 8443, 'is_ssl': True} - ] - +class LayoutTestApacheHttpd(http_server_base.HttpServerBase): def __init__(self, output_dir): """Args: output_dir: the absolute path to the layout test result directory @@ -31,6 +25,12 @@ class LayoutTestApacheHttpd(object): self._httpd_proc = None path_utils.MaybeMakeDirectory(output_dir) + self.mappings = [ + {'port': 8000}, + {'port': 8080}, + {'port': 8443, 'sslcert': True} + ] + # The upstream .conf file assumed the existence of /tmp/WebKit for placing # apache files like the lock file there. path_utils.MaybeMakeDirectory(os.path.join("/tmp", "WebKit")) @@ -93,15 +93,6 @@ class LayoutTestApacheHttpd(object): ssl and 'SSLEngine On' or '', '</VirtualHost>', '')) - def _IsServerRunningOnAllPorts(self): - """Returns whether the server is running on all the desired ports.""" - for mapping in self._PORTS: - url = 'http%s://127.0.0.1:%d/' % ('is_ssl' in mapping and 's' or '', - mapping['port']) - if not google.httpd_utils.UrlIsAlive(url): - return False - - return True def _StartHttpdProcess(self): """Starts the httpd process and returns whether there were errors.""" @@ -110,28 +101,15 @@ class LayoutTestApacheHttpd(object): return False return True - def _WaitForAction(self, action): - """Repeat the action for 20 seconds or until it succeeds. Returns whether - it succeeded.""" - succeeded = False - - start_time = time.time() - # Give apache up to 20 seconds to start up. - while time.time() - start_time < 20 and not succeeded: - time.sleep(0.1) - succeeded = action() - - return succeeded - def Start(self): """Starts the apache http server.""" # Stop any currently running servers. self.Stop() logging.debug("Starting apache http server") - server_started = self._WaitForAction(self._StartHttpdProcess) + server_started = self.WaitForAction(self._StartHttpdProcess) if server_started: - server_started = self._WaitForAction(self._IsServerRunningOnAllPorts) + server_started = self.WaitForAction(self.IsServerRunningOnAllPorts) if server_started: logging.debug("Server successfully started") diff --git a/webkit/tools/layout_tests/layout_package/http_server.py b/webkit/tools/layout_tests/layout_package/http_server.py index be09331..36490ce 100755 --- a/webkit/tools/layout_tests/layout_package/http_server.py +++ b/webkit/tools/layout_tests/layout_package/http_server.py @@ -16,6 +16,7 @@ import tempfile import time import urllib +import http_server_base import path_utils # So we can import httpd_utils below to make ui_tests happy. @@ -29,7 +30,7 @@ def RemoveLogFiles(folder, starts_with): full_path = os.path.join(folder, file) os.remove(full_path) -class Lighttpd: +class Lighttpd(http_server_base.HttpServerBase): # Webkit tests try: _webkit_tests = path_utils.PathFromBase('third_party', 'WebKit', @@ -84,12 +85,13 @@ class Lighttpd: ) - def __init__(self, output_dir, background=False, port=None, root=None, - register_cygwin=None, run_background=None): + def __init__(self, output_dir, num_workers=None, background=False, port=None, + root=None, register_cygwin=None, run_background=None): """Args: output_dir: the absolute path to the layout test result directory """ self._output_dir = output_dir + self._num_workers = num_workers self._process = None self._port = port self._root = root @@ -139,6 +141,10 @@ class Lighttpd: f.write(('server.errorlog = "%s"\n' 'accesslog.filename = "%s"\n\n') % (error_log, access_log)) + # Setup the number of worker processes to spawn. + if self._num_workers: + f.write('server.max-worker = %s' % self._num_workers) + # Setup upload folders. Upload folder is to hold temporary upload files # and also POST data. This is used to support XHR layout tests that does # POST. @@ -215,38 +221,27 @@ class Lighttpd: self._process = subprocess.Popen(start_cmd, env=env) # Wait for server to start. - time.sleep(3) - - # Ensure that the server is running on all the desired ports. - for mapping in mappings: - url = 'http%s://127.0.0.1:%d/' % ('sslcert' in mapping and 's' or '', - mapping['port']) - if not google.httpd_utils.UrlIsAlive(url): - raise google.httpd_utils.HttpdNotStarted('Failed to start httpd on ', - 'port %s' % - str(mapping['port'])) + self.mappings = mappings + server_started = self.WaitForAction(self.IsServerRunningOnAllPorts) # Our process terminated already - if self._process.returncode != None: + if not server_started or self._process.returncode != None: raise google.httpd_utils.HttpdNotStarted('Failed to start httpd.') + logging.debug("Server successfully started") + # TODO(deanm): Find a nicer way to shutdown cleanly. Our log files are # probably not being flushed, etc... why doesn't our python have os.kill ? def Stop(self, force=False): if not force and not self.IsRunning(): return - logging.debug('Shutting down http server') path_utils.ShutDownHTTPServer(self._process) if self._process: self._process.wait() self._process = None - # Wait a bit to make sure the ports are free'd up - time.sleep(2) - - if '__main__' == __name__: # Provide some command line params for starting/stopping the http server # manually. Also used in ui_tests to run http layout tests in a browser. diff --git a/webkit/tools/layout_tests/layout_package/http_server_base.py b/webkit/tools/layout_tests/layout_package/http_server_base.py new file mode 100644 index 0000000..d4a5f59 --- /dev/null +++ b/webkit/tools/layout_tests/layout_package/http_server_base.py @@ -0,0 +1,38 @@ +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Base class with common routines between the Apache and Lighttpd servers.""" + +import time +import urllib + +class HttpServerBase(object): + def WaitForAction(self, action): + """Repeat the action for 20 seconds or until it succeeds. Returns whether + it succeeded.""" + start_time = time.time() + while time.time() - start_time < 20: + if action(): + return True + time.sleep(1) + + return False + + def IsServerRunningOnAllPorts(self): + """Returns whether the server is running on all the desired ports.""" + for mapping in self.mappings: + if 'sslcert' in mapping: + http_suffix = 's' + else: + http_suffix = '' + + url = 'http%s://127.0.0.1:%d/' % (http_suffix, mapping['port']) + + try: + response = urllib.urlopen(url) + # Server is up and responding. + except IOError: + return False + + return True diff --git a/webkit/tools/layout_tests/layout_package/platform_utils_linux.py b/webkit/tools/layout_tests/layout_package/platform_utils_linux.py index 6b3501c..c5772b4 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils_linux.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils_linux.py @@ -115,7 +115,7 @@ def ShutDownHTTPServer(server_process): # processes not started by http_server.py, but good enough for now. subprocess.call(['killall', '-u', os.getenv('USER'), '-TERM', 'lighttpd']) else: - os.kill(server_process.pid, signal.SIGTERM) + os.kill(server_process.pid, signal.SIGKILL) def KillProcess(pid): """Forcefully kill the process. diff --git a/webkit/tools/layout_tests/layout_package/platform_utils_mac.py b/webkit/tools/layout_tests/layout_package/platform_utils_mac.py index a7ed086..96f176f 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils_mac.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils_mac.py @@ -110,7 +110,7 @@ def ShutDownHTTPServer(server_process): stderr=null) null.close() else: - os.kill(server_process.pid, signal.SIGTERM) + os.kill(server_process.pid, signal.SIGKILL) def KillProcess(pid): """Forcefully kill the process. diff --git a/webkit/tools/layout_tests/run_webkit_tests.py b/webkit/tools/layout_tests/run_webkit_tests.py index d0660de..131ae9e 100755 --- a/webkit/tools/layout_tests/run_webkit_tests.py +++ b/webkit/tools/layout_tests/run_webkit_tests.py @@ -133,7 +133,8 @@ class TestRunner: self._http_server = apache_http_server.LayoutTestApacheHttpd( options.results_directory) else: - self._http_server = http_server.Lighttpd(options.results_directory) + self._http_server = http_server.Lighttpd(options.results_directory, + num_workers=self._options.num_test_shells) self._shardable_directories = ['chrome', 'LayoutTests', 'pending', 'fast', 'svg'] |