Add android workflow test (#14260)

Adds unit tests for AndroidWorkflow.runLicenseManager().
diff --git a/packages/flutter_tools/test/android/android_workflow_test.dart b/packages/flutter_tools/test/android/android_workflow_test.dart
new file mode 100644
index 0000000..b2113ea
--- /dev/null
+++ b/packages/flutter_tools/test/android/android_workflow_test.dart
@@ -0,0 +1,76 @@
+// Copyright 2018 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.
+
+import 'package:file/memory.dart';
+import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/android/android_sdk.dart';
+import 'package:flutter_tools/src/android/android_workflow.dart';
+import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
+import 'package:test/test.dart';
+
+import '../src/common.dart';
+import '../src/context.dart';
+import '../src/mocks.dart' show MockAndroidSdk, MockProcessManager, MockStdio;
+
+void main() {
+  AndroidSdk sdk;
+  MemoryFileSystem fs;
+  MockProcessManager processManager;
+  MockStdio stdio;
+
+  setUp(() {
+    sdk = new MockAndroidSdk();
+    fs = new MemoryFileSystem();
+    processManager = new MockProcessManager();
+    stdio = new MockStdio();
+  });
+
+  testUsingContext('runLicenseManager succeeds for version >= 26', () async {
+    fs.directory('/home/me').createSync(recursive: true);
+    MockAndroidSdk.createSdkDirectory();
+    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
+    when(sdk.sdkManagerVersion).thenReturn('26.0.0');
+
+    expect(await AndroidWorkflow.runLicenseManager(), isTrue);
+  }, overrides: <Type, Generator>{
+    AndroidSdk: () => sdk,
+    FileSystem: () => fs,
+    Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
+    ProcessManager: () => processManager,
+    Stdio: () => stdio,
+  });
+
+  testUsingContext('runLicenseManager errors for version < 26', () async {
+    fs.directory('/home/me').createSync(recursive: true);
+    MockAndroidSdk.createSdkDirectory();
+    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
+    when(sdk.sdkManagerVersion).thenReturn('25.0.0');
+
+    expect(AndroidWorkflow.runLicenseManager(), throwsToolExit());
+  }, overrides: <Type, Generator>{
+    AndroidSdk: () => sdk,
+    FileSystem: () => fs,
+    Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
+    ProcessManager: () => processManager,
+    Stdio: () => stdio,
+  });
+
+  testUsingContext('runLicenseManager errors when sdkmanager is not found', () async {
+    fs.directory('/home/me').createSync(recursive: true);
+    MockAndroidSdk.createSdkDirectory();
+    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
+    processManager.succeed = false;
+
+    expect(AndroidWorkflow.runLicenseManager(), throwsToolExit());
+  }, overrides: <Type, Generator>{
+    AndroidSdk: () => sdk,
+    FileSystem: () => fs,
+    Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
+    ProcessManager: () => processManager,
+    Stdio: () => stdio,
+  });
+}
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index d6c0217..6c29a5e 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -109,9 +109,13 @@
 /// A ProcessManager that starts Processes by delegating to a ProcessFactory.
 class MockProcessManager implements ProcessManager {
   ProcessFactory processFactory = (List<String> commands) => new MockProcess();
+  bool succeed = true;
   List<String> commands;
 
   @override
+  bool canRun(dynamic command, { String workingDirectory }) => succeed;
+
+  @override
   Future<Process> start(
     List<dynamic> command, {
     String workingDirectory,
@@ -120,6 +124,12 @@
     bool runInShell: false,
     ProcessStartMode mode: ProcessStartMode.NORMAL,
   }) {
+    if (!succeed) {
+      final String executable = command[0];
+      final List<String> arguments = command.length > 1 ? command.sublist(1) : <String>[];
+      throw new ProcessException(executable, arguments);
+    }
+
     commands = command;
     return new Future<Process>.value(processFactory(command));
   }