Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: build/android/pylib/base/base_test_runner.py

Issue 18086004: Move Python setup/tear down logic into Forwarder itself. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Implement Marcus' idea Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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)
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):
frankf 2013/07/15 22:23:22 So none of these methods should be public right? S
Philippe 2013/07/16 12:31:21 It seems that we are not completely following the
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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698