blob: a2e3c67b37ac4c18dafc71b35ddf02cc45332ec6 [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.
// @dart = 2.9
library future_timeout_test;
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
main() {
Future timeoutNoComplete() async {
asyncStart();
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutCompleteAfterTimeout() async {
asyncStart();
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
Timer timer = new Timer(const Duration(seconds: 1), () {
asyncStart();
completer.complete(-1);
});
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutCompleteBeforeTimeout() async {
asyncStart();
Completer completer = new Completer();
Timer timer = new Timer(const Duration(milliseconds: 5), () {
asyncStart();
completer.complete(42);
});
Future timedOut = completer.future
.timeout(const Duration(seconds: 1), onTimeout: () => -1);
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutCompleteBeforeCreate() async {
asyncStart();
Completer completer = new Completer.sync();
completer.complete(42);
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => -1);
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutThrows() async {
asyncStart();
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5),
onTimeout: () {
throw "EXN1";
});
timedOut.catchError((e, s) {
Expect.isTrue(e == "EXN1");
});
}
Future timeoutThrowAfterTimeout() async {
asyncStart();
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => 42);
Timer timer = new Timer(const Duration(seconds: 1), () {
asyncStart();
completer.completeError("EXN2");
});
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutThrowBeforeTimeout() async {
asyncStart();
Completer completer = new Completer();
Timer timer = new Timer(const Duration(milliseconds: 5), () {
asyncStart();
completer.completeError("EXN3");
});
Future timedOut = completer.future
.timeout(const Duration(seconds: 1), onTimeout: () => -1);
timedOut.catchError((e, s) {
Expect.isTrue(e == "EXN3");
});
}
Future timeoutThrowBeforeCreate() async {
asyncStart();
// 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((e, s) {
Expect.isTrue(e == "EXN4");
});
}
Future timeoutReturnFutureValue() async {
asyncStart();
Future result = new Future.value(42);
Completer completer = new Completer();
Future timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: () => result);
timedOut.then((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutReturnFutureError() async {
asyncStart();
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((e, s) {
Expect.isTrue(e == "EXN5");
});
}
Future timeoutReturnFutureValueLater() async {
asyncStart();
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((v) {
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutFutureReturnErrorLater() async {
asyncStart();
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((e, s) {
Expect.isTrue(e == "EXN6");
});
}
Future timeoutZone() async {
asyncStart();
var initialZone = Zone.current;
Zone forked;
int registerCallDelta = 0;
bool callbackCalled = false;
Function callback = () {
Expect.isFalse(callbackCalled);
callbackCalled = true;
Expect.isTrue(Zone.current == forked);
return 42;
};
forked = Zone.current.fork(specification: new ZoneSpecification(
registerCallback:
<R>(Zone self, ZoneDelegate parent, Zone origin, R f()) {
R Function() result;
if (!identical(f, callback)) {
result = f;
} else {
registerCallDelta++; // Increment calls to register.
Expect.isTrue(origin == forked);
Expect.isTrue(self == forked);
result = () {
registerCallDelta--;
return f();
};
}
return f;
}));
Completer completer = new Completer();
Future timedOut;
forked.run(() {
timedOut = completer.future
.timeout(const Duration(milliseconds: 5), onTimeout: callback);
});
timedOut.then((v) {
Expect.isTrue(callbackCalled);
Expect.isTrue(registerCallDelta == 0);
Expect.isTrue(Zone.current == initialZone);
Expect.isTrue(v == 42);
asyncEnd();
});
}
Future timeoutNoFunction() async {
asyncStart();
Completer completer = new Completer();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5));
timedOut.catchError((e, s) {
Expect.isTrue(e is TimeoutException);
Expect.isTrue(e.duration == const Duration(milliseconds: 5));
Expect.isNull(s);
});
}
Future timeoutType() async {
asyncStart();
Completer completer = new Completer<int>();
Future timedOut = completer.future.timeout(const Duration(milliseconds: 5));
Expect.isTrue(timedOut is Future<int>);
Expect.isTrue(timedOut is! Future<String>);
timedOut.catchError((_) {});
completer.complete(499);
}
}