From 032f8cdb8b563bdc200acdce068945a834bf2271 Mon Sep 17 00:00:00 2001 From: Gary Miguel Date: Mon, 9 Jul 2018 16:13:10 -0700 Subject: [PATCH] Use runTests in fuchsia tester. (#19178) This allows us to collect code coverage for Fuchsia tests. --- .../flutter_tools/bin/fuchsia_tester.dart | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/packages/flutter_tools/bin/fuchsia_tester.dart b/packages/flutter_tools/bin/fuchsia_tester.dart index 39060458954..68b86899194 100644 --- a/packages/flutter_tools/bin/fuchsia_tester.dart +++ b/packages/flutter_tools/bin/fuchsia_tester.dart @@ -11,12 +11,12 @@ import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/context_runner.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; +import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/disabled_usage.dart'; import 'package:flutter_tools/src/globals.dart'; -import 'package:flutter_tools/src/test/flutter_platform.dart' as loader; +import 'package:flutter_tools/src/test/coverage_collector.dart'; +import 'package:flutter_tools/src/test/runner.dart'; import 'package:flutter_tools/src/usage.dart'; -import 'package:test/src/executable.dart' - as test; // ignore: implementation_imports // Note: this was largely inspired by lib/src/commands/test.dart. @@ -28,6 +28,8 @@ const List _kRequiredOptions = const [ _kOptionShell, _kOptionTestDirectory, ]; +const String _kOptionCoverage = 'coverage'; +const String _kOptionCoveragePath = 'coverage-path'; Future main(List args) { return runInContext(() => run(args), overrides: { @@ -47,12 +49,20 @@ Future run(List args) async { final ArgParser parser = new ArgParser() ..addOption(_kOptionPackages, help: 'The .packages file') ..addOption(_kOptionShell, help: 'The Flutter shell binary') - ..addOption(_kOptionTestDirectory, help: 'Directory containing the tests'); + ..addOption(_kOptionTestDirectory, help: 'Directory containing the tests') + ..addFlag(_kOptionCoverage, + defaultsTo: false, + negatable: false, + help: 'Whether to collect coverage information.', + ) + ..addOption(_kOptionCoveragePath, + defaultsTo: 'coverage/lcov.info', + help: 'Where to store coverage information (if coverage is enabled).', + ); final ArgResults argResults = parser.parse(args); if (_kRequiredOptions .any((String option) => !argResults.options.contains(option))) { - printError('Missing option! All options must be specified.'); - exit(1); + throwToolExit('Missing option! All options must be specified.'); } final Directory tempDirectory = fs.systemTempDirectory.createTempSync('fuchsia_tester'); @@ -70,16 +80,36 @@ Future run(List args) async { if (!fs.isFileSync(shellPath)) { throwToolExit('Cannot find Flutter shell at $shellPath'); } - loader.installHook( - shellPath: shellPath, - ); + // Put the tester shell where runTests expects it. + // TODO(tvolkert,garymm): Switch to a Fuchsia-specific Artifacts impl. + final Link testerDestLink = + fs.link(artifacts.getArtifactPath(Artifact.flutterTester)); + testerDestLink.parent.createSync(recursive: true); + testerDestLink.createSync(shellPath); PackageMap.globalPackagesPath = fs.path.normalize(fs.path.absolute(argResults[_kOptionPackages])); - fs.currentDirectory = testDirectory; - await test.main(testArgs); - exit(exitCode); + CoverageCollector collector; + if (argResults['coverage']) { + collector = new CoverageCollector(); + } + + exitCode = await runTests( + tests, + workDir: testDirectory, + watcher: collector, + enableObservatory: collector != null, + ); + + if (collector != null) { + // collector expects currentDirectory to be the root of the dart + // package (i.e. contains lib/ and test/ sub-dirs). + fs.currentDirectory = testDirectory.parent; + if (!await + collector.collectCoverageData(argResults[_kOptionCoveragePath])) + throwToolExit('Failed to collect coverage data'); + } } finally { tempDirectory.deleteSync(recursive: true); }