Index: webkit/tools/layout_tests/layout_package/apache_http_server.py |
=================================================================== |
--- webkit/tools/layout_tests/layout_package/apache_http_server.py (revision 36724) |
+++ webkit/tools/layout_tests/layout_package/apache_http_server.py (working copy) |
@@ -1,203 +0,0 @@ |
-# 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. |
- |
-"""A class to start/stop the apache http server used by layout tests.""" |
- |
-import logging |
-import optparse |
-import os |
-import re |
-import subprocess |
-import sys |
- |
-import http_server_base |
-import path_utils |
-import platform_utils |
- |
- |
-class LayoutTestApacheHttpd(http_server_base.HttpServerBase): |
- |
- def __init__(self, output_dir): |
- """Args: |
- output_dir: the absolute path to the layout test result directory |
- """ |
- self._output_dir = output_dir |
- self._httpd_proc = None |
- path_utils.MaybeMakeDirectory(output_dir) |
- |
- self.mappings = [{'port': 8000}, |
- {'port': 8080}, |
- {'port': 8081}, |
- {'port': 8443, 'sslcert': True}] |
- |
- # The upstream .conf file assumed the existence of /tmp/WebKit for |
- # placing apache files like the lock file there. |
- self._runtime_path = os.path.join("/tmp", "WebKit") |
- path_utils.MaybeMakeDirectory(self._runtime_path) |
- |
- # The PID returned when Apache is started goes away (due to dropping |
- # privileges?). The proper controlling PID is written to a file in the |
- # apache runtime directory. |
- self._pid_file = os.path.join(self._runtime_path, 'httpd.pid') |
- |
- test_dir = path_utils.PathFromBase('third_party', 'WebKit', |
- 'LayoutTests') |
- js_test_resources_dir = self._CygwinSafeJoin(test_dir, "fast", "js", |
- "resources") |
- mime_types_path = self._CygwinSafeJoin(test_dir, "http", "conf", |
- "mime.types") |
- cert_file = self._CygwinSafeJoin(test_dir, "http", "conf", |
- "webkit-httpd.pem") |
- access_log = self._CygwinSafeJoin(output_dir, "access_log.txt") |
- error_log = self._CygwinSafeJoin(output_dir, "error_log.txt") |
- document_root = self._CygwinSafeJoin(test_dir, "http", "tests") |
- |
- executable = platform_utils.ApacheExecutablePath() |
- if self._IsCygwin(): |
- executable = self._GetCygwinPath(executable) |
- |
- cmd = [executable, |
- '-f', self._GetApacheConfigFilePath(test_dir, output_dir), |
- '-C', "\'DocumentRoot %s\'" % document_root, |
- '-c', "\'Alias /js-test-resources %s\'" % js_test_resources_dir, |
- '-C', "\'Listen %s\'" % "127.0.0.1:8000", |
- '-C', "\'Listen %s\'" % "127.0.0.1:8081", |
- '-c', "\'TypesConfig \"%s\"\'" % mime_types_path, |
- '-c', "\'CustomLog \"%s\" common\'" % access_log, |
- '-c', "\'ErrorLog \"%s\"\'" % error_log, |
- '-C', "\'User \"%s\"\'" % os.environ.get("USERNAME", |
- os.environ.get("USER", ""))] |
- |
- if self._IsCygwin(): |
- cygbin = path_utils.PathFromBase('third_party', 'cygwin', 'bin') |
- # Not entirely sure why, but from cygwin we need to run the |
- # httpd command through bash. |
- self._start_cmd = [ |
- os.path.join(cygbin, 'bash.exe'), |
- '-c', |
- 'PATH=%s %s' % (self._GetCygwinPath(cygbin), " ".join(cmd)), |
- ] |
- else: |
- # TODO(ojan): When we get cygwin using Apache 2, use set the |
- # cert file for cygwin as well. |
- cmd.extend(['-c', "\'SSLCertificateFile %s\'" % cert_file]) |
- # Join the string here so that Cygwin/Windows and Mac/Linux |
- # can use the same code. Otherwise, we could remove the single |
- # quotes above and keep cmd as a sequence. |
- self._start_cmd = " ".join(cmd) |
- |
- def _IsCygwin(self): |
- return sys.platform in ("win32", "cygwin") |
- |
- def _CygwinSafeJoin(self, *parts): |
- """Returns a platform appropriate path.""" |
- path = os.path.join(*parts) |
- if self._IsCygwin(): |
- return self._GetCygwinPath(path) |
- return path |
- |
- def _GetCygwinPath(self, path): |
- """Convert a Windows path to a cygwin path. |
- |
- The cygpath utility insists on converting paths that it thinks are |
- Cygwin root paths to what it thinks the correct roots are. So paths |
- such as "C:\b\slave\webkit-release\build\third_party\cygwin\bin" |
- are converted to plain "/usr/bin". To avoid this, we |
- do the conversion manually. |
- |
- The path is expected to be an absolute path, on any drive. |
- """ |
- drive_regexp = re.compile(r'([a-z]):[/\\]', re.IGNORECASE) |
- |
- def LowerDrive(matchobj): |
- return '/cygdrive/%s/' % matchobj.group(1).lower() |
- path = drive_regexp.sub(LowerDrive, path) |
- return path.replace('\\', '/') |
- |
- def _GetApacheConfigFilePath(self, test_dir, output_dir): |
- """Returns the path to the apache config file to use. |
- Args: |
- test_dir: absolute path to the LayoutTests directory. |
- output_dir: absolute path to the layout test results directory. |
- """ |
- httpd_config = platform_utils.ApacheConfigFilePath() |
- httpd_config_copy = os.path.join(output_dir, "httpd.conf") |
- httpd_conf = open(httpd_config).read() |
- if self._IsCygwin(): |
- # This is a gross hack, but it lets us use the upstream .conf file |
- # and our checked in cygwin. This tells the server the root |
- # directory to look in for .so modules. It will use this path |
- # plus the relative paths to the .so files listed in the .conf |
- # file. We have apache/cygwin checked into our tree so |
- # people don't have to install it into their cygwin. |
- cygusr = path_utils.PathFromBase('third_party', 'cygwin', 'usr') |
- httpd_conf = httpd_conf.replace('ServerRoot "/usr"', |
- 'ServerRoot "%s"' % self._GetCygwinPath(cygusr)) |
- |
- # TODO(ojan): Instead of writing an extra file, checkin a conf file |
- # upstream. Or, even better, upstream/delete all our chrome http |
- # tests so we don't need this special-cased DocumentRoot and then |
- # just use the upstream |
- # conf file. |
- chrome_document_root = path_utils.PathFromBase('webkit', 'data', |
- 'layout_tests') |
- if self._IsCygwin(): |
- chrome_document_root = self._GetCygwinPath(chrome_document_root) |
- httpd_conf = (httpd_conf + |
- self._GetVirtualHostConfig(chrome_document_root, 8081)) |
- |
- f = open(httpd_config_copy, 'wb') |
- f.write(httpd_conf) |
- f.close() |
- |
- if self._IsCygwin(): |
- return self._GetCygwinPath(httpd_config_copy) |
- return httpd_config_copy |
- |
- def _GetVirtualHostConfig(self, document_root, port, ssl=False): |
- """Returns a <VirtualHost> directive block for an httpd.conf file. |
- It will listen to 127.0.0.1 on each of the given port. |
- """ |
- return '\n'.join(('<VirtualHost 127.0.0.1:%s>' % port, |
- 'DocumentRoot %s' % document_root, |
- ssl and 'SSLEngine On' or '', |
- '</VirtualHost>', '')) |
- |
- def _StartHttpdProcess(self): |
- """Starts the httpd process and returns whether there were errors.""" |
- # Use shell=True because we join the arguments into a string for |
- # the sake of Window/Cygwin and it needs quoting that breaks |
- # shell=False. |
- self._httpd_proc = subprocess.Popen(self._start_cmd, |
- stderr=subprocess.PIPE, |
- shell=True) |
- err = self._httpd_proc.stderr.read() |
- if len(err): |
- logging.debug(err) |
- return False |
- return True |
- |
- 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) |
- if server_started: |
- logging.debug("Apache started. Testing ports") |
- server_started = self.WaitForAction(self.IsServerRunningOnAllPorts) |
- |
- if server_started: |
- logging.debug("Server successfully started") |
- else: |
- raise Exception('Failed to start http server') |
- |
- def Stop(self): |
- """Stops the apache http server.""" |
- logging.debug("Shutting down any running http servers") |
- httpd_pid = None |
- if os.path.exists(self._pid_file): |
- httpd_pid = int(open(self._pid_file).readline()) |
- path_utils.ShutDownHTTPServer(httpd_pid) |