Move collectCoverageData into CoverageCollector so it can be re-used. (#19055)

This will let us re-use that code from fuchsia_tester.dart.
Tested by running the stocks example tests with coverage collection before and after.
.lcov files are identical.
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index a9252d2..1541dfc 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -6,13 +6,7 @@
 
 import '../base/common.dart';
 import '../base/file_system.dart';
-import '../base/io.dart';
-import '../base/logger.dart';
-import '../base/os.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../cache.dart';
-import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../test/coverage_collector.dart';
 import '../test/event_printer.dart';
@@ -92,65 +86,6 @@
   @override
   String get description => 'Run Flutter unit tests for the current project.';
 
-  Future<bool> _collectCoverageData(CoverageCollector collector, { bool mergeCoverageData = false }) async {
-    final Status status = logger.startProgress('Collecting coverage information...');
-    final String coverageData = await collector.finalizeCoverage(
-      timeout: const Duration(seconds: 30),
-    );
-    status.stop();
-    printTrace('coverage information collection complete');
-    if (coverageData == null)
-      return false;
-
-    final String coveragePath = argResults['coverage-path'];
-    final File coverageFile = fs.file(coveragePath)
-      ..createSync(recursive: true)
-      ..writeAsStringSync(coverageData, flush: true);
-    printTrace('wrote coverage data to $coveragePath (size=${coverageData.length})');
-
-    const String baseCoverageData = 'coverage/lcov.base.info';
-    if (mergeCoverageData) {
-      if (!platform.isLinux) {
-        printError(
-          'Merging coverage data is supported only on Linux because it '
-          'requires the "lcov" tool.'
-        );
-        return false;
-      }
-
-      if (!fs.isFileSync(baseCoverageData)) {
-        printError('Missing "$baseCoverageData". Unable to merge coverage data.');
-        return false;
-      }
-
-      if (os.which('lcov') == null) {
-        String installMessage = 'Please install lcov.';
-        if (platform.isLinux)
-          installMessage = 'Consider running "sudo apt-get install lcov".';
-        else if (platform.isMacOS)
-          installMessage = 'Consider running "brew install lcov".';
-        printError('Missing "lcov" tool. Unable to merge coverage data.\n$installMessage');
-        return false;
-      }
-
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_tools');
-      try {
-        final File sourceFile = coverageFile.copySync(fs.path.join(tempDir.path, 'lcov.source.info'));
-        final ProcessResult result = processManager.runSync(<String>[
-          'lcov',
-          '--add-tracefile', baseCoverageData,
-          '--add-tracefile', sourceFile.path,
-          '--output-file', coverageFile.path,
-        ]);
-        if (result.exitCode != 0)
-          return false;
-      } finally {
-        tempDir.deleteSync(recursive: true);
-      }
-    }
-    return true;
-  }
-
   @override
   Future<Null> validateCommand() async {
     await super.validateCommand();
@@ -229,7 +164,8 @@
     );
 
     if (collector != null) {
-      if (!await _collectCoverageData(collector, mergeCoverageData: argResults['merge-coverage']))
+      if (!await collector.collectCoverageData(
+          argResults['coverage-path'], mergeCoverageData: argResults['merge-coverage']))
         throwToolExit(null);
     }
 
diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart
index 43dfc86..de79201 100644
--- a/packages/flutter_tools/lib/src/test/coverage_collector.dart
+++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart
@@ -8,6 +8,10 @@
 
 import '../base/file_system.dart';
 import '../base/io.dart';
+import '../base/logger.dart';
+import '../base/os.dart';
+import '../base/platform.dart';
+import '../base/process_manager.dart';
 import '../dart/package_map.dart';
 import '../globals.dart';
 
@@ -99,4 +103,62 @@
     _globalHitmap = null;
     return result;
   }
+
+  Future<bool> collectCoverageData(String coveragePath, { bool mergeCoverageData = false }) async {
+    final Status status = logger.startProgress('Collecting coverage information...');
+    final String coverageData = await finalizeCoverage(
+      timeout: const Duration(seconds: 30),
+    );
+    status.stop();
+    printTrace('coverage information collection complete');
+    if (coverageData == null)
+      return false;
+
+    final File coverageFile = fs.file(coveragePath)
+      ..createSync(recursive: true)
+      ..writeAsStringSync(coverageData, flush: true);
+    printTrace('wrote coverage data to $coveragePath (size=${coverageData.length})');
+
+    const String baseCoverageData = 'coverage/lcov.base.info';
+    if (mergeCoverageData) {
+      if (!platform.isLinux) {
+        printError(
+          'Merging coverage data is supported only on Linux because it '
+          'requires the "lcov" tool.'
+        );
+        return false;
+      }
+
+      if (!fs.isFileSync(baseCoverageData)) {
+        printError('Missing "$baseCoverageData". Unable to merge coverage data.');
+        return false;
+      }
+
+      if (os.which('lcov') == null) {
+        String installMessage = 'Please install lcov.';
+        if (platform.isLinux)
+          installMessage = 'Consider running "sudo apt-get install lcov".';
+        else if (platform.isMacOS)
+          installMessage = 'Consider running "brew install lcov".';
+        printError('Missing "lcov" tool. Unable to merge coverage data.\n$installMessage');
+        return false;
+      }
+
+      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_tools');
+      try {
+        final File sourceFile = coverageFile.copySync(fs.path.join(tempDir.path, 'lcov.source.info'));
+        final ProcessResult result = processManager.runSync(<String>[
+          'lcov',
+          '--add-tracefile', baseCoverageData,
+          '--add-tracefile', sourceFile.path,
+          '--output-file', coverageFile.path,
+        ]);
+        if (result.exitCode != 0)
+          return false;
+      } finally {
+        tempDir.deleteSync(recursive: true);
+      }
+    }
+    return true;
+  }
 }