| 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 import time_profile | 
|  | 23 # TODO(craigdh): Move these pylib dependencies to pylib/utils/. | 
| 22 from pylib import android_commands | 24 from pylib import android_commands | 
| 23 from pylib import cmd_helper | 25 from pylib import cmd_helper | 
| 24 | 26 | 
| 25 # adb_interface.py is under ../../third_party/android_testrunner/ | 27 # adb_interface.py is under ../../third_party/android_testrunner/ | 
| 26 sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', | 28 sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', | 
| 27    '..', 'third_party', 'android_testrunner')) | 29    '..', 'third_party', 'android_testrunner')) | 
| 28 import adb_interface | 30 import adb_interface | 
| 29 import errors | 31 import errors | 
| 30 import run_command | 32 import run_command | 
| 31 | 33 | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 92   """Returns an available TCP port for the console.""" | 94   """Returns an available TCP port for the console.""" | 
| 93   used_ports = [] | 95   used_ports = [] | 
| 94   emulators = android_commands.GetEmulators() | 96   emulators = android_commands.GetEmulators() | 
| 95   for emulator in emulators: | 97   for emulator in emulators: | 
| 96     used_ports.append(emulator.split('-')[1]) | 98     used_ports.append(emulator.split('-')[1]) | 
| 97   for port in PortPool.port_range(): | 99   for port in PortPool.port_range(): | 
| 98     if str(port) not in used_ports: | 100     if str(port) not in used_ports: | 
| 99       return port | 101       return port | 
| 100 | 102 | 
| 101 | 103 | 
|  | 104 def LaunchEmulators(emulator_count, wait_for_boot=True): | 
|  | 105   """Launch multiple emulators and wait for them to boot. | 
|  | 106 | 
|  | 107   Args: | 
|  | 108     emulator_count: number of emulators to launch. | 
|  | 109 | 
|  | 110   Returns: | 
|  | 111     List of emulators. | 
|  | 112   """ | 
|  | 113   emulators = [] | 
|  | 114   for n in xrange(emulator_count): | 
|  | 115     t = time_profile.TimeProfile('Emulator launch %d' % n) | 
|  | 116     avd_name = None | 
|  | 117     if n > 0: | 
|  | 118       # Creates a temporary AVD for the extra emulators. | 
|  | 119       avd_name = 'run_tests_avd_%d' % n | 
|  | 120     logging.info('Emulator launch %d with avd_name=%s', n, avd_name) | 
|  | 121     emulator = Emulator(avd_name) | 
|  | 122     emulator.Launch(kill_all_emulators=n == 0) | 
|  | 123     t.Stop() | 
|  | 124     emulators.append(emulator) | 
|  | 125   # Wait for all emulators to boot completed. | 
|  | 126   if wait_for_boot: | 
|  | 127     for emulator in emulators: | 
|  | 128       emulator.ConfirmLaunch(True) | 
|  | 129   return emulators | 
|  | 130 | 
|  | 131 | 
| 102 class Emulator(object): | 132 class Emulator(object): | 
| 103   """Provides the methods to lanuch/shutdown the emulator. | 133   """Provides the methods to launch/shutdown the emulator. | 
| 104 | 134 | 
| 105   The emulator has the android virtual device named 'avd_armeabi'. | 135   The emulator has the android virtual device named 'avd_armeabi'. | 
| 106 | 136 | 
| 107   The emulator could use any even TCP port between 5554 and 5584 for the | 137   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 | 138   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 | 139   'emulator-5554'. Assume it is always True, as the device name is the id of | 
| 110   emulator managed in this class. | 140   emulator managed in this class. | 
| 111 | 141 | 
| 112   Attributes: | 142   Attributes: | 
| 113     emulator: Path of Android's emulator tool. | 143     emulator: Path of Android's emulator tool. | 
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 299     logging.critical('emulator _ShutdownOnSignal') | 329     logging.critical('emulator _ShutdownOnSignal') | 
| 300     for sig in self._SIGNALS: | 330     for sig in self._SIGNALS: | 
| 301       signal.signal(sig, signal.SIG_DFL) | 331       signal.signal(sig, signal.SIG_DFL) | 
| 302     self.Shutdown() | 332     self.Shutdown() | 
| 303     raise KeyboardInterrupt  # print a stack | 333     raise KeyboardInterrupt  # print a stack | 
| 304 | 334 | 
| 305   def _InstallKillHandler(self): | 335   def _InstallKillHandler(self): | 
| 306     """Install a handler to kill the emulator when we exit unexpectedly.""" | 336     """Install a handler to kill the emulator when we exit unexpectedly.""" | 
| 307     for sig in self._SIGNALS: | 337     for sig in self._SIGNALS: | 
| 308       signal.signal(sig, self._ShutdownOnSignal) | 338       signal.signal(sig, self._ShutdownOnSignal) | 
| 309 |  | 
| 310 def main(argv): |  | 
| 311   Emulator(None, True).Launch(True) |  | 
| 312 |  | 
| 313 |  | 
| 314 if __name__ == '__main__': |  | 
| 315   main(sys.argv) |  | 
| OLD | NEW | 
|---|