Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import 'package:expect/expect.dart'; | |
| 6 import 'package:async_helper/async_helper.dart'; | |
| 7 import 'dart:async'; | |
| 8 | |
| 9 import 'dart:collection'; | |
| 10 | |
| 11 int stackTrace = 0; | |
|
Lasse Reichstein Nielsen
2013/09/23 14:24:12
Name stackTraceCount would be easier to understand
floitsch
2013/09/23 17:12:07
It stands for normal stack traces. So "count" woul
| |
| 12 List restoredStackTrace = []; | |
| 13 | |
| 14 List events = []; | |
| 15 | |
| 16 debugZoneRegisterCallback(Zone self, ZoneDelegate parent, Zone origin, f()) { | |
| 17 List savedTrace = [stackTrace]..addAll(restoredStackTrace); | |
| 18 return parent.registerCallback(origin, () { | |
| 19 restoredStackTrace = savedTrace; | |
| 20 return f(); | |
| 21 }); | |
| 22 } | |
| 23 | |
| 24 debugZoneRegisterCallback1(Zone self, ZoneDelegate parent, Zone origin, | |
| 25 f(arg)) { | |
| 26 List savedTrace = [stackTrace]..addAll(restoredStackTrace); | |
| 27 return parent.registerCallback(origin, (arg) { | |
| 28 restoredStackTrace = savedTrace; | |
| 29 return f(arg); | |
| 30 }); | |
| 31 } | |
| 32 | |
| 33 debugZoneRun(Zone self, ZoneDelegate parent, Zone origin, f()) { | |
| 34 stackTrace++; | |
| 35 restoredStackTrace = []; | |
| 36 return parent.run(origin, f); | |
| 37 } | |
| 38 | |
| 39 debugZoneRun1(Zone self, ZoneDelegate parent, Zone origin, f(arg), arg) { | |
| 40 stackTrace++; | |
| 41 restoredStackTrace = []; | |
| 42 return parent.run1(origin, f, arg); | |
| 43 } | |
| 44 | |
| 45 List expectedDebugTrace; | |
| 46 | |
| 47 debugUncaughtHandler(Zone self, ZoneDelegate parent, Zone origin, error) { | |
| 48 events.add("handling uncaught error $error"); | |
| 49 Expect.listEquals(expectedDebugTrace, restoredStackTrace); | |
| 50 // Suppress the error and don't propagate to parent. | |
| 51 } | |
| 52 | |
| 53 const DEBUG_DESCRIPTION = const ZoneDescription( | |
| 54 registerCallback: debugZoneRegisterCallback, | |
| 55 registerCallback1: debugZoneRegisterCallback1, | |
| 56 run: debugZoneRun, | |
| 57 run1: debugZoneRun1, | |
| 58 handleUncaughtError: debugUncaughtHandler); | |
| 59 | |
| 60 main() { | |
| 61 Completer done = new Completer(); | |
| 62 | |
| 63 // runGuarded calls run, captures the synchronous error (if any) and | |
| 64 // gives that one to handleUncaughtError. | |
| 65 | |
| 66 Expect.identical(Zone.ROOT, Zone.current); | |
| 67 Zone forked; | |
| 68 forked = Zone.current.fork(null, DEBUG_DESCRIPTION); | |
| 69 | |
| 70 asyncStart(); | |
| 71 | |
| 72 int openTests = 0; | |
| 73 | |
| 74 openTests++; | |
| 75 forked.run(() { | |
| 76 int forkTrace = stackTrace; | |
| 77 runAsync(() { | |
| 78 int runAsyncTrace = stackTrace; | |
| 79 runAsync(() { | |
| 80 expectedDebugTrace = [runAsyncTrace, forkTrace]; | |
| 81 openTests--; | |
| 82 if (openTests == 0) { | |
| 83 done.complete(); | |
| 84 } | |
| 85 throw "foo"; | |
| 86 }); | |
| 87 expectedDebugTrace = [forkTrace]; | |
| 88 throw "bar"; | |
| 89 }); | |
| 90 }); | |
| 91 | |
| 92 Expect.listEquals([], restoredStackTrace); | |
| 93 Zone forked2 = forked.fork(); | |
| 94 Zone forked3 = forked2.fork(); | |
| 95 int fork2Trace; | |
| 96 int fork3Trace; | |
| 97 var f2; | |
| 98 var globalTrace = stackTrace; | |
| 99 var f = forked3.bindCallback(() { | |
| 100 Expect.identical(forked3, Zone.current); | |
| 101 fork2Trace = stackTrace; | |
| 102 f2 = forked2.bindCallback(() { | |
| 103 Expect.identical(forked2, Zone.current); | |
| 104 Expect.listEquals([fork2Trace, globalTrace], restoredStackTrace); | |
| 105 fork3Trace = stackTrace; | |
| 106 openTests--; | |
| 107 if (openTests == 0) { | |
| 108 done.complete(); | |
| 109 } | |
| 110 runAsync(() { | |
| 111 expectedDebugTrace = [fork3Trace, fork2Trace, globalTrace]; | |
| 112 throw "gee"; | |
| 113 }); | |
| 114 }, runGuarded: false); | |
| 115 }, runGuarded: false); | |
| 116 openTests++; | |
| 117 f(); | |
| 118 f2(); | |
| 119 | |
| 120 done.future.whenComplete(() { | |
| 121 // We don't really care for the order. | |
| 122 events.sort(); | |
| 123 Expect.listEquals([ "handling uncaught error bar", | |
| 124 "handling uncaught error foo", | |
| 125 "handling uncaught error gee"], | |
| 126 events); | |
| 127 asyncEnd(); | |
| 128 }); | |
| 129 } | |
| OLD | NEW |