Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # | 2 # |
| 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """Provides an interface to start and stop Android emulator. | 7 """Provides an interface to start and stop Android emulator. |
| 8 | 8 |
| 9 Assumes system environment ANDROID_NDK_ROOT has been set. | 9 Assumes system environment ANDROID_NDK_ROOT has been set. |
| 10 | 10 |
| 11 Emulator: The class provides the methods to launch/shutdown the emulator with | 11 Emulator: The class provides the methods to launch/shutdown the emulator with |
| 12 the android virtual device named 'avd_armeabi' . | 12 the android virtual device named 'avd_armeabi' . |
| 13 """ | 13 """ |
| 14 | 14 |
| 15 import logging | 15 import logging |
| 16 import os | 16 import os |
| 17 import signal | 17 import signal |
| 18 import subprocess | 18 import subprocess |
| 19 import sys | 19 import sys |
| 20 import time | 20 import time |
| 21 | 21 |
| 22 from pylib import android_commands | 22 from pylib import android_commands |
| 23 from pylib import cmd_helper | 23 from pylib import cmd_helper |
| 24 from pylib.utils import time_profile | |
| 24 | 25 |
| 25 # adb_interface.py is under ../../third_party/android_testrunner/ | 26 # adb_interface.py is under ../../third_party/android_testrunner/ |
| 26 sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', | 27 sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', |
| 27 '..', 'third_party', 'android_testrunner')) | 28 '..', 'third_party', 'android_testrunner')) |
| 28 import adb_interface | 29 import adb_interface |
| 29 import errors | 30 import errors |
| 30 import run_command | 31 import run_command |
| 31 | 32 |
| 32 class EmulatorLaunchException(Exception): | 33 class EmulatorLaunchException(Exception): |
| 33 """Emulator failed to launch.""" | 34 """Emulator failed to launch.""" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 """Returns an available TCP port for the console.""" | 93 """Returns an available TCP port for the console.""" |
| 93 used_ports = [] | 94 used_ports = [] |
| 94 emulators = android_commands.GetEmulators() | 95 emulators = android_commands.GetEmulators() |
| 95 for emulator in emulators: | 96 for emulator in emulators: |
| 96 used_ports.append(emulator.split('-')[1]) | 97 used_ports.append(emulator.split('-')[1]) |
| 97 for port in PortPool.port_range(): | 98 for port in PortPool.port_range(): |
| 98 if str(port) not in used_ports: | 99 if str(port) not in used_ports: |
| 99 return port | 100 return port |
| 100 | 101 |
| 101 | 102 |
| 103 def LaunchEmulators(emulator_count, fast_and_loose=False): | |
| 104 """Launch multiple emulators and wait for them to boot. | |
| 105 | |
| 106 Args: | |
| 107 emulator_count: number of emulators to launch. | |
| 108 | |
| 109 Returns: | |
| 110 List of emulators. | |
| 111 """ | |
| 112 emulators = [] | |
| 113 for n in xrange(emulator_count): | |
| 114 t = time_profile.TimeProfile('Emulator launch %d' % n) | |
| 115 avd_name = None | |
| 116 if n > 0: | |
| 117 # Creates a temporary AVD for the extra emulators. | |
| 118 avd_name = 'run_tests_avd_%d' % n | |
| 119 logging.info('Emulator launch %d with avd_name=%s', n, avd_name) | |
| 120 emulator = Emulator(avd_name, fast_and_loose) | |
| 121 emulator.Launch(kill_all_emulators=n == 0) | |
| 122 t.Stop() | |
| 123 emulators.append(emulator) | |
| 124 # Wait for all emulators to boot completed. | |
| 125 for emulator in emulators: | |
| 126 emulator.ConfirmLaunch(True) | |
| 127 return emulators | |
| 128 | |
| 129 | |
| 102 class Emulator(object): | 130 class Emulator(object): |
| 103 """Provides the methods to lanuch/shutdown the emulator. | 131 """Provides the methods to lanuch/shutdown the emulator. |
| 104 | 132 |
| 105 The emulator has the android virtual device named 'avd_armeabi'. | 133 The emulator has the android virtual device named 'avd_armeabi'. |
| 106 | 134 |
| 107 The emulator could use any even TCP port between 5554 and 5584 for the | 135 The emulator could use any even TCP port between 5554 and 5584 for the |
| 108 console communication, and this port will be part of the device name like | 136 console communication, and this port will be part of the device name like |
| 109 'emulator-5554'. Assume it is always True, as the device name is the id of | 137 'emulator-5554'. Assume it is always True, as the device name is the id of |
| 110 emulator managed in this class. | 138 emulator managed in this class. |
| 111 | 139 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 signal.signal(sig, signal.SIG_DFL) | 335 signal.signal(sig, signal.SIG_DFL) |
| 308 self.Shutdown() | 336 self.Shutdown() |
| 309 raise KeyboardInterrupt # print a stack | 337 raise KeyboardInterrupt # print a stack |
| 310 | 338 |
| 311 def _InstallKillHandler(self): | 339 def _InstallKillHandler(self): |
| 312 """Install a handler to kill the emulator when we exit unexpectedly.""" | 340 """Install a handler to kill the emulator when we exit unexpectedly.""" |
| 313 for sig in self._SIGNALS: | 341 for sig in self._SIGNALS: |
| 314 signal.signal(sig, self._ShutdownOnSignal) | 342 signal.signal(sig, self._ShutdownOnSignal) |
| 315 | 343 |
| 316 def main(argv): | 344 def main(argv): |
| 317 Emulator(None, True).Launch(True) | 345 Emulator(None, True).Launch(True) |
|
frankf
2013/01/08 22:14:27
Can we move emulator.py into pylib/utils. Does it
| |
| 318 | 346 |
| 319 | 347 |
| 320 if __name__ == '__main__': | 348 if __name__ == '__main__': |
| 321 main(sys.argv) | 349 main(sys.argv) |
| OLD | NEW |