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

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

Issue 19844006: Revert "Reland r212020: Move Python setup/tear down logic into Forwarder ..." (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase 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
« no previous file with comments | « build/android/bb_run_sharded_steps.py ('k') | build/android/pylib/base/test_dispatcher.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 26 matching lines...) Expand all
37 device: Tests will run on the device of this ID. 37 device: Tests will run on the device of this ID.
38 tool: Name of the Valgrind tool. 38 tool: Name of the Valgrind tool.
39 build_type: 'Release' or 'Debug'. 39 build_type: 'Release' or 'Debug'.
40 push_deps: If True, push all dependencies to the device. 40 push_deps: If True, push all dependencies to the device.
41 cleanup_test_files: Whether or not to cleanup test files on device. 41 cleanup_test_files: Whether or not to cleanup test files on device.
42 """ 42 """
43 self.device = device 43 self.device = device
44 self.adb = android_commands.AndroidCommands(device=device) 44 self.adb = android_commands.AndroidCommands(device=device)
45 self.tool = CreateTool(tool, self.adb) 45 self.tool = CreateTool(tool, self.adb)
46 self._http_server = None 46 self._http_server = None
47 self._forwarder = None
47 self._forwarder_device_port = 8000 48 self._forwarder_device_port = 8000
48 self.forwarder_base_url = ('http://localhost:%d' % 49 self.forwarder_base_url = ('http://localhost:%d' %
49 self._forwarder_device_port) 50 self._forwarder_device_port)
50 self.flags = FlagChanger(self.adb) 51 self.flags = FlagChanger(self.adb)
51 self.flags.AddFlags(['--disable-fre']) 52 self.flags.AddFlags(['--disable-fre'])
52 self._spawning_server = None 53 self._spawning_server = None
54 self._spawner_forwarder = None
53 # We will allocate port for test server spawner when calling method 55 # We will allocate port for test server spawner when calling method
54 # LaunchChromeTestServerSpawner and allocate port for test server when 56 # LaunchChromeTestServerSpawner and allocate port for test server when
55 # starting it in TestServerThread. 57 # starting it in TestServerThread.
56 self.test_server_spawner_port = 0 58 self.test_server_spawner_port = 0
57 self.test_server_port = 0 59 self.test_server_port = 0
58 self.build_type = build_type 60 self.build_type = build_type
59 self._push_deps = push_deps 61 self._push_deps = push_deps
60 self._cleanup_test_files = cleanup_test_files 62 self._cleanup_test_files = cleanup_test_files
61 63
62 def _PushTestServerPortInfoToDevice(self): 64 def _PushTestServerPortInfoToDevice(self):
(...skipping 18 matching lines...) Expand all
81 def InstallTestPackage(self): 83 def InstallTestPackage(self):
82 """Installs the test package once before all tests are run.""" 84 """Installs the test package once before all tests are run."""
83 pass 85 pass
84 86
85 def PushDataDeps(self): 87 def PushDataDeps(self):
86 """Push all data deps to device once before all tests are run.""" 88 """Push all data deps to device once before all tests are run."""
87 pass 89 pass
88 90
89 def SetUp(self): 91 def SetUp(self):
90 """Run once before all tests are run.""" 92 """Run once before all tests are run."""
93 Forwarder.KillDevice(self.adb, self.tool)
91 self.InstallTestPackage() 94 self.InstallTestPackage()
92 push_size_before = self.adb.GetPushSizeInfo() 95 push_size_before = self.adb.GetPushSizeInfo()
93 if self._push_deps: 96 if self._push_deps:
94 logging.warning('Pushing data files to device.') 97 logging.warning('Pushing data files to device.')
95 self.PushDataDeps() 98 self.PushDataDeps()
96 push_size_after = self.adb.GetPushSizeInfo() 99 push_size_after = self.adb.GetPushSizeInfo()
97 logging.warning( 100 logging.warning(
98 'Total data: %0.3fMB' % 101 'Total data: %0.3fMB' %
99 ((push_size_after[0] - push_size_before[0]) / float(2 ** 20))) 102 ((push_size_after[0] - push_size_before[0]) / float(2 ** 20)))
100 logging.warning( 103 logging.warning(
(...skipping 17 matching lines...) Expand all
118 port: port on which we want to the http server bind. 121 port: port on which we want to the http server bind.
119 extra_config_contents: Extra config contents for the HTTP server. 122 extra_config_contents: Extra config contents for the HTTP server.
120 """ 123 """
121 self._http_server = lighttpd_server.LighttpdServer( 124 self._http_server = lighttpd_server.LighttpdServer(
122 document_root, port=port, extra_config_contents=extra_config_contents) 125 document_root, port=port, extra_config_contents=extra_config_contents)
123 if self._http_server.StartupHttpServer(): 126 if self._http_server.StartupHttpServer():
124 logging.info('http server started: http://localhost:%s', 127 logging.info('http server started: http://localhost:%s',
125 self._http_server.port) 128 self._http_server.port)
126 else: 129 else:
127 logging.critical('Failed to start http server') 130 logging.critical('Failed to start http server')
128 self._ForwardPortsForHttpServer() 131 self.StartForwarderForHttpServer()
129 return (self._forwarder_device_port, self._http_server.port) 132 return (self._forwarder_device_port, self._http_server.port)
130 133
131 def _ForwardPorts(self, port_pairs): 134 def _ForwardPort(self, port_pairs):
132 """Forwards a port.""" 135 """Creates a forwarder instance if needed and forward a port."""
133 Forwarder.Map(port_pairs, self.adb, self.build_type, self.tool) 136 if not self._forwarder:
137 self._forwarder = Forwarder(self.adb, self.build_type)
138 self._forwarder.Run(port_pairs, self.tool)
134 139
135 def _UnmapPorts(self, port_pairs):
136 """Unmap previously forwarded ports."""
137 for (device_port, _) in port_pairs:
138 Forwarder.UnmapDevicePort(device_port, self.adb)
139
140 # Deprecated: Use ForwardPorts instead.
141 def StartForwarder(self, port_pairs): 140 def StartForwarder(self, port_pairs):
142 """Starts TCP traffic forwarding for the given |port_pairs|. 141 """Starts TCP traffic forwarding for the given |port_pairs|.
143 142
144 Args: 143 Args:
145 host_port_pairs: A list of (device_port, local_port) tuples to forward. 144 host_port_pairs: A list of (device_port, local_port) tuples to forward.
146 """ 145 """
147 self._ForwardPorts(port_pairs) 146 self._ForwardPort(port_pairs)
148 147
149 def _ForwardPortsForHttpServer(self): 148 def StartForwarderForHttpServer(self):
150 """Starts a forwarder for the HTTP server. 149 """Starts a forwarder for the HTTP server.
151 150
152 The forwarder forwards HTTP requests and responses between host and device. 151 The forwarder forwards HTTP requests and responses between host and device.
153 """ 152 """
154 self._ForwardPorts([(self._forwarder_device_port, self._http_server.port)]) 153 self._ForwardPort([(self._forwarder_device_port, self._http_server.port)])
155 154
156 def _RestartHttpServerForwarderIfNecessary(self): 155 def RestartHttpServerForwarderIfNecessary(self):
157 """Restarts the forwarder if it's not open.""" 156 """Restarts the forwarder if it's not open."""
158 # Checks to see if the http server port is being used. If not forwards the 157 # Checks to see if the http server port is being used. If not forwards the
159 # request. 158 # request.
160 # TODO(dtrainor): This is not always reliable because sometimes the port 159 # TODO(dtrainor): This is not always reliable because sometimes the port
161 # will be left open even after the forwarder has been killed. 160 # will be left open even after the forwarder has been killed.
162 if not ports.IsDevicePortUsed(self.adb, self._forwarder_device_port): 161 if not ports.IsDevicePortUsed(self.adb,
163 self._ForwardPortsForHttpServer() 162 self._forwarder_device_port):
163 self.StartForwarderForHttpServer()
164 164
165 def ShutdownHelperToolsForTestSuite(self): 165 def ShutdownHelperToolsForTestSuite(self):
166 """Shuts down the server and the forwarder.""" 166 """Shuts down the server and the forwarder."""
167 # Forwarders should be killed before the actual servers they're forwarding
168 # to as they are clients potentially with open connections and to allow for
169 # proper hand-shake/shutdown.
170 Forwarder.KillDevice(self.adb, self.tool)
171 if self._forwarder:
172 self._forwarder.Close()
167 if self._http_server: 173 if self._http_server:
168 self._UnmapPorts([(self._forwarder_device_port, self._http_server.port)])
169 self._http_server.ShutdownHttpServer() 174 self._http_server.ShutdownHttpServer()
170 if self._spawning_server: 175 if self._spawning_server:
171 self._spawning_server.Stop() 176 self._spawning_server.Stop()
172 self.flags.Restore() 177 self.flags.Restore()
173 178
174 def CleanupSpawningServerState(self): 179 def CleanupSpawningServerState(self):
175 """Tells the spawning server to clean up any state. 180 """Tells the spawning server to clean up any state.
176 181
177 If the spawning server is reused for multiple tests, this should be called 182 If the spawning server is reused for multiple tests, this should be called
178 after each test to prevent tests affecting each other. 183 after each test to prevent tests affecting each other.
179 """ 184 """
180 if self._spawning_server: 185 if self._spawning_server:
181 self._spawning_server.CleanupState() 186 self._spawning_server.CleanupState()
182 187
183 def LaunchChromeTestServerSpawner(self): 188 def LaunchChromeTestServerSpawner(self):
184 """Launches test server spawner.""" 189 """Launches test server spawner."""
185 server_ready = False 190 server_ready = False
186 error_msgs = [] 191 error_msgs = []
187 # TODO(pliard): deflake this function. The for loop should be removed as 192 # TODO(pliard): deflake this function. The for loop should be removed as
188 # well as IsHttpServerConnectable(). spawning_server.Start() should also 193 # well as IsHttpServerConnectable(). spawning_server.Start() should also
189 # block until the server is ready. 194 # block until the server is ready.
190 # Try 3 times to launch test spawner server. 195 # Try 3 times to launch test spawner server.
191 for i in xrange(0, 3): 196 for i in xrange(0, 3):
192 self.test_server_spawner_port = ports.AllocateTestServerPort() 197 self.test_server_spawner_port = ports.AllocateTestServerPort()
193 self._ForwardPorts( 198 self._ForwardPort(
194 [(self.test_server_spawner_port, self.test_server_spawner_port)]) 199 [(self.test_server_spawner_port, self.test_server_spawner_port)])
195 self._spawning_server = SpawningServer(self.test_server_spawner_port, 200 self._spawning_server = SpawningServer(self.test_server_spawner_port,
196 self.adb, 201 self.adb,
197 self.tool, 202 self.tool,
203 self._forwarder,
198 self.build_type) 204 self.build_type)
199 self._spawning_server.Start() 205 self._spawning_server.Start()
200 server_ready, error_msg = ports.IsHttpServerConnectable( 206 server_ready, error_msg = ports.IsHttpServerConnectable(
201 '127.0.0.1', self.test_server_spawner_port, path='/ping', 207 '127.0.0.1', self.test_server_spawner_port, path='/ping',
202 expected_read='ready') 208 expected_read='ready')
203 if server_ready: 209 if server_ready:
204 break 210 break
205 else: 211 else:
206 error_msgs.append(error_msg) 212 error_msgs.append(error_msg)
207 self._spawning_server.Stop() 213 self._spawning_server.Stop()
208 # Wait for 2 seconds then restart. 214 # Wait for 2 seconds then restart.
209 time.sleep(2) 215 time.sleep(2)
210 if not server_ready: 216 if not server_ready:
211 logging.error(';'.join(error_msgs)) 217 logging.error(';'.join(error_msgs))
212 raise Exception('Can not start the test spawner server.') 218 raise Exception('Can not start the test spawner server.')
213 self._PushTestServerPortInfoToDevice() 219 self._PushTestServerPortInfoToDevice()
OLDNEW
« no previous file with comments | « build/android/bb_run_sharded_steps.py ('k') | build/android/pylib/base/test_dispatcher.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698