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 import contextlib | 7 import contextlib |
8 import httplib | 8 import httplib |
9 import logging | 9 import logging |
10 import os | 10 import os |
(...skipping 28 matching lines...) Expand all Loading... | |
39 Args: | 39 Args: |
40 device: Tests will run on the device of this ID. | 40 device: Tests will run on the device of this ID. |
41 shard_index: Index number of the shard on which the test suite will run. | 41 shard_index: Index number of the shard on which the test suite will run. |
42 build_type: 'Release' or 'Debug'. | 42 build_type: 'Release' or 'Debug'. |
43 push_deps: If True, push all dependencies to the device. | 43 push_deps: If True, push all dependencies to the device. |
44 """ | 44 """ |
45 self.device = device | 45 self.device = device |
46 self.adb = android_commands.AndroidCommands(device=device) | 46 self.adb = android_commands.AndroidCommands(device=device) |
47 self.tool = CreateTool(tool, self.adb) | 47 self.tool = CreateTool(tool, self.adb) |
48 self._http_server = None | 48 self._http_server = None |
49 self._forwarder = None | |
50 self._forwarder_device_port = 8000 | 49 self._forwarder_device_port = 8000 |
51 self.forwarder_base_url = ('http://localhost:%d' % | 50 self.forwarder_base_url = ('http://localhost:%d' % |
52 self._forwarder_device_port) | 51 self._forwarder_device_port) |
53 self.flags = FlagChanger(self.adb) | 52 self.flags = FlagChanger(self.adb) |
54 self.flags.AddFlags(['--disable-fre']) | 53 self.flags.AddFlags(['--disable-fre']) |
55 self._spawning_server = None | 54 self._spawning_server = None |
56 self._spawner_forwarder = None | |
57 # We will allocate port for test server spawner when calling method | 55 # We will allocate port for test server spawner when calling method |
58 # LaunchChromeTestServerSpawner and allocate port for test server when | 56 # LaunchChromeTestServerSpawner and allocate port for test server when |
59 # starting it in TestServerThread. | 57 # starting it in TestServerThread. |
60 self.test_server_spawner_port = 0 | 58 self.test_server_spawner_port = 0 |
61 self.test_server_port = 0 | 59 self.test_server_port = 0 |
62 self.build_type = build_type | 60 self.build_type = build_type |
63 self._push_deps = push_deps | 61 self._push_deps = push_deps |
64 | 62 |
65 def _PushTestServerPortInfoToDevice(self): | 63 def _PushTestServerPortInfoToDevice(self): |
66 """Pushes the latest port information to device.""" | 64 """Pushes the latest port information to device.""" |
(...skipping 17 matching lines...) Expand all Loading... | |
84 def InstallTestPackage(self): | 82 def InstallTestPackage(self): |
85 """Installs the test package once before all tests are run.""" | 83 """Installs the test package once before all tests are run.""" |
86 pass | 84 pass |
87 | 85 |
88 def PushDataDeps(self): | 86 def PushDataDeps(self): |
89 """Push all data deps to device once before all tests are run.""" | 87 """Push all data deps to device once before all tests are run.""" |
90 pass | 88 pass |
91 | 89 |
92 def SetUp(self): | 90 def SetUp(self): |
93 """Run once before all tests are run.""" | 91 """Run once before all tests are run.""" |
94 Forwarder.KillDevice(self.adb, self.tool) | |
95 self.InstallTestPackage() | 92 self.InstallTestPackage() |
96 push_size_before = self.adb.GetPushSizeInfo() | 93 push_size_before = self.adb.GetPushSizeInfo() |
97 if self._push_deps: | 94 if self._push_deps: |
98 logging.warning('Pushing data files to device.') | 95 logging.warning('Pushing data files to device.') |
99 self.PushDataDeps() | 96 self.PushDataDeps() |
100 push_size_after = self.adb.GetPushSizeInfo() | 97 push_size_after = self.adb.GetPushSizeInfo() |
101 logging.warning( | 98 logging.warning( |
102 'Total data: %0.3fMB' % | 99 'Total data: %0.3fMB' % |
103 ((push_size_after[0] - push_size_before[0]) / float(2 ** 20))) | 100 ((push_size_after[0] - push_size_before[0]) / float(2 ** 20))) |
104 logging.warning( | 101 logging.warning( |
(...skipping 29 matching lines...) Expand all Loading... | |
134 port: port on which we want to the http server bind. | 131 port: port on which we want to the http server bind. |
135 extra_config_contents: Extra config contents for the HTTP server. | 132 extra_config_contents: Extra config contents for the HTTP server. |
136 """ | 133 """ |
137 self._http_server = lighttpd_server.LighttpdServer( | 134 self._http_server = lighttpd_server.LighttpdServer( |
138 document_root, port=port, extra_config_contents=extra_config_contents) | 135 document_root, port=port, extra_config_contents=extra_config_contents) |
139 if self._http_server.StartupHttpServer(): | 136 if self._http_server.StartupHttpServer(): |
140 logging.info('http server started: http://localhost:%s', | 137 logging.info('http server started: http://localhost:%s', |
141 self._http_server.port) | 138 self._http_server.port) |
142 else: | 139 else: |
143 logging.critical('Failed to start http server') | 140 logging.critical('Failed to start http server') |
144 self.StartForwarderForHttpServer() | 141 self.ForwardPortsForHttpServer() |
145 return (self._forwarder_device_port, self._http_server.port) | 142 return (self._forwarder_device_port, self._http_server.port) |
146 | 143 |
147 def _ForwardPort(self, port_pairs): | 144 def ForwardPorts(self, port_pairs): |
148 """Creates a forwarder instance if needed and forward a port.""" | 145 """Forwards a port.""" |
149 if not self._forwarder: | 146 Forwarder.Map(port_pairs, self.adb, self.build_type, self.tool) |
frankf
2013/07/10 18:15:38
Just inline ForwardPorts, UnmapPorts, ForwardPorts
Philippe
2013/07/11 09:34:06
These methods are exposed to clients and proved to
| |
150 self._forwarder = Forwarder(self.adb, self.build_type) | |
151 self._forwarder.Run(port_pairs, self.tool) | |
152 | 147 |
148 def UnmapPorts(self, port_pairs): | |
149 """Unmap previously forwarded ports.""" | |
150 for (device_port, _) in port_pairs: | |
151 Forwarder.UnmapDevicePort(device_port, self.adb) | |
152 | |
153 # Deprecated: Use ForwardPorts instead. | |
153 def StartForwarder(self, port_pairs): | 154 def StartForwarder(self, port_pairs): |
154 """Starts TCP traffic forwarding for the given |port_pairs|. | 155 """Starts TCP traffic forwarding for the given |port_pairs|. |
155 | 156 |
156 Args: | 157 Args: |
157 host_port_pairs: A list of (device_port, local_port) tuples to forward. | 158 host_port_pairs: A list of (device_port, local_port) tuples to forward. |
158 """ | 159 """ |
159 self._ForwardPort(port_pairs) | 160 self.ForwardPorts(port_pairs) |
160 | 161 |
161 def StartForwarderForHttpServer(self): | 162 def ForwardPortsForHttpServer(self): |
162 """Starts a forwarder for the HTTP server. | 163 """Starts a forwarder for the HTTP server. |
163 | 164 |
164 The forwarder forwards HTTP requests and responses between host and device. | 165 The forwarder forwards HTTP requests and responses between host and device. |
165 """ | 166 """ |
166 self._ForwardPort([(self._forwarder_device_port, self._http_server.port)]) | 167 self.ForwardPorts([(self._forwarder_device_port, self._http_server.port)]) |
167 | |
168 def RestartHttpServerForwarderIfNecessary(self): | |
169 """Restarts the forwarder if it's not open.""" | |
170 # Checks to see if the http server port is being used. If not forwards the | |
171 # request. | |
172 # TODO(dtrainor): This is not always reliable because sometimes the port | |
173 # will be left open even after the forwarder has been killed. | |
174 if not ports.IsDevicePortUsed(self.adb, | |
175 self._forwarder_device_port): | |
176 self.StartForwarderForHttpServer() | |
177 | 168 |
178 def ShutdownHelperToolsForTestSuite(self): | 169 def ShutdownHelperToolsForTestSuite(self): |
179 """Shuts down the server and the forwarder.""" | 170 """Shuts down the server and the forwarder.""" |
180 # Forwarders should be killed before the actual servers they're forwarding | |
181 # to as they are clients potentially with open connections and to allow for | |
182 # proper hand-shake/shutdown. | |
183 Forwarder.KillDevice(self.adb, self.tool) | |
184 if self._forwarder: | |
185 self._forwarder.Close() | |
186 if self._http_server: | 171 if self._http_server: |
172 self.UnmapPorts([(self._forwarder_device_port, self._http_server.port)]) | |
187 self._http_server.ShutdownHttpServer() | 173 self._http_server.ShutdownHttpServer() |
188 if self._spawning_server: | 174 if self._spawning_server: |
189 self._spawning_server.Stop() | 175 self._spawning_server.Stop() |
190 self.flags.Restore() | 176 self.flags.Restore() |
191 | 177 |
192 def CleanupSpawningServerState(self): | 178 def CleanupSpawningServerState(self): |
193 """Tells the spawning server to clean up any state. | 179 """Tells the spawning server to clean up any state. |
194 | 180 |
195 If the spawning server is reused for multiple tests, this should be called | 181 If the spawning server is reused for multiple tests, this should be called |
196 after each test to prevent tests affecting each other. | 182 after each test to prevent tests affecting each other. |
197 """ | 183 """ |
198 if self._spawning_server: | 184 if self._spawning_server: |
199 self._spawning_server.CleanupState() | 185 self._spawning_server.CleanupState() |
200 | 186 |
201 def LaunchChromeTestServerSpawner(self): | 187 def LaunchChromeTestServerSpawner(self): |
202 """Launches test server spawner.""" | 188 """Launches test server spawner.""" |
203 server_ready = False | 189 server_ready = False |
204 error_msgs = [] | 190 error_msgs = [] |
205 # TODO(pliard): deflake this function. The for loop should be removed as | 191 # TODO(pliard): deflake this function. The for loop should be removed as |
206 # well as IsHttpServerConnectable(). spawning_server.Start() should also | 192 # well as IsHttpServerConnectable(). spawning_server.Start() should also |
207 # block until the server is ready. | 193 # block until the server is ready. |
208 # Try 3 times to launch test spawner server. | 194 # Try 3 times to launch test spawner server. |
209 for i in xrange(0, 3): | 195 for i in xrange(0, 3): |
210 self.test_server_spawner_port = ports.AllocateTestServerPort() | 196 self.test_server_spawner_port = ports.AllocateTestServerPort() |
211 self._ForwardPort( | 197 self.ForwardPorts( |
212 [(self.test_server_spawner_port, self.test_server_spawner_port)]) | 198 [(self.test_server_spawner_port, self.test_server_spawner_port)]) |
213 self._spawning_server = SpawningServer(self.test_server_spawner_port, | 199 self._spawning_server = SpawningServer(self.test_server_spawner_port, |
214 self.adb, | 200 self.adb, |
215 self.tool, | 201 self.tool, |
216 self._forwarder, | |
217 self.build_type) | 202 self.build_type) |
218 self._spawning_server.Start() | 203 self._spawning_server.Start() |
219 server_ready, error_msg = ports.IsHttpServerConnectable( | 204 server_ready, error_msg = ports.IsHttpServerConnectable( |
220 '127.0.0.1', self.test_server_spawner_port, path='/ping', | 205 '127.0.0.1', self.test_server_spawner_port, path='/ping', |
221 expected_read='ready') | 206 expected_read='ready') |
222 if server_ready: | 207 if server_ready: |
223 break | 208 break |
224 else: | 209 else: |
225 error_msgs.append(error_msg) | 210 error_msgs.append(error_msg) |
226 self._spawning_server.Stop() | 211 self._spawning_server.Stop() |
227 # Wait for 2 seconds then restart. | 212 # Wait for 2 seconds then restart. |
228 time.sleep(2) | 213 time.sleep(2) |
229 if not server_ready: | 214 if not server_ready: |
230 logging.error(';'.join(error_msgs)) | 215 logging.error(';'.join(error_msgs)) |
231 raise Exception('Can not start the test spawner server.') | 216 raise Exception('Can not start the test spawner server.') |
232 self._PushTestServerPortInfoToDevice() | 217 self._PushTestServerPortInfoToDevice() |
OLD | NEW |