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 """Provides an interface to start and stop Android emulator. | 5 """Provides an interface to start and stop Android emulator. |
6 | 6 |
7 Emulator: The class provides the methods to launch/shutdown the emulator with | 7 Emulator: The class provides the methods to launch/shutdown the emulator with |
8 the android virtual device named 'avd_armeabi' . | 8 the android virtual device named 'avd_armeabi' . |
9 """ | 9 """ |
10 | 10 |
11 import logging | 11 import logging |
12 import os | 12 import os |
13 import signal | 13 import signal |
14 import subprocess | 14 import subprocess |
15 import time | 15 import time |
16 | 16 |
17 # TODO(craigdh): Move these pylib dependencies to pylib/utils/. | 17 # TODO(craigdh): Move these pylib dependencies to pylib/utils/. |
18 from pylib import android_commands | 18 from pylib import android_commands |
19 from pylib import cmd_helper | 19 from pylib import cmd_helper |
20 from pylib import constants | 20 from pylib import constants |
21 from pylib import pexpect | 21 from pylib import pexpect |
| 22 from pylib.device import device_errors |
22 from pylib.device import device_utils | 23 from pylib.device import device_utils |
23 from pylib.utils import time_profile | 24 from pylib.utils import time_profile |
24 | 25 |
25 import errors | 26 import errors |
26 import run_command | 27 import run_command |
27 | 28 |
28 # SD card size | 29 # SD card size |
29 SDCARD_SIZE = '512M' | 30 SDCARD_SIZE = '512M' |
30 | 31 |
31 # Template used to generate config.ini files for the emulator | 32 # Template used to generate config.ini files for the emulator |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 def ConfirmLaunch(self, wait_for_boot=False): | 388 def ConfirmLaunch(self, wait_for_boot=False): |
388 """Confirm the emulator launched properly. | 389 """Confirm the emulator launched properly. |
389 | 390 |
390 Loop on a wait-for-device with a very small timeout. On each | 391 Loop on a wait-for-device with a very small timeout. On each |
391 timeout, check the emulator process is still alive. | 392 timeout, check the emulator process is still alive. |
392 After confirming a wait-for-device can be successful, make sure | 393 After confirming a wait-for-device can be successful, make sure |
393 it returns the right answer. | 394 it returns the right answer. |
394 """ | 395 """ |
395 seconds_waited = 0 | 396 seconds_waited = 0 |
396 number_of_waits = 2 # Make sure we can wfd twice | 397 number_of_waits = 2 # Make sure we can wfd twice |
397 # TODO(jbudorick) Un-handroll this in the implementation switch. | 398 |
398 adb_cmd = "adb -s %s %s" % (self.device_serial, 'wait-for-device') | 399 device = device_utils.DeviceUtils(self.device_serial) |
399 while seconds_waited < self._LAUNCH_TIMEOUT: | 400 while seconds_waited < self._LAUNCH_TIMEOUT: |
400 try: | 401 try: |
401 run_command.RunCommand(adb_cmd, | 402 device.adb.WaitForDevice( |
402 timeout_time=self._WAITFORDEVICE_TIMEOUT, | 403 timeout=self._WAITFORDEVICE_TIMEOUT, retries=1) |
403 retry_count=1) | |
404 number_of_waits -= 1 | 404 number_of_waits -= 1 |
405 if not number_of_waits: | 405 if not number_of_waits: |
406 break | 406 break |
407 except errors.WaitForResponseTimedOutError: | 407 except device_errors.CommandTimeoutError: |
408 seconds_waited += self._WAITFORDEVICE_TIMEOUT | 408 seconds_waited += self._WAITFORDEVICE_TIMEOUT |
409 adb_cmd = "adb -s %s %s" % (self.device_serial, 'kill-server') | 409 device.adb.KillServer() |
410 run_command.RunCommand(adb_cmd) | |
411 self.popen.poll() | 410 self.popen.poll() |
412 if self.popen.returncode != None: | 411 if self.popen.returncode != None: |
413 raise EmulatorLaunchException('EMULATOR DIED') | 412 raise EmulatorLaunchException('EMULATOR DIED') |
| 413 |
414 if seconds_waited >= self._LAUNCH_TIMEOUT: | 414 if seconds_waited >= self._LAUNCH_TIMEOUT: |
415 raise EmulatorLaunchException('TIMEOUT with wait-for-device') | 415 raise EmulatorLaunchException('TIMEOUT with wait-for-device') |
| 416 |
416 logging.info('Seconds waited on wait-for-device: %d', seconds_waited) | 417 logging.info('Seconds waited on wait-for-device: %d', seconds_waited) |
417 if wait_for_boot: | 418 if wait_for_boot: |
418 # Now that we checked for obvious problems, wait for a boot complete. | 419 # Now that we checked for obvious problems, wait for a boot complete. |
419 # Waiting for the package manager is sometimes problematic. | 420 # Waiting for the package manager is sometimes problematic. |
420 # TODO(jbudorick) Convert this once waiting for the package manager and | 421 device.WaitUntilFullyBooted(timeout=self._WAITFORBOOT_TIMEOUT) |
421 # the external storage is no longer problematic. | |
422 d = device_utils.DeviceUtils(self.device_serial) | |
423 d.old_interface.WaitForSystemBootCompleted(self._WAITFORBOOT_TIMEOUT) | |
424 | 422 |
425 def Shutdown(self): | 423 def Shutdown(self): |
426 """Shuts down the process started by launch.""" | 424 """Shuts down the process started by launch.""" |
427 self._DeleteAVD() | 425 self._DeleteAVD() |
428 if self.popen: | 426 if self.popen: |
429 self.popen.poll() | 427 self.popen.poll() |
430 if self.popen.returncode == None: | 428 if self.popen.returncode == None: |
431 self.popen.kill() | 429 self.popen.kill() |
432 self.popen = None | 430 self.popen = None |
433 | 431 |
434 def _ShutdownOnSignal(self, _signum, _frame): | 432 def _ShutdownOnSignal(self, _signum, _frame): |
435 logging.critical('emulator _ShutdownOnSignal') | 433 logging.critical('emulator _ShutdownOnSignal') |
436 for sig in self._SIGNALS: | 434 for sig in self._SIGNALS: |
437 signal.signal(sig, signal.SIG_DFL) | 435 signal.signal(sig, signal.SIG_DFL) |
438 self.Shutdown() | 436 self.Shutdown() |
439 raise KeyboardInterrupt # print a stack | 437 raise KeyboardInterrupt # print a stack |
440 | 438 |
441 def _InstallKillHandler(self): | 439 def _InstallKillHandler(self): |
442 """Install a handler to kill the emulator when we exit unexpectedly.""" | 440 """Install a handler to kill the emulator when we exit unexpectedly.""" |
443 for sig in self._SIGNALS: | 441 for sig in self._SIGNALS: |
444 signal.signal(sig, self._ShutdownOnSignal) | 442 signal.signal(sig, self._ShutdownOnSignal) |
OLD | NEW |