// 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/package_looping_command.dart'; import 'common/process_runner.dart'; import 'common/repository_package.dart'; const String _scriptName = 'run_tests.dart'; const String _legacyScriptName = 'run_tests.sh'; /// A command to run custom, package-local tests on packages. /// /// This is an escape hatch for adding tests that this tooling doesn't support. /// It should be used sparingly; prefer instead to add functionality to this /// tooling to eliminate the need for bespoke tests. class CustomTestCommand extends PackageLoopingCommand { /// Creates a custom test command instance. CustomTestCommand( Directory packagesDir, { ProcessRunner processRunner = const ProcessRunner(), Platform platform = const LocalPlatform(), }) : super(packagesDir, processRunner: processRunner, platform: platform); @override final String name = 'custom-test'; @override final String description = 'Runs package-specific custom tests defined in ' "a package's tool/$_scriptName file.\n\n" 'This command requires "dart" to be in your path.'; @override Future runForPackage(RepositoryPackage package) async { final File script = package.directory.childDirectory('tool').childFile(_scriptName); final File legacyScript = package.directory.childFile(_legacyScriptName); String? customSkipReason; bool ranTests = false; // Run the custom Dart script if presest. if (script.existsSync()) { // Ensure that dependencies are available. final int pubGetExitCode = await processRunner.runAndStream( 'dart', ['pub', 'get'], workingDir: package.directory); if (pubGetExitCode != 0) { return PackageResult.fail( ['Unable to get script dependencies']); } final int testExitCode = await processRunner.runAndStream( 'dart', ['run', 'tool/$_scriptName'], workingDir: package.directory); if (testExitCode != 0) { return PackageResult.fail(); } ranTests = true; } // Run the legacy script if present. if (legacyScript.existsSync()) { if (platform.isWindows) { customSkipReason = '$_legacyScriptName is not supported on Windows. ' 'Please migrate to $_scriptName.'; } else { final int exitCode = await processRunner.runAndStream( legacyScript.path, [], workingDir: package.directory); if (exitCode != 0) { return PackageResult.fail(); } ranTests = true; } } if (!ranTests) { return PackageResult.skip(customSkipReason ?? 'No custom tests'); } return PackageResult.success(); } }