Index: webkit/tools/layout_tests/layout_package/websocket_server.py |
=================================================================== |
--- webkit/tools/layout_tests/layout_package/websocket_server.py (revision 36724) |
+++ webkit/tools/layout_tests/layout_package/websocket_server.py (working copy) |
@@ -1,250 +0,0 @@ |
-#!/usr/bin/env python |
-# 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 help start/stop the PyWebSocket server used by layout tests.""" |
- |
- |
-import logging |
-import optparse |
-import os |
-import subprocess |
-import sys |
-import tempfile |
-import time |
- |
-import path_utils |
-import platform_utils |
-import http_server |
- |
-# So we can import httpd_utils below to make ui_tests happy. |
-sys.path.append(path_utils.PathFromBase('tools', 'python')) |
-import google.httpd_utils |
- |
-_WS_LOG_PREFIX = 'pywebsocket.ws.log-' |
-_WSS_LOG_PREFIX = 'pywebsocket.wss.log-' |
- |
-_DEFAULT_WS_PORT = 8880 |
-_DEFAULT_WSS_PORT = 9323 |
- |
- |
-def RemoveLogFiles(folder, starts_with): |
- files = os.listdir(folder) |
- for file in files: |
- if file.startswith(starts_with): |
- full_path = os.path.join(folder, file) |
- os.remove(full_path) |
- |
- |
-class PyWebSocketNotStarted(Exception): |
- pass |
- |
- |
-class PyWebSocketNotFound(Exception): |
- pass |
- |
- |
-class PyWebSocket(http_server.Lighttpd): |
- |
- def __init__(self, output_dir, port=_DEFAULT_WS_PORT, |
- root=None, |
- use_tls=False, |
- private_key=http_server.Lighttpd._pem_file, |
- certificate=http_server.Lighttpd._pem_file, |
- register_cygwin=None, |
- pidfile=None): |
- """Args: |
- output_dir: the absolute path to the layout test result directory |
- """ |
- http_server.Lighttpd.__init__(self, output_dir, |
- port=port, |
- root=root, |
- register_cygwin=register_cygwin) |
- self._output_dir = output_dir |
- self._process = None |
- self._port = port |
- self._root = root |
- self._use_tls = use_tls |
- self._private_key = private_key |
- self._certificate = certificate |
- if self._port: |
- self._port = int(self._port) |
- if self._use_tls: |
- self._server_name = 'PyWebSocket(Secure)' |
- else: |
- self._server_name = 'PyWebSocket' |
- self._pidfile = pidfile |
- self._wsout = None |
- |
- # Webkit tests |
- if self._root: |
- self._layout_tests = os.path.abspath(self._root) |
- self._web_socket_tests = os.path.abspath( |
- os.path.join(self._root, 'websocket', 'tests')) |
- else: |
- try: |
- self._web_socket_tests = path_utils.PathFromBase( |
- 'third_party', 'WebKit', 'LayoutTests', 'websocket', |
- 'tests') |
- self._layout_tests = path_utils.PathFromBase( |
- 'third_party', 'WebKit', 'LayoutTests') |
- except path_utils.PathNotFound: |
- self._web_socket_tests = None |
- |
- def Start(self): |
- if not self._web_socket_tests: |
- logging.info('No need to start %s server.' % self._server_name) |
- return |
- if self.IsRunning(): |
- raise PyWebSocketNotStarted('%s is already running.' % |
- self._server_name) |
- |
- time_str = time.strftime('%d%b%Y-%H%M%S') |
- if self._use_tls: |
- log_prefix = _WSS_LOG_PREFIX |
- else: |
- log_prefix = _WS_LOG_PREFIX |
- log_file_name = log_prefix + time_str |
- |
- # Remove old log files. We only need to keep the last ones. |
- RemoveLogFiles(self._output_dir, log_prefix) |
- |
- 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") |
- self._wsout = open(output_log, "w") |
- |
- python_interp = sys.executable |
- pywebsocket_base = path_utils.PathFromBase( |
- 'third_party', 'WebKit', 'WebKitTools', 'pywebsocket') |
- pywebsocket_script = path_utils.PathFromBase( |
- 'third_party', 'WebKit', 'WebKitTools', 'pywebsocket', |
- 'mod_pywebsocket', 'standalone.py') |
- start_cmd = [ |
- python_interp, pywebsocket_script, |
- '-p', str(self._port), |
- '-d', self._layout_tests, |
- '-s', self._web_socket_tests, |
- '-l', error_log, |
- ] |
- if self._use_tls: |
- start_cmd.extend(['-t', '-k', self._private_key, |
- '-c', self._certificate]) |
- |
- # Put the cygwin directory first in the path to find cygwin1.dll |
- env = os.environ |
- if sys.platform in ('cygwin', 'win32'): |
- env['PATH'] = '%s;%s' % ( |
- path_utils.PathFromBase('third_party', 'cygwin', 'bin'), |
- env['PATH']) |
- |
- if sys.platform == 'win32' and self._register_cygwin: |
- setup_mount = path_utils.PathFromBase('third_party', 'cygwin', |
- 'setup_mount.bat') |
- subprocess.Popen(setup_mount).wait() |
- |
- env['PYTHONPATH'] = (pywebsocket_base + os.path.pathsep + |
- env.get('PYTHONPATH', '')) |
- |
- logging.debug('Starting %s server.' % self._server_name) |
- self._process = subprocess.Popen(start_cmd, stdout=self._wsout, |
- env=env) |
- |
- # Wait a bit before checking the liveness of the server. |
- time.sleep(0.5) |
- |
- if self._use_tls: |
- url = 'https' |
- else: |
- url = 'http' |
- url = url + '://127.0.0.1:%d/' % self._port |
- if not google.httpd_utils.UrlIsAlive(url): |
- raise PyWebSocketNotStarted( |
- 'Failed to start %s server on port %s.' % |
- (self._server_name, self._port)) |
- |
- # Our process terminated already |
- if self._process.returncode != None: |
- raise PyWebSocketNotStarted( |
- 'Failed to start %s server.' % self._server_name) |
- if self._pidfile: |
- f = open(self._pidfile, 'w') |
- f.write("%d" % self._process.pid) |
- f.close() |
- |
- def Stop(self, force=False): |
- if not force and not self.IsRunning(): |
- return |
- |
- if self._process: |
- pid = self._process.pid |
- elif self._pidfile: |
- f = open(self._pidfile) |
- pid = int(f.read().strip()) |
- f.close() |
- |
- if not pid: |
- raise PyWebSocketNotFound( |
- 'Failed to find %s server pid.' % self._server_name) |
- |
- logging.debug('Shutting down %s server %d.' % (self._server_name, pid)) |
- platform_utils.KillProcess(pid) |
- |
- if self._process: |
- self._process.wait() |
- self._process = None |
- |
- if self._wsout: |
- self._wsout.close() |
- self._wsout = None |
- |
- |
-if '__main__' == __name__: |
- # Provide some command line params for starting the PyWebSocket server |
- # manually. |
- option_parser = optparse.OptionParser() |
- option_parser.add_option('--server', type='choice', |
- choices=['start', 'stop'], default='start', |
- help='Server action (start|stop)') |
- option_parser.add_option('-p', '--port', dest='port', |
- default=None, help='Port to listen on') |
- option_parser.add_option('-r', '--root', |
- help='Absolute path to DocumentRoot ' |
- '(overrides layout test roots)') |
- option_parser.add_option('-t', '--tls', dest='use_tls', |
- action='store_true', |
- default=False, help='use TLS (wss://)') |
- option_parser.add_option('-k', '--private_key', dest='private_key', |
- default='', help='TLS private key file.') |
- option_parser.add_option('-c', '--certificate', dest='certificate', |
- default='', help='TLS certificate file.') |
- option_parser.add_option('--register_cygwin', action="store_true", |
- dest="register_cygwin", |
- help='Register Cygwin paths (on Win try bots)') |
- option_parser.add_option('--pidfile', help='path to pid file.') |
- options, args = option_parser.parse_args() |
- |
- if not options.port: |
- if options.use_tls: |
- options.port = _DEFAULT_WSS_PORT |
- else: |
- options.port = _DEFAULT_WS_PORT |
- |
- kwds = {'port': options.port, 'use_tls': options.use_tls} |
- if options.root: |
- kwds['root'] = options.root |
- if options.private_key: |
- kwds['private_key'] = options.private_key |
- if options.certificate: |
- kwds['certificate'] = options.certificate |
- kwds['register_cygwin'] = options.register_cygwin |
- if options.pidfile: |
- kwds['pidfile'] = options.pidfile |
- |
- pywebsocket = PyWebSocket(tempfile.gettempdir(), **kwds) |
- |
- if 'start' == options.server: |
- pywebsocket.Start() |
- else: |
- pywebsocket.Stop(force=True) |