Index: tools/testing/dart/android.dart |
diff --git a/tools/testing/dart/android.dart b/tools/testing/dart/android.dart |
deleted file mode 100644 |
index d514bd62ee51db9c47f4dc1c653da94474965a1e..0000000000000000000000000000000000000000 |
--- a/tools/testing/dart/android.dart |
+++ /dev/null |
@@ -1,334 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library android; |
- |
-import "dart:async"; |
-import "dart:convert" show LineSplitter, UTF8; |
-import "dart:core"; |
-import "dart:io"; |
- |
-import "path.dart"; |
-import "utils.dart"; |
- |
-Future _executeCommand(String executable, |
- List<String> args, |
- [String stdin = ""]) { |
- return _executeCommandRaw(executable, args, stdin).then((results) => null); |
-} |
- |
-Future _executeCommandGetOutput(String executable, |
- List<String> args, |
- [String stdin = ""]) { |
- return _executeCommandRaw(executable, args, stdin) |
- .then((output) => output); |
-} |
- |
-/** |
- * [_executeCommandRaw] will write [stdin] to the standard input of the created |
- * process and will return a tuple (stdout, stderr). |
- * |
- * If the exit code of the process was nonzero it will complete with an error. |
- * If starting the process failed, it will complete with an error as well. |
- */ |
-Future _executeCommandRaw(String executable, |
- List<String> args, |
- [String stdin = ""]) { |
- Future<String> getOutput(Stream<List<int>> stream) { |
- return stream.transform(UTF8.decoder).toList() |
- .then((data) => data.join("")); |
- } |
- |
- DebugLogger.info("Running: '\$ $executable ${args.join(' ')}'"); |
- return Process.start(executable, args).then((Process process) { |
- if (stdin != null && stdin != '') { |
- process.stdin.write(stdin); |
- } |
- process.stdin.close(); |
- |
- var futures = [getOutput(process.stdout), |
- getOutput(process.stderr), |
- process.exitCode]; |
- return Future.wait(futures).then((results) { |
- bool success = results[2] == 0; |
- if (!success) { |
- var error = "Running: '\$ $executable ${args.join(' ')}' failed:" |
- "stdout: \n ${results[0]}" |
- "stderr: \n ${results[1]}" |
- "exitCode: \n ${results[2]}"; |
- throw new Exception(error); |
- } else { |
- DebugLogger.info("Success: $executable finished"); |
- } |
- return results[0]; |
- }); |
- }); |
-} |
- |
-/** |
- * Helper class to loop through all adb ports. |
- * |
- * The ports come in pairs: |
- * - even number: console connection |
- * - odd number: adb connection |
- * Note that this code doesn't check if the ports are used. |
- */ |
-class AdbServerPortPool { |
- static int MIN_PORT = 5554; |
- static int MAX_PORT = 5584; |
- |
- static int _nextPort = MIN_PORT; |
- |
- static int next() { |
- var port = _nextPort; |
- if (port > MAX_PORT) { |
- throw new Exception("All ports are used."); |
- } |
- _nextPort += 2; |
- return port; |
- } |
-} |
- |
-/** |
- * Represents the interface to the emulator. |
- * New emulators can be launched by calling the static [launchNewEmulator] |
- * method. |
- */ |
-class AndroidEmulator { |
- int _port; |
- Process _emulatorProcess; |
- AdbDevice _adbDevice; |
- |
- int get port => _port; |
- |
- AdbDevice get adbDevice => _adbDevice; |
- |
- static Future<AndroidEmulator> launchNewEmulator(String avdName) { |
- var portNumber = AdbServerPortPool.next(); |
- var args = ['-avd', '$avdName', '-port', "$portNumber" /*, '-gpu', 'on'*/]; |
- return Process.start("emulator64-arm", args).then((Process process) { |
- var adbDevice = new AdbDevice('emulator-$portNumber'); |
- return new AndroidEmulator._private(portNumber, adbDevice, process); |
- }); |
- } |
- |
- AndroidEmulator._private(this._port, this._adbDevice, this._emulatorProcess) { |
- Stream<String> getLines(Stream s) { |
- return s.transform(UTF8.decoder).transform(new LineSplitter()); |
- } |
- |
- getLines(_emulatorProcess.stdout).listen((line) { |
- log("stdout: ${line.trim()}"); |
- }); |
- getLines(_emulatorProcess.stderr).listen((line) { |
- log("stderr: ${line.trim()}"); |
- }); |
- _emulatorProcess.exitCode.then((exitCode) { |
- log("emulator exited with exitCode: $exitCode."); |
- }); |
- } |
- |
- Future<bool> kill() { |
- var completer = new Completer(); |
- if (_emulatorProcess.kill()) { |
- _emulatorProcess.exitCode.then((exitCode) { |
- // TODO: Should we use exitCode to do something clever? |
- completer.complete(true); |
- }); |
- } else { |
- log("Sending kill signal to emulator process failed"); |
- completer.complete(false); |
- } |
- return completer.future; |
- } |
- |
- void log(String msg) { |
- DebugLogger.info("AndroidEmulator(${_adbDevice.deviceId}): $msg"); |
- } |
-} |
- |
-/** |
- * Helper class to create avd device configurations. |
- */ |
-class AndroidHelper { |
- static Future createAvd(String name, String target) { |
- var args = ['--silent', 'create', 'avd', '--name', '$name', |
- '--target', '$target', '--force', '--abi', 'armeabi-v7a']; |
- // We're adding newlines to stdin to simulate <enter>. |
- return _executeCommand("android", args, "\n\n\n\n"); |
- } |
-} |
- |
-/** |
- * Used for communicating with an emulator or with a real device. |
- */ |
-class AdbDevice { |
- static const _adbServerStartupTime = const Duration(seconds: 3); |
- String _deviceId; |
- |
- String get deviceId => _deviceId; |
- |
- AdbDevice(this._deviceId); |
- |
- /** |
- * Blocks execution until the device is online |
- */ |
- Future waitForDevice() { |
- return _adbCommand(['wait-for-device']); |
- } |
- |
- /** |
- * Polls the 'sys.boot_completed' property. Returns as soon as the property is |
- * 1. |
- */ |
- Future waitForBootCompleted() { |
- var timeout = const Duration(seconds: 2); |
- var completer = new Completer(); |
- |
- checkUntilBooted() { |
- _adbCommandGetOutput(['shell', 'getprop', 'sys.boot_completed']) |
- .then((String stdout) { |
- stdout = stdout.trim(); |
- if (stdout == '1') { |
- completer.complete(); |
- } else { |
- new Timer(timeout, checkUntilBooted); |
- } |
- }).catchError((error) { |
- new Timer(timeout, checkUntilBooted); |
- }); |
- } |
- checkUntilBooted(); |
- return completer.future; |
- } |
- |
- /** |
- * Put adb in root mode. |
- */ |
- Future adbRoot() { |
- var adbRootCompleter = new Completer(); |
- _adbCommand(['root']).then((_) { |
- // TODO: Figure out a way to wait until the adb daemon was restarted in |
- // 'root mode' on the device. |
- new Timer(_adbServerStartupTime, () => adbRootCompleter.complete(true)); |
- }).catchError((error) => adbRootCompleter.completeError(error)); |
- return adbRootCompleter.future; |
- } |
- |
- /** |
- * Download data form the device. |
- */ |
- Future pullData(Path remote, Path local) { |
- return _adbCommand(['pull', '$remote', '$local']); |
- } |
- |
- /** |
- * Upload data to the device. |
- */ |
- Future pushData(Path local, Path remote) { |
- return _adbCommand(['push', '$local', '$remote']); |
- } |
- |
- /** |
- * Change permission of directory recursively. |
- */ |
- Future chmod(String mode, Path directory) { |
- var arguments = ['shell', 'chmod', '-R', mode, '$directory']; |
- return _adbCommand(arguments); |
- } |
- |
- /** |
- * Install an application on the device. |
- */ |
- Future installApk(Path filename) { |
- return _adbCommand( |
- ['install', '-i', 'com.google.android.feedback', '-r', '$filename']); |
- } |
- |
- /** |
- * Start the given intent on the device. |
- */ |
- Future startActivity(Intent intent) { |
- var arguments = ['shell', 'am', 'start', '-W', |
- '-a', intent.action, |
- '-n', "${intent.package}/${intent.activity}"]; |
- if (intent.dataUri != null) { |
- arguments.addAll(['-d', intent.dataUri]); |
- } |
- return _adbCommand(arguments); |
- } |
- |
- /** |
- * Force to stop everything associated with [package]. |
- */ |
- Future forceStop(String package) { |
- var arguments = ['shell', 'am', 'force-stop', package]; |
- return _adbCommand(arguments); |
- } |
- |
- /** |
- * Set system property name to value. |
- */ |
- Future setProp(String name, String value) { |
- return _adbCommand(['shell', 'setprop', name, value]); |
- } |
- |
- /** |
- * Kill all background processes. |
- */ |
- Future killAll() { |
- var arguments = ['shell', 'am', 'kill-all']; |
- return _adbCommand(arguments); |
- } |
- |
- Future _adbCommand(List<String> adbArgs) { |
- if (_deviceId != null) { |
- var extendedAdbArgs = ['-s', _deviceId]; |
- extendedAdbArgs.addAll(adbArgs); |
- adbArgs = extendedAdbArgs; |
- } |
- return _executeCommand("adb", adbArgs); |
- } |
- |
- Future<String> _adbCommandGetOutput(List<String> adbArgs) { |
- if (_deviceId != null) { |
- var extendedAdbArgs = ['-s', _deviceId]; |
- extendedAdbArgs.addAll(adbArgs); |
- adbArgs = extendedAdbArgs; |
- } |
- return _executeCommandGetOutput("adb", adbArgs); |
- } |
-} |
- |
-/** |
- * Helper to list all adb devices available. |
- */ |
-class AdbHelper { |
- static RegExp _deviceLineRegexp = |
- new RegExp(r'^([a-zA-Z0-9_-]+)[ \t]+device$', multiLine: true); |
- |
- static Future<List<String>> listDevices() { |
- return Process.run('adb', ['devices']).then((ProcessResult result) { |
- if (result.exitCode != 0) { |
- throw new Exception("Could not list devices [stdout: ${result.stdout}," |
- "stderr: ${result.stderr}]"); |
- } |
- return _deviceLineRegexp.allMatches(result.stdout) |
- .map((Match m) => m.group(1)).toList(); |
- }); |
- } |
-} |
- |
-/** |
- * Represents an android intent. |
- */ |
-class Intent { |
- String action; |
- String package; |
- String activity; |
- String dataUri; |
- |
- Intent(this.action, this.package, this.activity, [this.dataUri]); |
-} |
- |