| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Base class for running tests on a single device.""" | 5 """Base class for running tests on a single device.""" |
| 6 | 6 |
| 7 # TODO(jbudorick) Deprecate and remove this class and all subclasses after | 7 # TODO(jbudorick) Deprecate and remove this class and all subclasses after |
| 8 # any relevant parts have been ported to the new environment + test instance | 8 # any relevant parts have been ported to the new environment + test instance |
| 9 # model. | 9 # model. |
| 10 | 10 |
| 11 import logging | 11 import logging |
| 12 import time | |
| 13 | 12 |
| 14 from pylib import ports | 13 from pylib import ports |
| 15 from pylib.chrome_test_server_spawner import SpawningServer | |
| 16 from pylib.device import device_utils | 14 from pylib.device import device_utils |
| 17 from pylib.forwarder import Forwarder | 15 from pylib.forwarder import Forwarder |
| 18 from pylib.valgrind_tools import CreateTool | 16 from pylib.valgrind_tools import CreateTool |
| 19 # TODO(frankf): Move this to pylib/utils | 17 # TODO(frankf): Move this to pylib/utils |
| 20 import lighttpd_server | 18 import lighttpd_server |
| 21 | 19 |
| 22 | 20 |
| 23 # A file on device to store ports of net test server. The format of the file is | 21 # A file on device to store ports of net test server. The format of the file is |
| 24 # test-spawner-server-port:test-server-port | 22 # test-spawner-server-port:test-server-port |
| 25 NET_TEST_SERVER_PORT_INFO_FILE = 'net-test-server-ports' | 23 NET_TEST_SERVER_PORT_INFO_FILE = 'net-test-server-ports' |
| 26 | 24 |
| 27 | 25 |
| 28 class BaseTestRunner(object): | 26 class BaseTestRunner(object): |
| 29 """Base class for running tests on a single device.""" | 27 """Base class for running tests on a single device.""" |
| 30 | 28 |
| 31 def __init__(self, device_serial, tool, cleanup_test_files=False): | 29 def __init__(self, device_serial, tool, cleanup_test_files=False): |
| 32 """ | 30 """ |
| 33 Args: | 31 Args: |
| 34 device: Tests will run on the device of this ID. | 32 device: Tests will run on the device of this ID. |
| 35 tool: Name of the Valgrind tool. | 33 tool: Name of the Valgrind tool. |
| 36 cleanup_test_files: Whether or not to cleanup test files on device. | 34 cleanup_test_files: Whether or not to cleanup test files on device. |
| 37 """ | 35 """ |
| 38 self.device_serial = device_serial | 36 self.device_serial = device_serial |
| 39 self.device = device_utils.DeviceUtils(device_serial) | 37 self.device = device_utils.DeviceUtils(device_serial) |
| 40 self.tool = CreateTool(tool, self.device) | 38 self.tool = CreateTool(tool, self.device) |
| 41 self._http_server = None | 39 self._http_server = None |
| 42 self._forwarder_device_port = 8000 | 40 self._forwarder_device_port = 8000 |
| 43 self.forwarder_base_url = ('http://localhost:%d' % | 41 self.forwarder_base_url = ('http://localhost:%d' % |
| 44 self._forwarder_device_port) | 42 self._forwarder_device_port) |
| 45 self._spawning_server = None | |
| 46 # We will allocate port for test server spawner when calling method | 43 # We will allocate port for test server spawner when calling method |
| 47 # LaunchChromeTestServerSpawner and allocate port for test server when | 44 # LaunchChromeTestServerSpawner and allocate port for test server when |
| 48 # starting it in TestServerThread. | 45 # starting it in TestServerThread. |
| 49 self.test_server_spawner_port = 0 | 46 self.test_server_spawner_port = 0 |
| 50 self.test_server_port = 0 | 47 self.test_server_port = 0 |
| 51 self._cleanup_test_files = cleanup_test_files | 48 self._cleanup_test_files = cleanup_test_files |
| 52 | 49 |
| 53 def _PushTestServerPortInfoToDevice(self): | 50 def _PushTestServerPortInfoToDevice(self): |
| 54 """Pushes the latest port information to device.""" | 51 """Pushes the latest port information to device.""" |
| 55 self.device.WriteFile( | 52 self.device.WriteFile( |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 # TODO(dtrainor): This is not always reliable because sometimes the port | 136 # TODO(dtrainor): This is not always reliable because sometimes the port |
| 140 # will be left open even after the forwarder has been killed. | 137 # will be left open even after the forwarder has been killed. |
| 141 if not ports.IsDevicePortUsed(self.device, self._forwarder_device_port): | 138 if not ports.IsDevicePortUsed(self.device, self._forwarder_device_port): |
| 142 self._ForwardPortsForHttpServer() | 139 self._ForwardPortsForHttpServer() |
| 143 | 140 |
| 144 def ShutdownHelperToolsForTestSuite(self): | 141 def ShutdownHelperToolsForTestSuite(self): |
| 145 """Shuts down the server and the forwarder.""" | 142 """Shuts down the server and the forwarder.""" |
| 146 if self._http_server: | 143 if self._http_server: |
| 147 self._UnmapPorts([(self._forwarder_device_port, self._http_server.port)]) | 144 self._UnmapPorts([(self._forwarder_device_port, self._http_server.port)]) |
| 148 self._http_server.ShutdownHttpServer() | 145 self._http_server.ShutdownHttpServer() |
| 149 if self._spawning_server: | |
| 150 self._spawning_server.Stop() | |
| 151 | 146 |
| 152 def CleanupSpawningServerState(self): | |
| 153 """Tells the spawning server to clean up any state. | |
| 154 | |
| 155 If the spawning server is reused for multiple tests, this should be called | |
| 156 after each test to prevent tests affecting each other. | |
| 157 """ | |
| 158 if self._spawning_server: | |
| 159 self._spawning_server.CleanupState() | |
| 160 | |
| 161 def LaunchChromeTestServerSpawner(self): | |
| 162 """Launches test server spawner.""" | |
| 163 server_ready = False | |
| 164 error_msgs = [] | |
| 165 # TODO(pliard): deflake this function. The for loop should be removed as | |
| 166 # well as IsHttpServerConnectable(). spawning_server.Start() should also | |
| 167 # block until the server is ready. | |
| 168 # Try 3 times to launch test spawner server. | |
| 169 for _ in xrange(0, 3): | |
| 170 self.test_server_spawner_port = ports.AllocateTestServerPort() | |
| 171 self._ForwardPorts( | |
| 172 [(self.test_server_spawner_port, self.test_server_spawner_port)]) | |
| 173 self._spawning_server = SpawningServer(self.test_server_spawner_port, | |
| 174 self.device, | |
| 175 self.tool) | |
| 176 self._spawning_server.Start() | |
| 177 server_ready, error_msg = ports.IsHttpServerConnectable( | |
| 178 '127.0.0.1', self.test_server_spawner_port, path='/ping', | |
| 179 expected_read='ready') | |
| 180 if server_ready: | |
| 181 break | |
| 182 else: | |
| 183 error_msgs.append(error_msg) | |
| 184 self._spawning_server.Stop() | |
| 185 # Wait for 2 seconds then restart. | |
| 186 time.sleep(2) | |
| 187 if not server_ready: | |
| 188 logging.error(';'.join(error_msgs)) | |
| 189 raise Exception('Can not start the test spawner server.') | |
| 190 self._PushTestServerPortInfoToDevice() | |
| OLD | NEW |