OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // dart2js chain tests are separated out because dart2js stack traces are | 5 // dart2js chain tests are separated out because dart2js stack traces are |
6 // inconsistent due to inlining and browser differences. These tests don't | 6 // inconsistent due to inlining and browser differences. These tests don't |
7 // assert anything about the content of the traces, just the number of traces in | 7 // assert anything about the content of the traces, just the number of traces in |
8 // a chain. | 8 // a chain. |
9 @TestOn('js') | 9 @TestOn('js') |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 var chain = await captureFuture(() => throw 'error'); | 21 var chain = await captureFuture(() => throw 'error'); |
22 expect(chain.traces, hasLength(1)); | 22 expect(chain.traces, hasLength(1)); |
23 }); | 23 }); |
24 | 24 |
25 test('thrown in a microtask', () async { | 25 test('thrown in a microtask', () async { |
26 var chain = await captureFuture(() => inMicrotask(() => throw 'error')); | 26 var chain = await captureFuture(() => inMicrotask(() => throw 'error')); |
27 expect(chain.traces, hasLength(2)); | 27 expect(chain.traces, hasLength(2)); |
28 }); | 28 }); |
29 | 29 |
30 test('thrown in a one-shot timer', () async { | 30 test('thrown in a one-shot timer', () async { |
31 var chain = await captureFuture( | 31 var chain = |
32 () => inOneShotTimer(() => throw 'error')); | 32 await captureFuture(() => inOneShotTimer(() => throw 'error')); |
33 expect(chain.traces, hasLength(2)); | 33 expect(chain.traces, hasLength(2)); |
34 }); | 34 }); |
35 | 35 |
36 test('thrown in a periodic timer', () async { | 36 test('thrown in a periodic timer', () async { |
37 var chain = await captureFuture( | 37 var chain = |
38 () => inPeriodicTimer(() => throw 'error')); | 38 await captureFuture(() => inPeriodicTimer(() => throw 'error')); |
39 expect(chain.traces, hasLength(2)); | 39 expect(chain.traces, hasLength(2)); |
40 }); | 40 }); |
41 | 41 |
42 test('thrown in a nested series of asynchronous operations', () async { | 42 test('thrown in a nested series of asynchronous operations', () async { |
43 var chain = await captureFuture(() { | 43 var chain = await captureFuture(() { |
44 inPeriodicTimer(() { | 44 inPeriodicTimer(() { |
45 inOneShotTimer(() => inMicrotask(() => throw 'error')); | 45 inOneShotTimer(() => inMicrotask(() => throw 'error')); |
46 }); | 46 }); |
47 }); | 47 }); |
48 | 48 |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 var completer = new Completer(); | 231 var completer = new Completer(); |
232 Chain.capture(() { | 232 Chain.capture(() { |
233 inFutureChain(() => completer.complete(new Chain.current())); | 233 inFutureChain(() => completer.complete(new Chain.current())); |
234 }); | 234 }); |
235 | 235 |
236 var chain = await completer.future; | 236 var chain = await completer.future; |
237 expect(chain.traces, hasLength(2)); | 237 expect(chain.traces, hasLength(2)); |
238 }); | 238 }); |
239 }); | 239 }); |
240 | 240 |
241 test('current() outside of capture() returns a chain wrapping the current ' | 241 test( |
| 242 'current() outside of capture() returns a chain wrapping the current ' |
242 'trace', () { | 243 'trace', () { |
243 // The test runner runs all tests with chains enabled, so to test without we | 244 // The test runner runs all tests with chains enabled. |
244 // have to do some zone munging. | 245 return Chain.disable(() async { |
245 return runZoned(() async { | |
246 var completer = new Completer(); | 246 var completer = new Completer(); |
247 inMicrotask(() => completer.complete(new Chain.current())); | 247 inMicrotask(() => completer.complete(new Chain.current())); |
248 | 248 |
249 var chain = await completer.future; | 249 var chain = await completer.future; |
250 // Since the chain wasn't loaded within [Chain.capture], the full stack | 250 // Since the chain wasn't loaded within [Chain.capture], the full stack |
251 // chain isn't available and it just returns the current stack when | 251 // chain isn't available and it just returns the current stack when |
252 // called. | 252 // called. |
253 expect(chain.traces, hasLength(1)); | 253 expect(chain.traces, hasLength(1)); |
254 }, zoneValues: {#stack_trace.stack_zone.spec: null}); | 254 }); |
255 }); | 255 }); |
256 | 256 |
257 group('forTrace() within capture()', () { | 257 group('forTrace() within capture()', () { |
258 test('called for a stack trace from a microtask', () async { | 258 test('called for a stack trace from a microtask', () async { |
259 var chain = await Chain.capture(() { | 259 var chain = await Chain.capture(() { |
260 return chainForTrace(inMicrotask, () => throw 'error'); | 260 return chainForTrace(inMicrotask, () => throw 'error'); |
261 }); | 261 }); |
262 | 262 |
263 // Because [chainForTrace] has to set up a future chain to capture the | 263 // Because [chainForTrace] has to set up a future chain to capture the |
264 // stack trace while still showing it to the zone specification, it adds | 264 // stack trace while still showing it to the zone specification, it adds |
(...skipping 10 matching lines...) Expand all Loading... |
275 }); | 275 }); |
276 | 276 |
277 test('called for a stack trace from a periodic timer', () async { | 277 test('called for a stack trace from a periodic timer', () async { |
278 var chain = await Chain.capture(() { | 278 var chain = await Chain.capture(() { |
279 return chainForTrace(inPeriodicTimer, () => throw 'error'); | 279 return chainForTrace(inPeriodicTimer, () => throw 'error'); |
280 }); | 280 }); |
281 | 281 |
282 expect(chain.traces, hasLength(3)); | 282 expect(chain.traces, hasLength(3)); |
283 }); | 283 }); |
284 | 284 |
285 test('called for a stack trace from a nested series of asynchronous ' | 285 test( |
| 286 'called for a stack trace from a nested series of asynchronous ' |
286 'operations', () async { | 287 'operations', () async { |
287 var chain = await Chain.capture(() { | 288 var chain = await Chain.capture(() { |
288 return chainForTrace((callback) { | 289 return chainForTrace((callback) { |
289 inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback))); | 290 inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback))); |
290 }, () => throw 'error'); | 291 }, () => throw 'error'); |
291 }); | 292 }); |
292 | 293 |
293 expect(chain.traces, hasLength(5)); | 294 expect(chain.traces, hasLength(5)); |
294 }); | 295 }); |
295 | 296 |
296 test('called for a stack trace from a long future chain', () async { | 297 test('called for a stack trace from a long future chain', () async { |
297 var chain = await Chain.capture(() { | 298 var chain = await Chain.capture(() { |
298 return chainForTrace(inFutureChain, () => throw 'error'); | 299 return chainForTrace(inFutureChain, () => throw 'error'); |
299 }); | 300 }); |
300 | 301 |
301 expect(chain.traces, hasLength(3)); | 302 expect(chain.traces, hasLength(3)); |
302 }); | 303 }); |
303 | 304 |
304 test('called for an unregistered stack trace returns a chain wrapping that ' | 305 test( |
| 306 'called for an unregistered stack trace returns a chain wrapping that ' |
305 'trace', () { | 307 'trace', () { |
306 var trace; | 308 var trace; |
307 var chain = Chain.capture(() { | 309 var chain = Chain.capture(() { |
308 try { | 310 try { |
309 throw 'error'; | 311 throw 'error'; |
310 } catch (_, stackTrace) { | 312 } catch (_, stackTrace) { |
311 trace = stackTrace; | 313 trace = stackTrace; |
312 return new Chain.forTrace(stackTrace); | 314 return new Chain.forTrace(stackTrace); |
313 } | 315 } |
314 }); | 316 }); |
315 | 317 |
316 expect(chain.traces, hasLength(1)); | 318 expect(chain.traces, hasLength(1)); |
317 expect(chain.traces.first.toString(), | 319 expect(chain.traces.first.toString(), |
318 equals(new Trace.from(trace).toString())); | 320 equals(new Trace.from(trace).toString())); |
319 }); | 321 }); |
320 }); | 322 }); |
321 | 323 |
322 test('forTrace() outside of capture() returns a chain wrapping the given ' | 324 test( |
| 325 'forTrace() outside of capture() returns a chain wrapping the given ' |
323 'trace', () { | 326 'trace', () { |
324 var trace; | 327 var trace; |
325 var chain = Chain.capture(() { | 328 var chain = Chain.capture(() { |
326 try { | 329 try { |
327 throw 'error'; | 330 throw 'error'; |
328 } catch (_, stackTrace) { | 331 } catch (_, stackTrace) { |
329 trace = stackTrace; | 332 trace = stackTrace; |
330 return new Chain.forTrace(stackTrace); | 333 return new Chain.forTrace(stackTrace); |
331 } | 334 } |
332 }); | 335 }); |
333 | 336 |
334 expect(chain.traces, hasLength(1)); | 337 expect(chain.traces, hasLength(1)); |
335 expect(chain.traces.first.toString(), | 338 expect(chain.traces.first.toString(), |
336 equals(new Trace.from(trace).toString())); | 339 equals(new Trace.from(trace).toString())); |
337 }); | 340 }); |
338 } | 341 } |
OLD | NEW |