| // 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()]; |
| } |