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