| Index: test/runner/isolate_listener_test.dart
|
| diff --git a/test/runner/isolate_listener_test.dart b/test/runner/isolate_listener_test.dart
|
| deleted file mode 100644
|
| index e7b6625d49f9c0ad508d8bc53f2407285242b79d..0000000000000000000000000000000000000000
|
| --- a/test/runner/isolate_listener_test.dart
|
| +++ /dev/null
|
| @@ -1,412 +0,0 @@
|
| -// Copyright (c) 2015, 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.
|
| -
|
| -@TestOn("vm")
|
| -
|
| -import 'dart:async';
|
| -import 'dart:isolate';
|
| -
|
| -import 'package:test/src/backend/group.dart';
|
| -import 'package:test/src/backend/invoker.dart';
|
| -import 'package:test/src/backend/live_test.dart';
|
| -import 'package:test/src/backend/metadata.dart';
|
| -import 'package:test/src/backend/state.dart';
|
| -import 'package:test/src/backend/suite.dart';
|
| -import 'package:test/src/runner/vm/isolate_listener.dart';
|
| -import 'package:test/src/runner/vm/isolate_test.dart';
|
| -import 'package:test/src/util/remote_exception.dart';
|
| -import 'package:test/test.dart';
|
| -
|
| -import '../utils.dart';
|
| -
|
| -/// An isolate that's been spun up for the current test.
|
| -///
|
| -/// This is tracked so that it can be killed once the test is done.
|
| -Isolate _isolate;
|
| -
|
| -/// A live test that's running for the current test.
|
| -///
|
| -/// This is tracked so that it can be closed once the test is done.
|
| -LiveTest _liveTest;
|
| -
|
| -void main() {
|
| - tearDown(() {
|
| - if (_isolate != null) _isolate.kill();
|
| - _isolate = null;
|
| -
|
| - if (_liveTest != null) _liveTest.close();
|
| - _liveTest = null;
|
| - });
|
| -
|
| - test("sends a list of available tests and groups on startup", () async {
|
| - var response = await (await _spawnIsolate(_successfulTests)).first;
|
| - expect(response, containsPair("type", "success"));
|
| - expect(response, contains("root"));
|
| -
|
| - var root = response["root"];
|
| - expect(root, containsPair("type", "group"));
|
| - expect(root, containsPair("name", null));
|
| -
|
| - var tests = root["entries"];
|
| - expect(tests, hasLength(3));
|
| - expect(tests[0], containsPair("name", "successful 1"));
|
| - expect(tests[1], containsPair("name", "successful 2"));
|
| - expect(tests[2], containsPair("type", "group"));
|
| - expect(tests[2], containsPair("name", "successful"));
|
| - expect(tests[2], contains("entries"));
|
| - expect(tests[2]["entries"][0], containsPair("name", "successful 3"));
|
| - });
|
| -
|
| - test("waits for a returned future sending a response", () async {
|
| - var response = await (await _spawnIsolate(_asyncTests)).first;
|
| - expect(response, containsPair("type", "success"));
|
| - expect(response, contains("root"));
|
| -
|
| - var tests = response["root"]["entries"];
|
| - expect(tests, hasLength(3));
|
| - expect(tests[0], containsPair("name", "successful 1"));
|
| - expect(tests[1], containsPair("name", "successful 2"));
|
| - expect(tests[2], containsPair("name", "successful 3"));
|
| - });
|
| -
|
| - test("sends an error response if loading fails", () async {
|
| - var response = await (await _spawnIsolate(_loadError)).first;
|
| - expect(response, containsPair("type", "error"));
|
| - expect(response, contains("error"));
|
| -
|
| - var error = RemoteException.deserialize(response["error"]).error;
|
| - expect(error.message, equals("oh no"));
|
| - expect(error.type, equals("String"));
|
| - });
|
| -
|
| - test("sends an error response on a NoSuchMethodError", () async {
|
| - var response = await (await _spawnIsolate(_noSuchMethodError)).first;
|
| - expect(response, containsPair("type", "loadException"));
|
| - expect(response,
|
| - containsPair("message", "No top-level main() function defined."));
|
| - });
|
| -
|
| - test("sends an error response on non-function main", () async {
|
| - var response = await (await _spawnIsolate(_nonFunction)).first;
|
| - expect(response, containsPair("type", "loadException"));
|
| - expect(response,
|
| - containsPair("message", "Top-level main getter is not a function."));
|
| - });
|
| -
|
| - test("sends an error response on wrong-arity main", () async {
|
| - var response = await (await _spawnIsolate(_wrongArity)).first;
|
| - expect(response, containsPair("type", "loadException"));
|
| - expect(
|
| - response,
|
| - containsPair(
|
| - "message",
|
| - "Top-level main() function takes arguments."));
|
| - });
|
| -
|
| - group("in a successful test", () {
|
| - test("the state changes from pending to running to complete", () async {
|
| - var liveTest = await _isolateTest(_successfulTests);
|
| - liveTest.onError.listen(expectAsync((_) {}, count: 0));
|
| -
|
| - expect(liveTest.state,
|
| - equals(const State(Status.pending, Result.success)));
|
| -
|
| - var future = liveTest.run();
|
| - expect(liveTest.state,
|
| - equals(const State(Status.running, Result.success)));
|
| -
|
| - await future;
|
| - expect(liveTest.state,
|
| - equals(const State(Status.complete, Result.success)));
|
| - });
|
| -
|
| - test("onStateChange fires for each state change", () async {
|
| - var liveTest = await _isolateTest(_successfulTests);
|
| - liveTest.onError.listen(expectAsync((_) {}, count: 0));
|
| -
|
| - var first = true;
|
| - liveTest.onStateChange.listen(expectAsync((state) {
|
| - if (first) {
|
| - expect(state.status, equals(Status.running));
|
| - first = false;
|
| - } else {
|
| - expect(state.status, equals(Status.complete));
|
| - }
|
| - expect(state.result, equals(Result.success));
|
| - }, count: 2, max: 2));
|
| -
|
| - await liveTest.run();
|
| - });
|
| - });
|
| -
|
| - group("in a test with failures", () {
|
| - test("a failure reported causes the test to fail", () async {
|
| - var liveTest = await _isolateTest(_failingTest);
|
| - expectSingleFailure(liveTest);
|
| - await liveTest.run();
|
| - });
|
| -
|
| - test("a failure reported asynchronously after the test causes it to error",
|
| - () async {
|
| - var liveTest = await _isolateTest(_failAfterSucceedTest);
|
| - expectStates(liveTest, [
|
| - const State(Status.running, Result.success),
|
| - const State(Status.complete, Result.success),
|
| - const State(Status.complete, Result.failure),
|
| - const State(Status.complete, Result.error)
|
| - ]);
|
| -
|
| - expectErrors(liveTest, [(error) {
|
| - expect(lastState,
|
| - equals(const State(Status.complete, Result.failure)));
|
| - expect(error, isTestFailure("oh no"));
|
| - }, (error) {
|
| - expect(lastState, equals(const State(Status.complete, Result.error)));
|
| - expect(error, isRemoteException(
|
| - "This test failed after it had already completed. Make sure to "
|
| - "use [expectAsync]\n"
|
| - "or the [completes] matcher when testing async code."));
|
| - }]);
|
| -
|
| - await liveTest.run();
|
| - });
|
| -
|
| - test("multiple asynchronous failures are reported", () async {
|
| - var liveTest = await _isolateTest(_multiFailTest);
|
| - expectStates(liveTest, [
|
| - const State(Status.running, Result.success),
|
| - const State(Status.complete, Result.failure)
|
| - ]);
|
| -
|
| - expectErrors(liveTest, [(error) {
|
| - expect(lastState.status, equals(Status.complete));
|
| - expect(error, isTestFailure("one"));
|
| - }, (error) {
|
| - expect(error, isTestFailure("two"));
|
| - }, (error) {
|
| - expect(error, isTestFailure("three"));
|
| - }, (error) {
|
| - expect(error, isTestFailure("four"));
|
| - }]);
|
| -
|
| - await liveTest.run();
|
| - });
|
| - });
|
| -
|
| - group("in a test with errors", () {
|
| - test("an error reported causes the test to error", () async {
|
| - var liveTest = await _isolateTest(_errorTest);
|
| - expectStates(liveTest, [
|
| - const State(Status.running, Result.success),
|
| - const State(Status.complete, Result.error)
|
| - ]);
|
| -
|
| - expectErrors(liveTest, [(error) {
|
| - expect(lastState.status, equals(Status.complete));
|
| - expect(error, isRemoteException("oh no"));
|
| - }]);
|
| -
|
| - await liveTest.run();
|
| - });
|
| -
|
| - test("an error reported asynchronously after the test causes it to error",
|
| - () async {
|
| - var liveTest = await _isolateTest(_errorAfterSucceedTest);
|
| - expectStates(liveTest, [
|
| - const State(Status.running, Result.success),
|
| - const State(Status.complete, Result.success),
|
| - const State(Status.complete, Result.error)
|
| - ]);
|
| -
|
| - expectErrors(liveTest, [(error) {
|
| - expect(lastState,
|
| - equals(const State(Status.complete, Result.error)));
|
| - expect(error, isRemoteException("oh no"));
|
| - }, (error) {
|
| - expect(error, isRemoteException(
|
| - "This test failed after it had already completed. Make sure to "
|
| - "use [expectAsync]\n"
|
| - "or the [completes] matcher when testing async code."));
|
| - }]);
|
| -
|
| - await liveTest.run();
|
| - });
|
| -
|
| - test("multiple asynchronous errors are reported", () async {
|
| - var liveTest = await _isolateTest(_multiErrorTest);
|
| - expectStates(liveTest, [
|
| - const State(Status.running, Result.success),
|
| - const State(Status.complete, Result.error)
|
| - ]);
|
| -
|
| - expectErrors(liveTest, [(error) {
|
| - expect(lastState.status, equals(Status.complete));
|
| - expect(error, isRemoteException("one"));
|
| - }, (error) {
|
| - expect(error, isRemoteException("two"));
|
| - }, (error) {
|
| - expect(error, isRemoteException("three"));
|
| - }, (error) {
|
| - expect(error, isRemoteException("four"));
|
| - }]);
|
| -
|
| - await liveTest.run();
|
| - });
|
| - });
|
| -
|
| - test("forwards a test's prints", () async {
|
| - var liveTest = await _isolateTest(_printTest);
|
| - expect(liveTest.onPrint.take(2).toList(),
|
| - completion(equals(["Hello,", "world!"])));
|
| -
|
| - await liveTest.run();
|
| - });
|
| -}
|
| -
|
| -/// Loads the first test defined in [entryPoint] in another isolate.
|
| -///
|
| -/// This test will be automatically closed when the test is finished.
|
| -Future<LiveTest> _isolateTest(void entryPoint(SendPort sendPort)) async {
|
| - var response = await (await _spawnIsolate(entryPoint)).first;
|
| - expect(response, containsPair("type", "success"));
|
| -
|
| - var testMap = response["root"]["entries"].first;
|
| - expect(testMap, containsPair("type", "test"));
|
| - var metadata = new Metadata.deserialize(testMap["metadata"]);
|
| - var test = new IsolateTest(testMap["name"], metadata, testMap["sendPort"]);
|
| - var suite = new Suite(new Group.root([test]));
|
| - _liveTest = test.load(suite);
|
| - return _liveTest;
|
| -}
|
| -
|
| -/// Spawns an isolate from [entryPoint], sends it a new [SendPort], and returns
|
| -/// the corresponding [ReceivePort].
|
| -///
|
| -/// This isolate will be automatically killed when the test is finished.
|
| -Future<ReceivePort> _spawnIsolate(void entryPoint(SendPort sendPort)) async {
|
| - var receivePort = new ReceivePort();
|
| - var isolate = await Isolate.spawn(entryPoint, receivePort.sendPort);
|
| - _isolate = isolate;
|
| - return receivePort;
|
| -}
|
| -
|
| -/// An isolate entrypoint that throws immediately.
|
| -void _loadError(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () => throw 'oh no');
|
| -}
|
| -
|
| -/// An isolate entrypoint that throws a NoSuchMethodError.
|
| -void _noSuchMethodError(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () =>
|
| - throw new NoSuchMethodError(null, #main, [], {}));
|
| -}
|
| -
|
| -/// An isolate entrypoint that returns a non-function.
|
| -void _nonFunction(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => null);
|
| -}
|
| -
|
| -/// An isolate entrypoint that returns a function with the wrong arity.
|
| -void _wrongArity(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => (_) {});
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines three tests that succeed.
|
| -void _successfulTests(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("successful 1", () {});
|
| - test("successful 2", () {});
|
| - group("successful", () => test("3", () {}));
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines three tests asynchronously.
|
| -void _asyncTests(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - return new Future(() {
|
| - test("successful 1", () {});
|
| -
|
| - return new Future(() {
|
| - test("successful 2", () {});
|
| -
|
| - return new Future(() {
|
| - test("successful 3", () {});
|
| - });
|
| - });
|
| - });
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that fails.
|
| -void _failingTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("failure", () => throw new TestFailure('oh no'));
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that fails after succeeding.
|
| -void _failAfterSucceedTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("fail after succeed", () {
|
| - pumpEventQueue().then((_) {
|
| - throw new TestFailure('oh no');
|
| - });
|
| - });
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that fails multiple times.
|
| -void _multiFailTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("multiple failures", () {
|
| - Invoker.current.addOutstandingCallback();
|
| - new Future(() => throw new TestFailure("one"));
|
| - new Future(() => throw new TestFailure("two"));
|
| - new Future(() => throw new TestFailure("three"));
|
| - new Future(() => throw new TestFailure("four"));
|
| - });
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that errors.
|
| -void _errorTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("error", () => throw 'oh no');
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that errors after succeeding.
|
| -void _errorAfterSucceedTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("error after succeed", () {
|
| - pumpEventQueue().then((_) {
|
| - throw 'oh no';
|
| - });
|
| - });
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that errors multiple times.
|
| -void _multiErrorTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("multiple errors", () {
|
| - Invoker.current.addOutstandingCallback();
|
| - new Future(() => throw "one");
|
| - new Future(() => throw "two");
|
| - new Future(() => throw "three");
|
| - new Future(() => throw "four");
|
| - });
|
| - });
|
| -}
|
| -
|
| -/// An isolate entrypoint that defines a test that prints twice.
|
| -void _printTest(SendPort sendPort) {
|
| - IsolateListener.start(sendPort, new Metadata(), () => () {
|
| - test("prints", () {
|
| - print("Hello,");
|
| - return new Future(() => print("world!"));
|
| - });
|
| - });
|
| -}
|
| -
|
|
|