| Index: tests/lib/async/future_test.dart
|
| diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
|
| index 12cc53b92f5328aa12857463268718c12dd0e65b..108cbcd52992d25ab337dce054b12d78a98328bb 100644
|
| --- a/tests/lib/async/future_test.dart
|
| +++ b/tests/lib/async/future_test.dart
|
| @@ -749,6 +749,133 @@ void testSyncFuture_i13368() {
|
| });
|
| }
|
|
|
| +void testWaitCleanUp() {
|
| + asyncStart();
|
| + // Creates three futures with different completion times, and where some fail.
|
| + // The `mask` specifies which futures fail (values 1-7),
|
| + // and `permute` defines the order of completion. values 0-5.
|
| + void doTest(int mask, int permute) {
|
| + asyncStart();
|
| + String stringId = "waitCleanup-$mask-$permute";
|
| + List futures = new List(3);
|
| + List cleanup = new List(3);
|
| + int permuteTmp = permute;
|
| + for (int i = 0; i < 3; i++) {
|
| + bool throws = (mask & (1 << i)) != 0;
|
| + var future = new Future.delayed(
|
| + new Duration(milliseconds: 100 * (i + 1)),
|
| + () => (throws ? throw "Error $i($mask-$permute)" : i));
|
| + int mod = 3 - i;
|
| + int position = permuteTmp % mod;
|
| + permuteTmp = permuteTmp ~/ mod;
|
| + while (futures[position] != null) position++;
|
| + futures[position] = future;
|
| + cleanup[i] = throws;
|
| + }
|
| + void cleanUp(index) {
|
| + Expect.isFalse(cleanup[index]);
|
| + cleanup[index] = true;
|
| + }
|
| + Future.wait(futures, cleanUp: cleanUp)
|
| + .then((_) { Expect.fail("No error: $stringId"); },
|
| + onError: (e, s) {
|
| + Expect.listEquals([true, true, true], cleanup);
|
| + asyncEnd();
|
| + });
|
| + }
|
| +
|
| + for (int i = 1; i < 8; i++) {
|
| + for (int j = 0; j < 6; j++) {
|
| + doTest(i, j);
|
| + }
|
| + }
|
| + asyncEnd();
|
| +}
|
| +
|
| +void testWaitCleanUpEager() {
|
| + asyncStart();
|
| + // Creates three futures with different completion times, and where some fail.
|
| + // The `mask` specifies which futures fail (values 1-7),
|
| + // and `permute` defines the order of completion. values 0-5.
|
| + void doTest(int mask, int permute) {
|
| + asyncStart();
|
| + asyncStart();
|
| + bool done = false;
|
| + String stringId = "waitCleanup-$mask-$permute";
|
| + List futures = new List(3);
|
| + List cleanup = new List(3);
|
| + int permuteTmp = permute;
|
| + for (int i = 0; i < 3; i++) {
|
| + bool throws = (mask & (1 << i)) != 0;
|
| + var future = new Future.delayed(
|
| + new Duration(milliseconds: 100 * (i + 1)),
|
| + () => (throws ? throw "Error $i($mask-$permute)" : i));
|
| + int mod = 3 - i;
|
| + int position = permuteTmp % mod;
|
| + permuteTmp = permuteTmp ~/ mod;
|
| + while (futures[position] != null) position++;
|
| + futures[position] = future;
|
| + cleanup[i] = throws;
|
| + }
|
| + void checkDone() {
|
| + if (done) return;
|
| + if (cleanup.every((v) => v)) {
|
| + done = true;
|
| + asyncEnd();
|
| + }
|
| + }
|
| + void cleanUp(index) {
|
| + Expect.isFalse(cleanup[index]);
|
| + cleanup[index] = true;
|
| + // Cleanup might happen before and after the wait().then() callback.
|
| + checkDone();
|
| + }
|
| + Future.wait(futures, eagerError: true, cleanUp: cleanUp)
|
| + .then((_) { Expect.fail("No error: $stringId"); },
|
| + onError: (e, s) {
|
| + asyncEnd();
|
| + checkDone();
|
| + });
|
| + }
|
| +
|
| + for (int i = 1; i < 8; i++) {
|
| + for (int j = 0; j < 6; j++) {
|
| + doTest(i, j);
|
| + }
|
| + }
|
| + asyncEnd();
|
| +}
|
| +
|
| +void testWaitCleanUpError() {
|
| + var cms = const Duration(milliseconds: 100);
|
| + var cleanups = new List.filled(3, false);
|
| + var uncaughts = new List.filled(3, false);
|
| + asyncStart();
|
| + asyncStart();
|
| + asyncStart();
|
| + runZoned(() {
|
| + Future.wait([new Future.delayed(cms, () => 0),
|
| + new Future.delayed(cms * 2, ()=> throw 1),
|
| + new Future.delayed(cms * 3, () => 2)],
|
| + cleanUp: (index) {
|
| + Expect.isTrue(index == 0 || index == 2, "$index");
|
| + Expect.isFalse(cleanups[index]);
|
| + cleanups[index] = true;
|
| + throw index;
|
| + })
|
| + .catchError((e) {
|
| + Expect.equals(e, 1);
|
| + asyncEnd();
|
| + });
|
| +
|
| + }, onError: (int index, s) {
|
| + Expect.isTrue(index == 0 || index == 2, "$index");
|
| + Expect.isFalse(uncaughts[index]);
|
| + uncaughts[index] = true;
|
| + asyncEnd();
|
| + });
|
| +}
|
| +
|
| main() {
|
| asyncStart();
|
|
|
| @@ -805,6 +932,9 @@ main() {
|
|
|
| testSyncFuture_i13368();
|
|
|
| + testWaitCleanUp();
|
| + testWaitCleanUpError();
|
| +
|
| asyncEnd();
|
| }
|
|
|
|
|