// Copyright (c) 2017, 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. import 'dart:async'; import 'package:expect/expect.dart'; import 'package:async_helper/async_helper.dart'; class AsyncTracker { int runningAsyncs = 0; List expectedEvents; final List actualEvents = []; AsyncTracker() { asyncStart(); } void start(String event) { actualEvents.add("start $event"); runningAsyncs++; } void stop(String event) { actualEvents.add("stop $event"); if (--runningAsyncs == 0) { Expect.listEquals(expectedEvents, actualEvents); asyncEnd(); } } void add(e) { actualEvents.add(e); } } void test1() { var tracker = new AsyncTracker(); Future foo() async { tracker.add("error-foo"); throw "foo"; } tracker.start("micro1"); scheduleMicrotask(() { tracker.start("micro2"); scheduleMicrotask(() { tracker.stop("micro2"); }); tracker.stop("micro1"); }); tracker.start("foo"); foo().catchError((e) { tracker.stop("foo"); }); tracker.start("micro3"); scheduleMicrotask(() { tracker.stop("micro3"); }); tracker.expectedEvents = [ "start micro1", "start foo", "error-foo", "start micro3", "start micro2", "stop micro1", "stop foo", "stop micro3", "stop micro2", ]; } void test2() { var tracker = new AsyncTracker(); Future bar() async { tracker.add("await null"); await null; tracker.add("error-bar"); throw "bar"; } tracker.start("micro1"); scheduleMicrotask(() { tracker.start("micro2"); scheduleMicrotask(() { tracker.start("micro3"); scheduleMicrotask(() { tracker.stop("micro3"); }); tracker.stop("micro2"); }); tracker.stop("micro1"); }); tracker.start("bar"); bar().catchError((e) { tracker.stop("bar"); }); tracker.start("micro4"); scheduleMicrotask(() { tracker.start("micro5"); scheduleMicrotask(() { tracker.stop("micro5"); }); tracker.stop("micro4"); }); tracker.expectedEvents = [ "start micro1", "start bar", "await null", "start micro4", "start micro2", "stop micro1", "error-bar", "stop bar", "start micro5", "stop micro4", "start micro3", "stop micro2", "stop micro5", "stop micro3", ]; } void test3() { var tracker = new AsyncTracker(); Future gee() async { tracker.add("error-gee"); return new Future.error("gee"); } tracker.start("micro1"); scheduleMicrotask(() { tracker.start("micro2"); scheduleMicrotask(() { tracker.stop("micro2"); }); tracker.stop("micro1"); }); tracker.start("gee"); gee().catchError((e) { tracker.stop("gee"); }); tracker.start("micro3"); scheduleMicrotask(() { tracker.stop("micro3"); }); tracker.expectedEvents = [ "start micro1", "start gee", "error-gee", "start micro3", "start micro2", "stop micro1", "stop gee", "stop micro3", "stop micro2", ]; } void test4() { var tracker = new AsyncTracker(); Future toto() async { tracker.add("await null"); await null; tracker.add("error-toto"); return new Future.error("toto"); } tracker.start("micro1"); scheduleMicrotask(() { tracker.start("micro2"); scheduleMicrotask(() { tracker.start("micro3"); scheduleMicrotask(() { tracker.stop("micro3"); }); tracker.stop("micro2"); }); tracker.stop("micro1"); }); tracker.start("toto"); toto().catchError((e) { tracker.stop("toto"); }); tracker.start("micro4"); scheduleMicrotask(() { tracker.start("micro5"); scheduleMicrotask(() { tracker.stop("micro5"); }); tracker.stop("micro4"); }); tracker.expectedEvents = [ "start micro1", "start toto", "await null", "start micro4", "start micro2", "stop micro1", "error-toto", "start micro5", "stop micro4", "start micro3", "stop micro2", "stop toto", "stop micro5", "stop micro3", ]; } void test5() { var tracker = new AsyncTracker(); Future foo() async { tracker.add("throw"); throw "foo"; } bar() async { tracker.start('micro'); scheduleMicrotask(() { tracker.stop('micro'); }); try { tracker.start('foo'); await foo(); } catch (e) { tracker.stop('foo'); } tracker.stop("bar"); } tracker.start('bar'); tracker.expectedEvents = [ "start bar", "start micro", "start foo", "throw", "stop micro", "stop foo", "stop bar", ]; } main() { asyncStart(); test1(); test2(); test3(); test4(); asyncEnd(); }