| // Copyright (c) 2012, 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:io"); |
| #import("dart:isolate"); |
| #import("../../../tools/testing/dart/test_runner.dart"); |
| #import("../../../tools/testing/dart/status_file_parser.dart"); |
| #import("../../../tools/testing/dart/test_options.dart"); |
| #source("process_test_util.dart"); |
| |
| class TestController { |
| static const int numTests = 4; |
| static int numCompletedTests = 0; |
| |
| // Used as TestCase.completedCallback. |
| static processCompletedTest(TestCase testCase) { |
| TestOutput output = testCase.output; |
| print("Test: ${testCase.commands.last.commandLine}"); |
| if (output.unexpectedOutput) { |
| throw "Unexpected output: ${output.result}"; |
| } |
| print("stdout: "); |
| for (var line in output.stdout) print(line); |
| print("stderr: "); |
| for (var line in output.stderr) print(line); |
| |
| print("Time: ${output.time}"); |
| print("Exit code: ${output.exitCode}"); |
| |
| ++numCompletedTests; |
| print("$numCompletedTests/$numTests"); |
| if (numCompletedTests == numTests) { |
| print("test_runner_test.dart PASSED"); |
| } |
| } |
| } |
| |
| TestCase MakeTestCase(String testName, List<String> expectations) { |
| var configuration = new TestOptionsParser().parse(['--timeout', '2'])[0]; |
| return new TestCase(testName, |
| [new Command(new Options().executable, |
| <String>[new Options().script, |
| testName])], |
| configuration, |
| TestController.processCompletedTest, |
| new Set<String>.from(expectations)); |
| } |
| |
| void testTestRunner() { |
| new RunningProcess(MakeTestCase("pass", [PASS])).start(); |
| new RunningProcess(MakeTestCase("fail", [FAIL])).start(); |
| new RunningProcess(MakeTestCase("timeout", [TIMEOUT])).start(); |
| |
| // The crash test sometimes times out. Run it with a large timeout to help |
| // diagnose the delay. |
| // The test loads a new executable, which may sometimes take a long time. |
| // It involves a wait on the VM event loop, and possible system delays. |
| var configuration = new TestOptionsParser().parse(['--timeout', '60'])[0]; |
| new RunningProcess(new TestCase("CrashTest", |
| [new Command(getProcessTestFileName(), |
| const ["0", "0", "1", "1"])], |
| configuration, |
| TestController.processCompletedTest, |
| new Set<String>.from([CRASH]))).start(); |
| Expect.equals(4, TestController.numTests); |
| // Test that the test runner throws an exception if a test with |
| // expectation SKIP is run. The RunningProcess constructor must throw |
| // the exception synchronously, for it to be caught here at the call site. |
| Expect.throws(new RunningProcess(MakeTestCase("pass", [SKIP])).start); |
| } |
| |
| void main() { |
| // Run the test_runner_test if there are no command-line options. |
| // Otherwise, run one of the component tests that always pass, |
| // fail, or timeout. |
| var arguments = new Options().arguments; |
| if (arguments.isEmpty) { |
| testTestRunner(); |
| } else { |
| switch (arguments[0]) { |
| case 'pass': |
| return; |
| case 'fail': |
| Expect.fail("This test always fails, to test the test scripts."); |
| break; |
| case 'timeout': |
| // Run for 10 seconds, then exit. This tests a 2 second timeout. |
| new Timer(10 * 1000, (t){ }); |
| break; |
| default: |
| throw "Unknown option ${arguments[0]} passed to test_runner_test"; |
| } |
| } |
| } |