blob: f4f409cccaae32abad33677d9a90582da901656d [file] [log] [blame] [edit]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
import 'package:expect/expect.dart';
import "package:test_runner/src/command.dart";
import "package:test_runner/src/process_queue.dart";
void main(List<String> args) async {
// test runner won't pass any args, but BatchRunnerProcess passes ['--batch'].
args.isEmpty ? await test() : dummy();
}
late List<String> _testArguments;
Future<void> test() async {
final batchRunner = BatchRunnerProcess.byIdentifier('dummy', 1);
final command = DummyProcessCommand('dummy batch runner', Platform.executable,
[Platform.script.toFilePath()]);
final incompatibleCommand = DummyProcessCommand(
'dummy batch runner',
Platform.executable,
[Platform.script.toFilePath()],
{'ENV_VAR': 'VALUE'});
try {
print('run commands');
Expect.isFalse(batchRunner.hasRunningProcess);
Expect.isFalse(batchRunner.isCompatibleRunner(command));
await runCommand(batchRunner, command, 'PASS', 0);
Expect.isTrue(batchRunner.hasRunningProcess);
Expect.isFalse(batchRunner.isCompatibleRunner(incompatibleCommand));
await runCommand(batchRunner, incompatibleCommand, 'PASS', 0);
Expect.isTrue(batchRunner.hasRunningProcess);
Expect.isFalse(batchRunner.isCompatibleRunner(command));
await runCommand(batchRunner, command, 'FAIL', 1);
Expect.isTrue(batchRunner.hasRunningProcess);
Expect.isTrue(batchRunner.isCompatibleRunner(command));
await runCommand(batchRunner, command, 'TIMEOUT', 1);
Expect.isTrue(batchRunner.hasRunningProcess);
await runCommand(batchRunner, command, 'PARSE_FAIL', parseFailExitCode);
Expect.isTrue(batchRunner.hasRunningProcess);
await runCommand(batchRunner, command, 'BATCH_RUNNER_CRASH',
unhandledCompilerExceptionExitCode);
Expect.isFalse(batchRunner.hasRunningProcess);
await runCommand(
batchRunner, command, 'CRASH', unhandledCompilerExceptionExitCode);
Expect.isTrue(batchRunner.hasRunningProcess);
} finally {
print('terminate');
await BatchRunnerProcess.terminateAll();
Expect.isFalse(batchRunner.hasRunningProcess);
}
print('exiting');
}
Future<void> runCommand(BatchRunnerProcess batchRunner, ProcessCommand command,
String result, int expectedExitCode) async {
_testArguments = [result];
final output = await batchRunner.runCommand(command, 10);
Expect.equals('stdout $result\n', utf8.decode(output.stdout),
"$result: unexpected test stdout");
if (result == 'BATCH_RUNNER_CRASH') {
Expect.contains('Unhandled exception:\nException: Dummy crashed!\n',
utf8.decode(output.stderr), "$result: unexpected test stderr");
} else {
Expect.equals('stderr $result\n', utf8.decode(output.stderr),
"$result: unexpected test stderr");
}
Expect.equals(
expectedExitCode, output.exitCode, "$result: unexpected exit code");
Expect.equals(result == 'TIMEOUT', output.hasTimedOut);
}
void dummy() {
String? testArguments;
while ((testArguments = stdin.readLineSync()) != null) {
stdout.writeln('stdout $testArguments');
stdout.writeln('>>> BATCH ignored');
if (testArguments == 'BATCH_RUNNER_CRASH') {
throw Exception('Dummy crashed!');
}
stderr.writeln('stderr $testArguments');
stderr.writeln('>>> EOF STDERR');
stdout.writeln('>>> TEST $testArguments');
}
}
class DummyProcessCommand extends ProcessCommand {
DummyProcessCommand(super.displayName, super.executable, super.arguments,
[super.environmentOverrides]);
@override
List<String> get arguments => _testArguments;
@override
List<String> get batchArguments => [Platform.script.toFilePath()];
}