| // 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. |
| |
| library isolate.test.ports_test; |
| |
| import "dart:async"; |
| import "dart:isolate"; |
| |
| import "package:isolate/ports.dart"; |
| import "package:test/test.dart"; |
| |
| const Duration MS = const Duration(milliseconds: 1); |
| |
| main() { |
| group("SingleCallbackPort", testSingleCallbackPort); |
| group("SingleCompletePort", testSingleCompletePort); |
| group("SingleResponseFuture", testSingleResponseFuture); |
| group("SingleResponseFuture", testSingleResultFuture); |
| group("SingleResponseChannel", testSingleResponseChannel); |
| } |
| |
| void testSingleCallbackPort() { |
| test("Value", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCallbackPort(completer.complete); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("FirstValue", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCallbackPort(completer.complete); |
| p.send(42); |
| p.send(37); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| test("Value", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCallbackPort(completer.complete); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("ValueBeforeTimeout", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCallbackPort(completer.complete, timeout: MS * 500); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("Timeout", () { |
| Completer completer = new Completer.sync(); |
| singleCallbackPort(completer.complete, timeout: MS * 100, timeoutValue: 37); |
| return completer.future.then((v) { |
| expect(v, 37); |
| }); |
| }); |
| |
| test("TimeoutFirst", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCallbackPort(completer.complete, |
| timeout: MS * 100, timeoutValue: 37); |
| new Timer(MS * 500, () => p.send(42)); |
| return completer.future.then((v) { |
| expect(v, 37); |
| }); |
| }); |
| } |
| |
| void testSingleCompletePort() { |
| test("Value", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("ValueCallback", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, callback: (v) { |
| expect(42, v); |
| return 87; |
| }); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 87); |
| }); |
| }); |
| |
| test("ValueCallbackFuture", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, callback: (v) { |
| expect(42, v); |
| return new Future.delayed(MS * 500, () => 88); |
| }); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 88); |
| }); |
| }); |
| |
| test("ValueCallbackThrows", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, callback: (v) { |
| expect(42, v); |
| throw 89; |
| }); |
| p.send(42); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 89); |
| }); |
| }); |
| |
| test("ValueCallbackThrowsFuture", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, callback: (v) { |
| expect(42, v); |
| return new Future.error(90); |
| }); |
| p.send(42); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 90); |
| }); |
| }); |
| |
| test("FirstValue", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer); |
| p.send(42); |
| p.send(37); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("FirstValueCallback", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, callback: (v) { |
| expect(v, 42); |
| return 87; |
| }); |
| p.send(42); |
| p.send(37); |
| return completer.future.then((v) { |
| expect(v, 87); |
| }); |
| }); |
| |
| test("ValueBeforeTimeout", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = singleCompletePort(completer, timeout: MS * 500); |
| p.send(42); |
| return completer.future.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("Timeout", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, timeout: MS * 100); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e is TimeoutException, isTrue); |
| }); |
| }); |
| |
| test("TimeoutCallback", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, timeout: MS * 100, onTimeout: () => 87); |
| return completer.future.then((v) { |
| expect(v, 87); |
| }); |
| }); |
| |
| test("TimeoutCallbackThrows", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, timeout: MS * 100, onTimeout: () => throw 91); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 91); |
| }); |
| }); |
| |
| test("TimeoutCallbackFuture", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, |
| timeout: MS * 100, onTimeout: () => new Future.value(87)); |
| return completer.future.then((v) { |
| expect(v, 87); |
| }); |
| }); |
| |
| test("TimeoutCallbackThrowsFuture", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, |
| timeout: MS * 100, onTimeout: () => new Future.error(92)); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 92); |
| }); |
| }); |
| |
| test("TimeoutCallbackSLow", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, |
| timeout: MS * 100, |
| onTimeout: () => new Future.delayed(MS * 500, () => 87)); |
| return completer.future.then((v) { |
| expect(v, 87); |
| }); |
| }); |
| |
| test("TimeoutCallbackThrowsSlow", () { |
| Completer completer = new Completer.sync(); |
| singleCompletePort(completer, |
| timeout: MS * 100, |
| onTimeout: () => new Future.delayed(MS * 500, () => throw 87)); |
| return completer.future.then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 87); |
| }); |
| }); |
| |
| test("TimeoutFirst", () { |
| Completer completer = new Completer.sync(); |
| SendPort p = |
| singleCompletePort(completer, timeout: MS * 100, onTimeout: () => 37); |
| new Timer(MS * 500, () => p.send(42)); |
| return completer.future.then((v) { |
| expect(v, 37); |
| }); |
| }); |
| } |
| |
| void testSingleResponseFuture() { |
| test("FutureValue", () { |
| return singleResponseFuture((SendPort p) { |
| p.send(42); |
| }).then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("FutureValueFirst", () { |
| return singleResponseFuture((SendPort p) { |
| p.send(42); |
| p.send(37); |
| }).then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("FutureError", () { |
| return singleResponseFuture((SendPort p) { |
| throw 93; |
| }).then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e, 93); |
| }); |
| }); |
| |
| test("FutureTimeout", () { |
| return singleResponseFuture((SendPort p) { |
| // no-op. |
| }, timeout: MS * 100) |
| .then((v) { |
| expect(v, null); |
| }); |
| }); |
| |
| test("FutureTimeoutValue", () { |
| return singleResponseFuture((SendPort p) { |
| // no-op. |
| }, timeout: MS * 100, timeoutValue: 42) |
| .then((v) { |
| expect(v, 42); |
| }); |
| }); |
| } |
| |
| void testSingleResultFuture() { |
| test("Value", () { |
| return singleResultFuture((SendPort p) { |
| sendFutureResult(new Future.value(42), p); |
| }).then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("ValueFirst", () { |
| return singleResultFuture((SendPort p) { |
| sendFutureResult(new Future.value(42), p); |
| sendFutureResult(new Future.value(37), p); |
| }).then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("Error", () { |
| return singleResultFuture((SendPort p) { |
| sendFutureResult(new Future.error(94), p); |
| }).then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e is RemoteError, isTrue); |
| }); |
| }); |
| |
| test("ErrorFirst", () { |
| return singleResultFuture((SendPort p) { |
| sendFutureResult(new Future.error(95), p); |
| sendFutureResult(new Future.error(96), p); |
| }).then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e is RemoteError, isTrue); |
| }); |
| }); |
| |
| test("Error", () { |
| return singleResultFuture((SendPort p) { |
| throw 93; |
| }).then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e is RemoteError, isTrue); |
| }); |
| }); |
| |
| test("Timeout", () { |
| return singleResultFuture((SendPort p) { |
| // no-op. |
| }, timeout: MS * 100) |
| .then((v) { |
| fail("unreachable"); |
| }, onError: (e, s) { |
| expect(e is TimeoutException, isTrue); |
| }); |
| }); |
| |
| test("TimeoutValue", () { |
| return singleResultFuture((SendPort p) { |
| // no-op. |
| }, timeout: MS * 100, onTimeout: () => 42).then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutError", () { |
| return singleResultFuture((SendPort p) { |
| // no-op. |
| }, timeout: MS * 100, onTimeout: () => throw 97).then((v) { |
| expect(v, 42); |
| }, onError: (e, s) { |
| expect(e, 97); |
| }); |
| }); |
| } |
| |
| void testSingleResponseChannel() { |
| test("Value", () { |
| var channel = new SingleResponseChannel(); |
| channel.port.send(42); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("ValueFirst", () { |
| var channel = new SingleResponseChannel(); |
| channel.port.send(42); |
| channel.port.send(37); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("ValueCallback", () { |
| var channel = new SingleResponseChannel(callback: (v) => 2 * v); |
| channel.port.send(42); |
| return channel.result.then((v) { |
| expect(v, 84); |
| }); |
| }); |
| |
| test("ErrorCallback", () { |
| var channel = new SingleResponseChannel(callback: (v) => throw 42); |
| channel.port.send(37); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("AsyncValueCallback", () { |
| var channel = |
| new SingleResponseChannel(callback: (v) => new Future.value(2 * v)); |
| channel.port.send(42); |
| return channel.result.then((v) { |
| expect(v, 84); |
| }); |
| }); |
| |
| test("AsyncErrorCallback", () { |
| var channel = |
| new SingleResponseChannel(callback: (v) => new Future.error(42)); |
| channel.port.send(37); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("Timeout", () { |
| var channel = new SingleResponseChannel(timeout: MS * 100); |
| return channel.result.then((v) { |
| expect(v, null); |
| }); |
| }); |
| |
| test("TimeoutThrow", () { |
| var channel = |
| new SingleResponseChannel(timeout: MS * 100, throwOnTimeout: true); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v is TimeoutException, isTrue); |
| }); |
| }); |
| |
| test("TimeoutThrowOnTimeoutAndValue", () { |
| var channel = new SingleResponseChannel( |
| timeout: MS * 100, |
| throwOnTimeout: true, |
| onTimeout: () => 42, |
| timeoutValue: 42); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v is TimeoutException, isTrue); |
| }); |
| }); |
| |
| test("TimeoutOnTimeout", () { |
| var channel = |
| new SingleResponseChannel(timeout: MS * 100, onTimeout: () => 42); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutOnTimeoutAndValue", () { |
| var channel = new SingleResponseChannel( |
| timeout: MS * 100, onTimeout: () => 42, timeoutValue: 37); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutValue", () { |
| var channel = |
| new SingleResponseChannel(timeout: MS * 100, timeoutValue: 42); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutOnTimeoutError", () { |
| var channel = |
| new SingleResponseChannel(timeout: MS * 100, onTimeout: () => throw 42); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutOnTimeoutAsync", () { |
| var channel = new SingleResponseChannel( |
| timeout: MS * 100, onTimeout: () => new Future.value(42)); |
| return channel.result.then((v) { |
| expect(v, 42); |
| }); |
| }); |
| |
| test("TimeoutOnTimeoutAsyncError", () { |
| var channel = new SingleResponseChannel( |
| timeout: MS * 100, onTimeout: () => new Future.error(42)); |
| return channel.result.then((v) { |
| fail("unreachable"); |
| }, onError: (v, s) { |
| expect(v, 42); |
| }); |
| }); |
| } |