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

Side by Side Diff: build/android/emulator.py

Issue 8831002: Android buildbot: be more tolerant of 'stuck' devices. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: bulach feedback Created 9 years 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Provides an interface to start and stop Android emulator. 6 """Provides an interface to start and stop Android emulator.
7 7
8 Assumes system environment ANDROID_NDK_ROOT has been set. 8 Assumes system environment ANDROID_NDK_ROOT has been set.
9 9
10 Emulator: The class provides the methods to launch/shutdown the emulator with 10 Emulator: The class provides the methods to launch/shutdown the emulator with
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 74
75 Attributes: 75 Attributes:
76 emulator: Path of Android's emulator tool. 76 emulator: Path of Android's emulator tool.
77 popen: Popen object of the running emulator process. 77 popen: Popen object of the running emulator process.
78 device: Device name of this emulator. 78 device: Device name of this emulator.
79 """ 79 """
80 80
81 # Signals we listen for to kill the emulator on 81 # Signals we listen for to kill the emulator on
82 _SIGNALS = (signal.SIGINT, signal.SIGHUP) 82 _SIGNALS = (signal.SIGINT, signal.SIGHUP)
83 83
84 # Time to wait for an emulator launch, in seconds. 84 # Time to wait for an emulator launch, in seconds. This includes
85 _EMULATOR_LAUNCH_TIMEOUT = 120 85 # the time to launch the emulator and a wait-for-device command.
86 _LAUNCH_TIMEOUT = 120
86 87
87 # Timeout interval of wait-for-device command before bouncing to a a 88 # Timeout interval of wait-for-device command before bouncing to a a
88 # process life check. 89 # process life check.
89 _EMULATOR_WFD_TIMEOUT = 5 90 _WAITFORDEVICE_TIMEOUT = 5
91
92 # Time to wait for a "wait for boot complete" (property set on device).
93 _WAITFORBOOT_TIMEOUT = 120
90 94
91 def __init__(self): 95 def __init__(self):
92 try: 96 try:
93 android_sdk_root = os.environ['ANDROID_SDK_ROOT'] 97 android_sdk_root = os.environ['ANDROID_SDK_ROOT']
94 except KeyError: 98 except KeyError:
95 logging.critical('The ANDROID_SDK_ROOT must be set to run the test on ' 99 logging.critical('The ANDROID_SDK_ROOT must be set to run the test on '
96 'emulator.') 100 'emulator.')
97 raise 101 raise
98 self.emulator = os.path.join(android_sdk_root, 'tools', 'emulator') 102 self.emulator = os.path.join(android_sdk_root, 'tools', 'emulator')
99 self.popen = None 103 self.popen = None
(...skipping 30 matching lines...) Expand all
130 134
131 Loop on a wait-for-device with a very small timeout. On each 135 Loop on a wait-for-device with a very small timeout. On each
132 timeout, check the emulator process is still alive. 136 timeout, check the emulator process is still alive.
133 After confirming a wait-for-device can be successful, make sure 137 After confirming a wait-for-device can be successful, make sure
134 it returns the right answer. 138 it returns the right answer.
135 """ 139 """
136 a = android_commands.AndroidCommands(self.device, False) 140 a = android_commands.AndroidCommands(self.device, False)
137 seconds_waited = 0 141 seconds_waited = 0
138 number_of_waits = 2 # Make sure we can wfd twice 142 number_of_waits = 2 # Make sure we can wfd twice
139 adb_cmd = "adb -s %s %s" % (self.device, 'wait-for-device') 143 adb_cmd = "adb -s %s %s" % (self.device, 'wait-for-device')
140 while seconds_waited < self._EMULATOR_LAUNCH_TIMEOUT: 144 while seconds_waited < self._LAUNCH_TIMEOUT:
141 try: 145 try:
142 run_command.RunCommand(adb_cmd, timeout_time=self._EMULATOR_WFD_TIMEOUT, 146 run_command.RunCommand(adb_cmd,
147 timeout_time=self._WAITFORDEVICE_TIMEOUT,
143 retry_count=1) 148 retry_count=1)
144 number_of_waits -= 1 149 number_of_waits -= 1
145 if not number_of_waits: 150 if not number_of_waits:
146 break 151 break
147 except errors.WaitForResponseTimedOutError as e: 152 except errors.WaitForResponseTimedOutError as e:
148 seconds_waited += self._EMULATOR_WFD_TIMEOUT 153 seconds_waited += self._WAITFORDEVICE_TIMEOUT
149 adb_cmd = "adb -s %s %s" % (self.device, 'kill-server') 154 adb_cmd = "adb -s %s %s" % (self.device, 'kill-server')
150 run_command.RunCommand(adb_cmd) 155 run_command.RunCommand(adb_cmd)
151 self.popen.poll() 156 self.popen.poll()
152 if self.popen.returncode != None: 157 if self.popen.returncode != None:
153 raise EmulatorLaunchException('EMULATOR DIED') 158 raise EmulatorLaunchException('EMULATOR DIED')
154 if seconds_waited >= self._EMULATOR_LAUNCH_TIMEOUT: 159 if seconds_waited >= self._LAUNCH_TIMEOUT:
155 raise EmulatorLaunchException('TIMEOUT with wait-for-device') 160 raise EmulatorLaunchException('TIMEOUT with wait-for-device')
156 logging.info('Seconds waited on wait-for-device: %d', seconds_waited) 161 logging.info('Seconds waited on wait-for-device: %d', seconds_waited)
157 # Now that we checked for obvious problems, wait for a boot complete. 162 # Now that we checked for obvious problems, wait for a boot complete.
158 # Waiting for the package manager has been problematic. 163 # Waiting for the package manager has been problematic.
159 a.Adb().WaitForBootComplete() 164 a.Adb().SetTargetSerial(self.device)
165 a.Adb().WaitForBootComplete(self._WAITFORBOOT_TIMEOUT)
160 166
161 def Shutdown(self): 167 def Shutdown(self):
162 """Shuts down the process started by launch.""" 168 """Shuts down the process started by launch."""
163 if self.popen: 169 if self.popen:
164 self.popen.poll() 170 self.popen.poll()
165 if self.popen.returncode == None: 171 if self.popen.returncode == None:
166 self.popen.kill() 172 self.popen.kill()
167 self.popen = None 173 self.popen = None
168 174
169 def _ShutdownOnSignal(self, signum, frame): 175 def _ShutdownOnSignal(self, signum, frame):
170 logging.critical('emulator _ShutdownOnSignal') 176 logging.critical('emulator _ShutdownOnSignal')
171 for sig in self._SIGNALS: 177 for sig in self._SIGNALS:
172 signal.signal(sig, signal.SIG_DFL) 178 signal.signal(sig, signal.SIG_DFL)
173 self.Shutdown() 179 self.Shutdown()
174 raise KeyboardInterrupt # print a stack 180 raise KeyboardInterrupt # print a stack
175 181
176 def _InstallKillHandler(self): 182 def _InstallKillHandler(self):
177 """Install a handler to kill the emulator when we exit unexpectedly.""" 183 """Install a handler to kill the emulator when we exit unexpectedly."""
178 for sig in self._SIGNALS: 184 for sig in self._SIGNALS:
179 signal.signal(sig, self._ShutdownOnSignal) 185 signal.signal(sig, self._ShutdownOnSignal)
180 186
181 def main(argv): 187 def main(argv):
182 Emulator().launch() 188 Emulator().launch()
183 189
184 190
185 if __name__ == '__main__': 191 if __name__ == '__main__':
186 main(sys.argv) 192 main(sys.argv)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698