blob: 6020a815859bc28b9c381fc5ae3c0aad43300179 [file] [log] [blame]
// Copyright (c) 2011, 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 future_timeout_test;
import 'dart:async';
import 'package:unittest/unittest.dart';
main() {
test("timeoutNoComplete", () {
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutCompleteAfterTimeout", () {
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
Timer timer = new Timer(const Duration(seconds: 1), () {
completer.complete(-1);
});
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutCompleteBeforeTimeout", () {
Completer completer = new Completer();
Timer timer = new Timer(const Duration(milliseconds: 5), () {
completer.complete(42);
});
Future timedOut = completer.future
.timeout(const Duration(seconds: 1), onTimeout: () => -1);
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutCompleteBeforeCreate", () {
Completer completer = new Completer.sync();
completer.complete(42);
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => -1);
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutThrows", () {
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5),
onTimeout: () {
throw "EXN1";
});
timedOut.catchError(expectAsync((e, s) {
expect(e, "EXN1");
}));
});
test("timeoutThrowAfterTimeout", () {
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
Timer timer = new Timer(const Duration(seconds: 1), () {
completer.completeError("EXN2");
});
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutThrowBeforeTimeout", () {
Completer completer = new Completer();
Timer timer = new Timer(const Duration(milliseconds: 5), () {
completer.completeError("EXN3");
});
Future timedOut = completer.future
.timeout(const Duration(seconds: 1), onTimeout: () => -1);
timedOut.catchError(expectAsync((e, s) {
expect(e, "EXN3");
}));
});
test("timeoutThrowBeforeCreate", () {
// Prevent uncaught error when we create the error.
Completer completer = new Completer.sync()..future.catchError((e) {});
completer.completeError("EXN4");
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => -1);
timedOut.catchError(expectAsync((e, s) {
expect(e, "EXN4");
}));
});
test("timeoutReturnFutureValue", () {
Future result = new Future.value(42);
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => result);
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutReturnFutureError", () {
Future result = new Future.error("EXN5")..catchError((e) {});
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => result);
timedOut.catchError(expectAsync((e, s) {
expect(e, "EXN5");
}));
});
test("timeoutReturnFutureValueLater", () {
Completer result = new Completer();
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5),
onTimeout: () {
result.complete(42);
return result.future;
});
timedOut.then(expectAsync((v) {
expect(v, 42);
}));
});
test("timeoutReturnFutureErrorLater", () {
Completer result = new Completer();
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5),
onTimeout: () {
result.completeError("EXN6");
return result.future;
});
timedOut.catchError(expectAsync((e, s) {
expect(e, "EXN6");
}));
});
test("timeoutZone", () {
var initialZone = Zone.current;
Zone forked;
int registerCallDelta = 0;
bool callbackCalled = false;
Function callback = () {
expect(callbackCalled, false);
callbackCalled = true;
expect(Zone.current, forked);
return 42;
};
forked = Zone.current.fork(specification: new ZoneSpecification(
registerCallback: (Zone self, ZoneDelegate parent, Zone origin, f()) {
if (!identical(f, callback)) return f;
registerCallDelta++; // Increment calls to register.
expect(origin, forked);
expect(self, forked);
return expectAsync(() {
registerCallDelta--;
return f();
});
}));
Completer completer = new Completer();
Future timedOut;
forked.run(() {
timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: callback);
});
timedOut.then(expectAsync((v) {
expect(callbackCalled, true);
expect(registerCallDelta, 0);
expect(Zone.current, initialZone);
expect(v, 42);
}));
});
test("timeoutNoFunction", () {
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5));
timedOut.catchError(expectAsync((e, s) {
expect(e, new isInstanceOf<TimeoutException>());
expect(e.duration, const Duration(milliseconds: 5));
expect(s, null);
}));
});
test("timeoutType", () {
Completer completer = new Completer<int>();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5));
expect(timedOut, new isInstanceOf<Future<int>>());
expect(timedOut, isNot(new isInstanceOf<Future<String>>()));
timedOut.catchError((_) {});
completer.complete(499);
});
}