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 import contextlib | 5 import contextlib |
6 import httplib | 6 import httplib |
7 import logging | 7 import logging |
8 import os | 8 import os |
9 import tempfile | 9 import tempfile |
10 import time | 10 import time |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 if not self.HasTests(): | 75 if not self.HasTests(): |
76 return True | 76 return True |
77 self.SetUp() | 77 self.SetUp() |
78 try: | 78 try: |
79 return self.RunTests() | 79 return self.RunTests() |
80 finally: | 80 finally: |
81 self.TearDown() | 81 self.TearDown() |
82 | 82 |
83 def SetUp(self): | 83 def SetUp(self): |
84 """Called before tests run.""" | 84 """Called before tests run.""" |
85 pass | 85 Forwarder.KillDevice(self.adb) |
86 | 86 |
87 def HasTests(self): | 87 def HasTests(self): |
88 """Whether the test suite has tests to run.""" | 88 """Whether the test suite has tests to run.""" |
89 return True | 89 return True |
90 | 90 |
91 def RunTests(self): | 91 def RunTests(self): |
92 """Runs the tests. Need to be overridden.""" | 92 """Runs the tests. Need to be overridden.""" |
93 raise NotImplementedError | 93 raise NotImplementedError |
94 | 94 |
95 def TearDown(self): | 95 def TearDown(self): |
(...skipping 26 matching lines...) Expand all Loading... |
122 self._http_server = lighttpd_server.LighttpdServer( | 122 self._http_server = lighttpd_server.LighttpdServer( |
123 document_root, port=port, extra_config_contents=extra_config_contents) | 123 document_root, port=port, extra_config_contents=extra_config_contents) |
124 if self._http_server.StartupHttpServer(): | 124 if self._http_server.StartupHttpServer(): |
125 logging.info('http server started: http://localhost:%s', | 125 logging.info('http server started: http://localhost:%s', |
126 self._http_server.port) | 126 self._http_server.port) |
127 else: | 127 else: |
128 logging.critical('Failed to start http server') | 128 logging.critical('Failed to start http server') |
129 self.StartForwarderForHttpServer() | 129 self.StartForwarderForHttpServer() |
130 return (self._forwarder_device_port, self._http_server.port) | 130 return (self._forwarder_device_port, self._http_server.port) |
131 | 131 |
| 132 def _CreateAndRunForwarder( |
| 133 self, adb, port_pairs, tool, host_name, build_type): |
| 134 """Creates and run a forwarder.""" |
| 135 forwarder = Forwarder(adb, build_type) |
| 136 forwarder.Run(port_pairs, tool, host_name) |
| 137 return forwarder |
| 138 |
132 def StartForwarder(self, port_pairs): | 139 def StartForwarder(self, port_pairs): |
133 """Starts TCP traffic forwarding for the given |port_pairs|. | 140 """Starts TCP traffic forwarding for the given |port_pairs|. |
134 | 141 |
135 Args: | 142 Args: |
136 host_port_pairs: A list of (device_port, local_port) tuples to forward. | 143 host_port_pairs: A list of (device_port, local_port) tuples to forward. |
137 """ | 144 """ |
138 if self._forwarder: | 145 if self._forwarder: |
139 self._forwarder.Close() | 146 self._forwarder.Close() |
140 self._forwarder = Forwarder( | 147 self._forwarder = self._CreateAndRunForwarder( |
141 self.adb, port_pairs, self.tool, '127.0.0.1', self.build_type) | 148 self.adb, port_pairs, self.tool, '127.0.0.1', self.build_type) |
142 | 149 |
143 def StartForwarderForHttpServer(self): | 150 def StartForwarderForHttpServer(self): |
144 """Starts a forwarder for the HTTP server. | 151 """Starts a forwarder for the HTTP server. |
145 | 152 |
146 The forwarder forwards HTTP requests and responses between host and device. | 153 The forwarder forwards HTTP requests and responses between host and device. |
147 """ | 154 """ |
148 self.StartForwarder([(self._forwarder_device_port, self._http_server.port)]) | 155 self.StartForwarder([(self._forwarder_device_port, self._http_server.port)]) |
149 | 156 |
150 def RestartHttpServerForwarderIfNecessary(self): | 157 def RestartHttpServerForwarderIfNecessary(self): |
151 """Restarts the forwarder if it's not open.""" | 158 """Restarts the forwarder if it's not open.""" |
152 # Checks to see if the http server port is being used. If not forwards the | 159 # Checks to see if the http server port is being used. If not forwards the |
153 # request. | 160 # request. |
154 # TODO(dtrainor): This is not always reliable because sometimes the port | 161 # TODO(dtrainor): This is not always reliable because sometimes the port |
155 # will be left open even after the forwarder has been killed. | 162 # will be left open even after the forwarder has been killed. |
156 if not ports.IsDevicePortUsed(self.adb, | 163 if not ports.IsDevicePortUsed(self.adb, |
157 self._forwarder_device_port): | 164 self._forwarder_device_port): |
158 self.StartForwarderForHttpServer() | 165 self.StartForwarderForHttpServer() |
159 | 166 |
160 def ShutdownHelperToolsForTestSuite(self): | 167 def ShutdownHelperToolsForTestSuite(self): |
161 """Shuts down the server and the forwarder.""" | 168 """Shuts down the server and the forwarder.""" |
162 # Forwarders should be killed before the actual servers they're forwarding | 169 # Forwarders should be killed before the actual servers they're forwarding |
163 # to as they are clients potentially with open connections and to allow for | 170 # to as they are clients potentially with open connections and to allow for |
164 # proper hand-shake/shutdown. | 171 # proper hand-shake/shutdown. |
165 if self._forwarder or self._spawner_forwarder: | 172 Forwarder.KillDevice(self.adb) |
166 # Kill all forwarders on the device and then kill the process on the host | |
167 # (if it exists) | |
168 self.adb.KillAll('device_forwarder') | |
169 if self._forwarder: | |
170 self._forwarder.Close() | |
171 if self._spawner_forwarder: | |
172 self._spawner_forwarder.Close() | |
173 if self._http_server: | 173 if self._http_server: |
174 self._http_server.ShutdownHttpServer() | 174 self._http_server.ShutdownHttpServer() |
175 if self._spawning_server: | 175 if self._spawning_server: |
176 self._spawning_server.Stop() | 176 self._spawning_server.Stop() |
177 self.flags.Restore() | 177 self.flags.Restore() |
178 | 178 |
179 def LaunchChromeTestServerSpawner(self): | 179 def LaunchChromeTestServerSpawner(self): |
180 """Launches test server spawner.""" | 180 """Launches test server spawner.""" |
181 server_ready = False | 181 server_ready = False |
182 error_msgs = [] | 182 error_msgs = [] |
(...skipping 14 matching lines...) Expand all Loading... |
197 break | 197 break |
198 else: | 198 else: |
199 error_msgs.append(error_msg) | 199 error_msgs.append(error_msg) |
200 self._spawning_server.Stop() | 200 self._spawning_server.Stop() |
201 # Wait for 2 seconds then restart. | 201 # Wait for 2 seconds then restart. |
202 time.sleep(2) | 202 time.sleep(2) |
203 if not server_ready: | 203 if not server_ready: |
204 logging.error(';'.join(error_msgs)) | 204 logging.error(';'.join(error_msgs)) |
205 raise Exception('Can not start the test spawner server.') | 205 raise Exception('Can not start the test spawner server.') |
206 self._PushTestServerPortInfoToDevice() | 206 self._PushTestServerPortInfoToDevice() |
207 self._spawner_forwarder = Forwarder( | 207 self._spawner_forwarder = self._CreateAndRunForwarder( |
208 self.adb, | 208 self.adb, |
209 [(self.test_server_spawner_port, self.test_server_spawner_port)], | 209 [(self.test_server_spawner_port, self.test_server_spawner_port)], |
210 self.tool, '127.0.0.1', self.build_type) | 210 self.tool, '127.0.0.1', self.build_type) |
OLD | NEW |