summaryrefslogtreecommitdiffstats
path: root/build/android/emulator.py
diff options
context:
space:
mode:
Diffstat (limited to 'build/android/emulator.py')
-rwxr-xr-xbuild/android/emulator.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/build/android/emulator.py b/build/android/emulator.py
new file mode 100755
index 0000000..a42564a
--- /dev/null
+++ b/build/android/emulator.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides an interface to start and stop Android emulator.
+
+Assumes system environment ANDROID_NDK_ROOT has been set.
+
+ Emulator: The class provides the methods to launch/shutdown the emulator with
+ the android virtual device named 'buildbot' .
+"""
+
+import logging
+import os
+import subprocess
+import sys
+
+import android_commands
+
+
+def _GetAvailablePort():
+ """Returns an available TCP port for the console."""
+ used_ports = []
+ emulators = android_commands.GetEmulators()
+ for emulator in emulators:
+ used_ports.append(emulator.split('-')[1])
+ # The port must be an even number between 5554 and 5584.
+ for port in range(5554, 5585, 2):
+ if str(port) not in used_ports:
+ return port
+
+
+class Emulator(object):
+ """Provides the methods to lanuch/shutdown the emulator.
+
+ The emulator has the android virtual device named 'buildbot'.
+
+ The emulator could use any even TCP port between 5554 and 5584 for the
+ console communication, and this port will be part of the device name like
+ 'emulator-5554'. Assume it is always True, as the device name is the id of
+ emulator managed in this class.
+
+ Attributes:
+ emulator: Path of Android's emulator tool.
+ popen: Popen object of the running emulator process.
+ device: Device name of this emulator.
+ """
+
+ def __init__(self):
+ try:
+ android_sdk_root = os.environ['ANDROID_SDK_ROOT']
+ except KeyError:
+ logging.critical('The ANDROID_SDK_ROOT must be set to run the test on '
+ 'emulator.')
+ raise
+ self.emulator = os.path.join(android_sdk_root, 'tools', 'emulator')
+ self.popen = None
+ self.device = None
+
+ def Launch(self):
+ """Launches the emulator and waits for package manager to startup.
+
+ If fails, an exception will be raised.
+ """
+ port = _GetAvailablePort()
+ self.device = "emulator-%d" % port
+ self.popen = subprocess.Popen(args=[self.emulator, '-avd', 'buildbot',
+ '-port', str(port)])
+ # This will not return until device's package manager starts up or an
+ # exception is raised.
+ android_commands.AndroidCommands(self.device, True)
+
+ def Shutdown(self):
+ """Shuts down the process started by launch."""
+ self.popen.terminate()
+
+
+def main(argv):
+ Emulator().launch()
+
+
+if __name__ == '__main__':
+ main(sys.argv)