Index: build/android/chrome_test_server_spawner.py |
diff --git a/build/android/chrome_test_server_spawner.py b/build/android/chrome_test_server_spawner.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..85864dada7460517959fd3fb1f5f9a3590902884 |
--- /dev/null |
+++ b/build/android/chrome_test_server_spawner.py |
@@ -0,0 +1,114 @@ |
+# Copyright (c) 2011 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 "Test Server Spawner" that handles killing/stopping per-test test servers. |
+ |
+It's used to accept requests from the device to spawn and kill instances of the |
+chrome test server on the host. |
+""" |
+ |
+import BaseHTTPServer |
+import logging |
+import os |
+import sys |
+import threading |
+import time |
+import urlparse |
+ |
+# Path that are needed to import testserver |
+cr_src = os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', '..') |
+sys.path.append(os.path.join(cr_src, 'third_party')) |
+sys.path.append(os.path.join(cr_src, 'third_party', 'tlslite')) |
+sys.path.append(os.path.join(cr_src, 'third_party', 'pyftpdlib', 'src')) |
+sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', |
+ '..', 'net', 'tools', 'testserver')) |
+import testserver |
+ |
+_test_servers = [] |
+ |
+class SpawningServerRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
+ """A handler used to process http GET request. |
+ """ |
+ |
+ def GetServerType(self, server_type): |
+ """Returns the server type to use when starting the test server. |
+ |
+ This function translate the command-line argument into the appropriate |
+ numerical constant. |
+ # TODO(yfriedman): Do that translation! |
+ """ |
+ if server_type: |
+ pass |
+ return 0 |
+ |
+ def do_GET(self): |
+ parsed_path = urlparse.urlparse(self.path) |
+ action = parsed_path.path |
+ params = urlparse.parse_qs(parsed_path.query, keep_blank_values=1) |
+ logging.info('Action is: %s' % action) |
+ if action == '/killserver': |
+ # There should only ever be one test server at a time. This may do the |
+ # wrong thing if we try and start multiple test servers. |
+ _test_servers.pop().Stop() |
+ elif action == '/start': |
+ logging.info('Handling request to spawn a test webserver') |
+ for param in params: |
+ logging.info('%s=%s' % (param, params[param][0])) |
+ s_type = 0 |
+ doc_root = None |
+ if 'server_type' in params: |
+ s_type = self.GetServerType(params['server_type'][0]) |
+ if 'doc_root' in params: |
+ doc_root = params['doc_root'][0] |
+ self.webserver_thread = threading.Thread( |
+ target=self.SpawnTestWebServer, args=(s_type, doc_root)) |
+ self.webserver_thread.setDaemon(True) |
+ self.webserver_thread.start() |
+ self.send_response(200, 'OK') |
+ self.send_header('Content-type', 'text/html') |
+ self.end_headers() |
+ self.wfile.write('<html><head><title>started</title></head></html>') |
+ logging.info('Returned OK!!!') |
+ |
+ def SpawnTestWebServer(self, s_type, doc_root): |
+ class Options(object): |
+ log_to_console = True |
+ server_type = s_type |
+ port = self.server.test_server_port |
+ data_dir = doc_root or 'chrome/test/data' |
+ file_root_url = '/files/' |
+ cert = False |
+ policy_keys = None |
+ policy_user = None |
+ startup_pipe = None |
+ options = Options() |
+ logging.info('Listening on %d, type %d, data_dir %s' % (options.port, |
+ options.server_type, options.data_dir)) |
+ testserver.main(options, None, server_list=_test_servers) |
+ logging.info('Test-server has died.') |
+ |
+ |
+class SpawningServer(object): |
+ """The class used to start/stop a http server. |
+ """ |
+ |
+ def __init__(self, test_server_spawner_port, test_server_port): |
+ logging.info('Creating new spawner %d', test_server_spawner_port) |
+ self.server = testserver.StoppableHTTPServer(('', test_server_spawner_port), |
+ SpawningServerRequestHandler) |
+ self.port = test_server_spawner_port |
+ self.server.test_server_port = test_server_port |
+ |
+ def Listen(self): |
+ logging.info('Starting test server spawner') |
+ self.server.serve_forever() |
+ |
+ def Start(self): |
+ listener_thread = threading.Thread(target=self.Listen) |
+ listener_thread.setDaemon(True) |
+ listener_thread.start() |
+ time.sleep(1) |
+ |
+ def Stop(self): |
+ self.server.Stop() |