@@ -11,12 +11,12 @@ import 'package:flutter_tools/src/base/io.dart';
1111import 'package:flutter_tools/src/cache.dart' ;
1212import 'package:flutter_tools/src/context_runner.dart' ;
1313import 'package:flutter_tools/src/dart/package_map.dart' ;
14+ import 'package:flutter_tools/src/artifacts.dart' ;
1415import 'package:flutter_tools/src/disabled_usage.dart' ;
1516import 'package:flutter_tools/src/globals.dart' ;
16- import 'package:flutter_tools/src/test/flutter_platform.dart' as loader;
17+ import 'package:flutter_tools/src/test/coverage_collector.dart' ;
18+ import 'package:flutter_tools/src/test/runner.dart' ;
1719import 'package:flutter_tools/src/usage.dart' ;
18- import 'package:test/src/executable.dart'
19- as test; // ignore: implementation_imports
2020
2121// Note: this was largely inspired by lib/src/commands/test.dart.
2222
@@ -28,6 +28,8 @@ const List<String> _kRequiredOptions = const <String>[
2828 _kOptionShell,
2929 _kOptionTestDirectory,
3030];
31+ const String _kOptionCoverage = 'coverage' ;
32+ const String _kOptionCoveragePath = 'coverage-path' ;
3133
3234Future <Null > main (List <String > args) {
3335 return runInContext <Null >(() => run (args), overrides: < Type , dynamic > {
@@ -47,12 +49,20 @@ Future<Null> run(List<String> args) async {
4749 final ArgParser parser = new ArgParser ()
4850 ..addOption (_kOptionPackages, help: 'The .packages file' )
4951 ..addOption (_kOptionShell, help: 'The Flutter shell binary' )
50- ..addOption (_kOptionTestDirectory, help: 'Directory containing the tests' );
52+ ..addOption (_kOptionTestDirectory, help: 'Directory containing the tests' )
53+ ..addFlag (_kOptionCoverage,
54+ defaultsTo: false ,
55+ negatable: false ,
56+ help: 'Whether to collect coverage information.' ,
57+ )
58+ ..addOption (_kOptionCoveragePath,
59+ defaultsTo: 'coverage/lcov.info' ,
60+ help: 'Where to store coverage information (if coverage is enabled).' ,
61+ );
5162 final ArgResults argResults = parser.parse (args);
5263 if (_kRequiredOptions
5364 .any ((String option) => ! argResults.options.contains (option))) {
54- printError ('Missing option! All options must be specified.' );
55- exit (1 );
65+ throwToolExit ('Missing option! All options must be specified.' );
5666 }
5767 final Directory tempDirectory =
5868 fs.systemTempDirectory.createTempSync ('fuchsia_tester' );
@@ -70,16 +80,36 @@ Future<Null> run(List<String> args) async {
7080 if (! fs.isFileSync (shellPath)) {
7181 throwToolExit ('Cannot find Flutter shell at $shellPath ' );
7282 }
73- loader.installHook (
74- shellPath: shellPath,
75- );
83+ // Put the tester shell where runTests expects it.
84+ // TODO(tvolkert,garymm): Switch to a Fuchsia-specific Artifacts impl.
85+ final Link testerDestLink =
86+ fs.link (artifacts.getArtifactPath (Artifact .flutterTester));
87+ testerDestLink.parent.createSync (recursive: true );
88+ testerDestLink.createSync (shellPath);
7689
7790 PackageMap .globalPackagesPath =
7891 fs.path.normalize (fs.path.absolute (argResults[_kOptionPackages]));
79- fs.currentDirectory = testDirectory;
8092
81- await test.main (testArgs);
82- exit (exitCode);
93+ CoverageCollector collector;
94+ if (argResults['coverage' ]) {
95+ collector = new CoverageCollector ();
96+ }
97+
98+ exitCode = await runTests (
99+ tests,
100+ workDir: testDirectory,
101+ watcher: collector,
102+ enableObservatory: collector != null ,
103+ );
104+
105+ if (collector != null ) {
106+ // collector expects currentDirectory to be the root of the dart
107+ // package (i.e. contains lib/ and test/ sub-dirs).
108+ fs.currentDirectory = testDirectory.parent;
109+ if (! await
110+ collector.collectCoverageData (argResults[_kOptionCoveragePath]))
111+ throwToolExit ('Failed to collect coverage data' );
112+ }
83113 } finally {
84114 tempDirectory.deleteSync (recursive: true );
85115 }
0 commit comments