Fix process running during package creation (#14508)

There were some problems I introduced with the last PR for this. It passed the test, but failed in practice.

This adds tests for those failure cases, adds a "--help" and fixes the test so that it doesn't try and actually download MinGit as part of the Windows test.

I added package:platform as a dependency, so I did a force upgrade on the packages.

Also, re-enabling 'create package' in the cache warming code, now that #14448 is fixed.
diff --git a/dev/bots/test/prepare_package_test.dart b/dev/bots/test/prepare_package_test.dart
index c517ae6..320feee 100644
--- a/dev/bots/test/prepare_package_test.dart
+++ b/dev/bots/test/prepare_package_test.dart
@@ -2,8 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io' hide Platform;
+import 'dart:typed_data';
 
 import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
@@ -20,6 +22,39 @@
       operatingSystem: platformName,
       environment: <String, String>{},
     );
+    group('ProcessRunner for $platform', () {
+      test('Defaults to local process manager, can actually run a command', () async {
+        final ProcessRunner processRunner =
+            new ProcessRunner(subprocessOutput: false, platform: platform);
+        // We want to test that we can actually run a process and obtain stdout.
+        // The command 'echo test' works on all platforms.
+        final String output = await processRunner.runProcess(<String>['echo', 'test']);
+        expect(output, equals('test'));
+      });
+      test('Returns stdout', () async {
+        final FakeProcessManager fakeProcessManager = new FakeProcessManager();
+        fakeProcessManager.fakeResults = <String, List<ProcessResult>>{
+          'echo test': <ProcessResult>[new ProcessResult(0, 0, 'output', 'error')],
+        };
+        final ProcessRunner processRunner = new ProcessRunner(
+            subprocessOutput: false, platform: platform, processManager: fakeProcessManager);
+        final String output = await processRunner.runProcess(<String>['echo', 'test']);
+        expect(output, equals('output'));
+      });
+      test('Throws on process failure', () async {
+        final FakeProcessManager fakeProcessManager = new FakeProcessManager();
+        fakeProcessManager.fakeResults = <String, List<ProcessResult>>{
+          'echo test': <ProcessResult>[new ProcessResult(0, -1, 'output', 'error')],
+        };
+        final ProcessRunner processRunner = new ProcessRunner(
+            subprocessOutput: false, platform: platform, processManager: fakeProcessManager);
+        expect(
+            expectAsync1((List<String> commandLine) async {
+              return processRunner.runProcess(commandLine);
+            })(<String>['echo', 'test']),
+            throwsA(const isInstanceOf<ProcessRunnerException>()));
+      });
+    });
     group('ArchiveCreator for $platformName', () {
       ArchiveCreator creator;
       Directory tmpDir;
@@ -29,6 +64,10 @@
       final List<Map<Symbol, dynamic>> namedArgs = <Map<Symbol, dynamic>>[];
       String flutter;
 
+      Future<Uint8List> fakeHttpReader(Uri url, {Map<String, String> headers}) {
+        return new Future<Uint8List>.value(new Uint8List(0));
+      }
+
       setUp(() async {
         processManager = new FakeProcessManager();
         args.clear();
@@ -44,6 +83,7 @@
           processManager: processManager,
           subprocessOutput: false,
           platform: platform,
+          httpReader: fakeHttpReader,
         );
         flutter = path.join(creator.flutterRoot.absolute.path, 'bin', 'flutter');
       });
@@ -119,9 +159,7 @@
           '$flutter precache': null,
           '$flutter ide-config': null,
           '$flutter create --template=app ${createBase}app': null,
-          // TODO(gspencer): Re-enable this when package works again:
-          // https://github.com/flutter/flutter/issues/14448
-          // '$flutter create --template=package ${createBase}package': null,
+          '$flutter create --template=package ${createBase}package': null,
           '$flutter create --template=plugin ${createBase}plugin': null,
           'git clean -f -X **/.packages': null,
         });
@@ -141,6 +179,7 @@
           processManager: processManager,
           subprocessOutput: false,
           platform: platform,
+          httpReader: fakeHttpReader,
         );
         await creator.initializeRepo();
         await creator.createArchive();