| // Copyright (c) 2021, 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 |
| |
| import 'package:expect/expect.dart'; |
| import 'package:async_helper/async_helper.dart'; |
| import 'dart:async'; |
| |
| void main() async { |
| asyncStart(); |
| await testThrowSame(); |
| await testThrowOther(); |
| asyncEnd(); |
| } |
| |
| Future<void> testThrowSame() async { |
| asyncStart(); |
| var object1 = Object(); |
| var stack1 = StackTrace.current; |
| var outerZone = Zone.current; |
| var firstZone = Zone.current.fork(specification: onError((error, stack) { |
| // Uncaught error handlers run in the parent zone. |
| Expect.identical(outerZone, Zone.current); |
| Expect.identical(object1, error); |
| Expect.identical(stack1, stack); // Get same stack trace. |
| asyncEnd(); |
| })); |
| firstZone.run(() async { |
| Expect.identical(firstZone, Zone.current); |
| var secondZone = Zone.current.fork(specification: onError((error, stack) { |
| // Uncaught error handlers run in the parent zone. |
| Expect.identical(firstZone, Zone.current); |
| Expect.identical(object1, error); |
| Expect.identical(stack1, stack); |
| throw error; // Throw same object |
| })); |
| secondZone.run(() async { |
| Expect.identical(secondZone, Zone.current); |
| Future.error(object1, stack1); // Unhandled async error. |
| await Future(() {}); |
| }); |
| }); |
| } |
| |
| Future<void> testThrowOther() async { |
| asyncStart(); |
| var object1 = Object(); |
| var object2 = Object(); |
| var stack1 = StackTrace.current; |
| var outerZone = Zone.current; |
| var firstZone = Zone.current.fork(specification: onError((error, stack) { |
| Expect.identical(outerZone, Zone.current); |
| Expect.identical(object2, error); |
| Expect.notIdentical(stack1, stack); // Get different stack trace. |
| asyncEnd(); |
| })); |
| firstZone.run(() async { |
| Expect.identical(firstZone, Zone.current); |
| var secondZone = Zone.current.fork(specification: onError((error, stack) { |
| Expect.identical(firstZone, Zone.current); |
| Expect.identical(object1, error); |
| Expect.identical(stack1, stack); |
| throw object2; // Throw different object |
| })); |
| secondZone.run(() async { |
| Expect.identical(secondZone, Zone.current); |
| Future.error(object1, stack1); // Unhandled async error. |
| await Future(() {}); |
| }); |
| }); |
| } |
| |
| ZoneSpecification onError(void Function(Object, StackTrace) handler) { |
| return ZoneSpecification( |
| handleUncaughtError: (s, p, z, e, st) => handler(e, st)); |
| } |