Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 1 | 'use strict'; |
Brendan Ashworth | 0df5430 | 2015-02-22 02:47:04 | [diff] [blame] | 2 | var common = require('../common'); |
isaacs | 0400571 | 2012-09-20 22:13:36 | [diff] [blame] | 3 | var assert = require('assert'); |
| 4 | var domain = require('domain'); |
| 5 | var disposalFailed = false; |
| 6 | |
| 7 | // no matter what happens, we should increment a 10 times. |
| 8 | var a = 0; |
| 9 | log(); |
Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 10 | function log() { |
isaacs | 0400571 | 2012-09-20 22:13:36 | [diff] [blame] | 11 | console.log(a++, process.domain); |
| 12 | if (a < 10) setTimeout(log, 20); |
| 13 | } |
| 14 | |
| 15 | // in 50ms we'll throw an error. |
| 16 | setTimeout(err, 50); |
Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 17 | function err() { |
isaacs | 0400571 | 2012-09-20 22:13:36 | [diff] [blame] | 18 | var d = domain.create(); |
| 19 | d.on('error', handle); |
| 20 | d.run(err2); |
| 21 | |
| 22 | function err2() { |
| 23 | // this timeout should never be called, since the domain gets |
| 24 | // disposed when the error happens. |
| 25 | setTimeout(function() { |
| 26 | console.error('This should not happen.'); |
| 27 | disposalFailed = true; |
| 28 | process.exit(1); |
| 29 | }); |
| 30 | |
| 31 | // this function doesn't exist, and throws an error as a result. |
| 32 | err3(); |
| 33 | } |
| 34 | |
| 35 | function handle(e) { |
| 36 | // this should clean up everything properly. |
| 37 | d.dispose(); |
| 38 | console.error(e); |
| 39 | console.error('in handler', process.domain, process.domain === d); |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | process.on('exit', function() { |
| 44 | assert.equal(a, 10); |
| 45 | assert.equal(disposalFailed, false); |
| 46 | console.log('ok'); |
| 47 | }); |