Use pub embedding to run test in dart test

Now a `pub get` will be run implicitly if needed.
(This happens in getExecutableForCommand from the pub package).

Change-Id: I9eca9b6d8761a3035f21c0f86653c87710b9d229
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/171281
Commit-Queue: Sigurd Meldgaard <sigurdm@google.com>
Reviewed-by: Jonas Jensen <jonasfj@google.com>
This commit is contained in:
Sigurd Meldgaard 2020-11-10 14:42:25 +00:00 committed by commit-bot@chromium.org
parent d09c73d7fb
commit eb5fea9f3d
2 changed files with 65 additions and 125 deletions

View file

@ -5,10 +5,9 @@
import 'dart:async';
import 'package:args/args.dart';
import 'package:pub/pub.dart';
import '../core.dart';
import '../experiments.dart';
import '../sdk.dart';
import '../vm_interop_handler.dart';
/// Implement `dart test`.
@ -19,110 +18,38 @@ class TestCommand extends DartdevCommand {
TestCommand() : super(cmdName, 'Run tests in this package.');
// This argument parser is here solely to ensure that VM specific flags are
// provided before any command and to provide a more consistent help message
// with the rest of the tool.
@override
final ArgParser argParser = ArgParser.allowAnything();
@override
void printUsage() {
_runImpl(['-h']);
ArgParser createArgParser() {
return ArgParser.allowAnything();
}
@override
FutureOr<int> run() async {
return _runImpl(argResults.arguments.toList());
}
int _runImpl(List<String> testArgs) {
if (!Sdk.checkArtifactExists(sdk.pubSnapshot)) {
return 255;
if (argResults.rest.contains('-h') || argResults.rest.contains('--help')) {
printUsage();
return 0;
}
final pubSnapshot = sdk.pubSnapshot;
bool isHelpCommand = testArgs.contains('--help') || testArgs.contains('-h');
// Check for no pubspec.yaml file.
if (!project.hasPubspecFile) {
_printNoPubspecMessage(isHelpCommand);
return 65;
}
// Handle the case of no .dart_tool/package_config.json file.
if (!project.hasPackageConfigFile) {
_printRunPubGetInstructions(isHelpCommand);
return 65;
}
// "Could not find package "test". Did you forget to add a dependency?"
if (!project.packageConfig.hasDependency('test')) {
_printMissingDepInstructions(isHelpCommand);
return 65;
}
List<String> enabledExperiments = [];
if (!(testArgs.length == 1 && testArgs[0] == '-h')) {
enabledExperiments = argResults.enabledExperiments;
}
final args = [
'run',
if (enabledExperiments.isNotEmpty)
'--$experimentFlagName=${enabledExperiments.join(',')}',
'test',
...testArgs,
];
log.trace('$pubSnapshot ${args.join(' ')}');
VmInteropHandler.run(pubSnapshot, args);
return 0;
}
void _printNoPubspecMessage(bool wasHelpCommand) {
log.stdout('''
log.stdout('''
No pubspec.yaml file found; please run this command from the root of your project.
''');
if (wasHelpCommand) {
log.stdout(_terseHelp);
log.stdout('');
printUsage();
return 65;
}
log.stdout(_usageHelp);
}
void _printRunPubGetInstructions(bool wasHelpCommand) {
log.stdout('''
No .dart_tool/package_config.json file found, please run 'dart pub get'.
''');
if (wasHelpCommand) {
log.stdout(_terseHelp);
log.stdout('');
try {
final testExecutable = await getExecutableForCommand('test:test');
log.trace('dart $testExecutable ${argResults.rest.join(' ')}');
VmInteropHandler.run(testExecutable, argResults.rest);
return 0;
} on CommandResolutionFailedException catch (e) {
print(e.message);
print('You need to add a dependency on package:test.');
print('Try running `dart pub add test`.');
return 65;
}
log.stdout(_usageHelp);
}
void _printMissingDepInstructions(bool wasHelpCommand) {
final ansi = log.ansi;
log.stdout('''
No dependency on package:test found. In order to run tests, you need to add a dependency
on package:test in your pubspec.yaml file:
${ansi.emphasized('dev_dependencies:\n test: ^1.0.0')}
See https://pub.dev/packages/test/install for more information on adding package:test,
and https://dart.dev/guides/testing for general information on testing.
''');
if (wasHelpCommand) {
log.stdout(_terseHelp);
log.stdout('');
}
log.stdout(_usageHelp);
}
}
const String _terseHelp = 'Run tests in this package.';
const String _usageHelp = 'Usage: dart test [files or directories...]';

View file

@ -21,10 +21,7 @@ void defineTest() {
test('--help', () {
p = project();
var result = p.runSync('pub', ['get']);
expect(result.exitCode, 0);
result = p.runSync('test', ['--help']);
final result = p.runSync('test', ['--help']);
expect(result.exitCode, 0);
expect(result.stdout, contains(' tests in this package'));
@ -34,10 +31,7 @@ void defineTest() {
test('dart help test', () {
p = project();
var result = p.runSync('pub', ['get']);
expect(result.exitCode, 0);
result = p.runSync('help', ['test']);
final result = p.runSync('help', ['test']);
expect(result.exitCode, 0);
expect(result.stdout, contains(' tests in this package'));
@ -49,22 +43,30 @@ void defineTest() {
var pubspec = File(path.join(p.dirPath, 'pubspec.yaml'));
pubspec.deleteSync();
var result = p.runSync('help', ['test']);
var result = p.runSync('test', []);
expect(result.exitCode, 0);
expect(result.stdout, contains('No pubspec.yaml file found'));
expect(result.stderr, isEmpty);
expect(result.stdout, contains('No pubspec.yaml file found'));
expect(result.exitCode, 65);
});
test('no .dart_tool/package_config.json', () {
test('runs test', () {
p = project();
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
var result = p.runSync('help', ['test']);
void main() {
test('', () {
expect(1,1);
});
}
''');
expect(result.exitCode, 0);
expect(result.stdout,
contains('No .dart_tool/package_config.json file found'));
// An implicit `pub get` will happen.
final result = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
expect(result.stderr, isEmpty);
expect(result.stdout, contains('All tests passed!'));
expect(result.exitCode, 0);
});
test('no package:test dependency', () {
@ -74,16 +76,31 @@ name: ${p.name}
environment:
sdk: '>=2.10.0 <3.0.0'
''');
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
var result = p.runSync('pub', ['get']);
expect(result.exitCode, 0);
void main() {
test('', () {
expect(1,1);
});
}
''');
result = p.runSync('test', []);
expect(result.exitCode, 65);
final result = p.runSync('test', []);
expect(
result.stdout,
contains('In order to run tests, you need to add a dependency'),
contains('You need to add a dependency on package:test'),
);
expect(result.stderr, isEmpty);
expect(result.exitCode, 65);
final resultPubAdd = p.runSync('pub', ['add', 'test']);
expect(resultPubAdd.exitCode, 0);
final result2 = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
expect(result2.stderr, isEmpty);
expect(result2.stdout, contains('All tests passed!'));
expect(result2.exitCode, 0);
});
test('has package:test dependency', () {
@ -100,10 +117,7 @@ void main() {
}
''');
var result = p.runSync('pub', ['get']);
expect(result.exitCode, 0);
result = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
final result = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
expect(result.exitCode, 0);
expect(result.stdout, contains('All tests passed!'));
expect(result.stderr, isEmpty);
@ -123,11 +137,10 @@ void main() {
}
''');
var result = p.runSync('pub', ['get']);
expect(result.exitCode, 0);
result = p.runSync('--enable-experiment=non-nullable',
['test', '--no-color', '--reporter', 'expanded']);
final result = p.runSync(
'--enable-experiment=non-nullable',
['test', '--no-color', '--reporter', 'expanded'],
);
expect(result.exitCode, 1);
});
}