| // Copyright 2013 The Flutter 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/file.dart'; |
| import 'package:platform/platform.dart'; |
| |
| import 'common/core.dart'; |
| import 'common/package_looping_command.dart'; |
| import 'common/plugin_utils.dart'; |
| import 'common/process_runner.dart'; |
| import 'common/repository_package.dart'; |
| |
| /// A command to run Dart unit tests for packages. |
| class TestCommand extends PackageLoopingCommand { |
| /// Creates an instance of the test command. |
| TestCommand( |
| Directory packagesDir, { |
| ProcessRunner processRunner = const ProcessRunner(), |
| Platform platform = const LocalPlatform(), |
| }) : super(packagesDir, processRunner: processRunner, platform: platform) { |
| argParser.addOption( |
| kEnableExperiment, |
| defaultsTo: '', |
| help: |
| 'Runs Dart unit tests in Dart VM with the given experiments enabled. ' |
| 'See https://github.com/dart-lang/sdk/blob/main/docs/process/experimental-flags.md ' |
| 'for details.', |
| ); |
| } |
| |
| @override |
| final String name = 'test'; |
| |
| @override |
| final String description = 'Runs the Dart tests for all packages.\n\n' |
| 'This command requires "flutter" to be in your path.'; |
| |
| @override |
| PackageLoopingType get packageLoopingType => |
| PackageLoopingType.includeAllSubpackages; |
| |
| @override |
| Future<PackageResult> runForPackage(RepositoryPackage package) async { |
| if (!package.testDirectory.existsSync()) { |
| return PackageResult.skip('No test/ directory.'); |
| } |
| |
| bool passed; |
| if (package.requiresFlutter()) { |
| passed = await _runFlutterTests(package); |
| } else { |
| passed = await _runDartTests(package); |
| } |
| return passed ? PackageResult.success() : PackageResult.fail(); |
| } |
| |
| /// Runs the Dart tests for a Flutter package, returning true on success. |
| Future<bool> _runFlutterTests(RepositoryPackage package) async { |
| final String experiment = getStringArg(kEnableExperiment); |
| |
| final int exitCode = await processRunner.runAndStream( |
| flutterCommand, |
| <String>[ |
| 'test', |
| '--color', |
| if (experiment.isNotEmpty) '--enable-experiment=$experiment', |
| // TODO(ditman): Remove this once all plugins are migrated to 'drive'. |
| if (pluginSupportsPlatform(platformWeb, package)) '--platform=chrome', |
| ], |
| workingDir: package.directory, |
| ); |
| return exitCode == 0; |
| } |
| |
| /// Runs the Dart tests for a non-Flutter package, returning true on success. |
| Future<bool> _runDartTests(RepositoryPackage package) async { |
| // Unlike `flutter test`, `pub run test` does not automatically get |
| // packages |
| int exitCode = await processRunner.runAndStream( |
| 'dart', |
| <String>['pub', 'get'], |
| workingDir: package.directory, |
| ); |
| if (exitCode != 0) { |
| printError('Unable to fetch dependencies.'); |
| return false; |
| } |
| |
| final String experiment = getStringArg(kEnableExperiment); |
| |
| exitCode = await processRunner.runAndStream( |
| 'dart', |
| <String>[ |
| 'run', |
| if (experiment.isNotEmpty) '--enable-experiment=$experiment', |
| 'test', |
| ], |
| workingDir: package.directory, |
| ); |
| |
| return exitCode == 0; |
| } |
| } |