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

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

Issue 19576005: Revert 212020 "Move Python setup/tear down logic into Forwarder ..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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 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)])
154
155 def RestartHttpServerForwarderIfNecessary(self):
156 """Restarts the forwarder if it's not open."""
157 # Checks to see if the http server port is being used. If not forwards the
158 # request.
159 # TODO(dtrainor): This is not always reliable because sometimes the port
160 # will be left open even after the forwarder has been killed.
161 if not ports.IsDevicePortUsed(self.adb,
162 self._forwarder_device_port):
163 self.StartForwarderForHttpServer()
155 164
156 def ShutdownHelperToolsForTestSuite(self): 165 def ShutdownHelperToolsForTestSuite(self):
157 """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()
158 if self._http_server: 173 if self._http_server:
159 self._UnmapPorts([(self._forwarder_device_port, self._http_server.port)])
160 self._http_server.ShutdownHttpServer() 174 self._http_server.ShutdownHttpServer()
161 if self._spawning_server: 175 if self._spawning_server:
162 self._spawning_server.Stop() 176 self._spawning_server.Stop()
163 self.flags.Restore() 177 self.flags.Restore()
164 178
165 def CleanupSpawningServerState(self): 179 def CleanupSpawningServerState(self):
166 """Tells the spawning server to clean up any state. 180 """Tells the spawning server to clean up any state.
167 181
168 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
169 after each test to prevent tests affecting each other. 183 after each test to prevent tests affecting each other.
170 """ 184 """
171 if self._spawning_server: 185 if self._spawning_server:
172 self._spawning_server.CleanupState() 186 self._spawning_server.CleanupState()
173 187
174 def LaunchChromeTestServerSpawner(self): 188 def LaunchChromeTestServerSpawner(self):
175 """Launches test server spawner.""" 189 """Launches test server spawner."""
176 server_ready = False 190 server_ready = False
177 error_msgs = [] 191 error_msgs = []
178 # 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
179 # well as IsHttpServerConnectable(). spawning_server.Start() should also 193 # well as IsHttpServerConnectable(). spawning_server.Start() should also
180 # block until the server is ready. 194 # block until the server is ready.
181 # Try 3 times to launch test spawner server. 195 # Try 3 times to launch test spawner server.
182 for i in xrange(0, 3): 196 for i in xrange(0, 3):
183 self.test_server_spawner_port = ports.AllocateTestServerPort() 197 self.test_server_spawner_port = ports.AllocateTestServerPort()
184 self._ForwardPorts( 198 self._ForwardPort(
185 [(self.test_server_spawner_port, self.test_server_spawner_port)]) 199 [(self.test_server_spawner_port, self.test_server_spawner_port)])
186 self._spawning_server = SpawningServer(self.test_server_spawner_port, 200 self._spawning_server = SpawningServer(self.test_server_spawner_port,
187 self.adb, 201 self.adb,
188 self.tool, 202 self.tool,
203 self._forwarder,
189 self.build_type) 204 self.build_type)
190 self._spawning_server.Start() 205 self._spawning_server.Start()
191 server_ready, error_msg = ports.IsHttpServerConnectable( 206 server_ready, error_msg = ports.IsHttpServerConnectable(
192 '127.0.0.1', self.test_server_spawner_port, path='/ping', 207 '127.0.0.1', self.test_server_spawner_port, path='/ping',
193 expected_read='ready') 208 expected_read='ready')
194 if server_ready: 209 if server_ready:
195 break 210 break
196 else: 211 else:
197 error_msgs.append(error_msg) 212 error_msgs.append(error_msg)
198 self._spawning_server.Stop() 213 self._spawning_server.Stop()
199 # Wait for 2 seconds then restart. 214 # Wait for 2 seconds then restart.
200 time.sleep(2) 215 time.sleep(2)
201 if not server_ready: 216 if not server_ready:
202 logging.error(';'.join(error_msgs)) 217 logging.error(';'.join(error_msgs))
203 raise Exception('Can not start the test spawner server.') 218 raise Exception('Can not start the test spawner server.')
204 self._PushTestServerPortInfoToDevice() 219 self._PushTestServerPortInfoToDevice()
OLDNEW
« no previous file with comments | « trunk/src/build/android/bb_run_sharded_steps.py ('k') | trunk/src/build/android/pylib/base/shard.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698