aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJulien Gilli <julien.gilli@joyent.com>2015-11-23 13:13:40 -0800
committerJulien Gilli <julien.gilli@joyent.com>2015-11-26 18:10:32 -0800
commit1c8584997346d549dd5ff4bb787f48f52440a9cb (patch)
treebea642b3d8848d18dcffbed983bf8c069f855bcd /test
parent8b7503024924d003a7fd7adf04d1e95a040187a8 (diff)
downloadandroid-node-v8-1c8584997346d549dd5ff4bb787f48f52440a9cb.tar.gz
android-node-v8-1c8584997346d549dd5ff4bb787f48f52440a9cb.tar.bz2
android-node-v8-1c8584997346d549dd5ff4bb787f48f52440a9cb.zip
test: fix test-domain-exit-dispose-again
test-domain-exit-dispose-again had been written for node v0.10.x, and was using the fact that callbacks scheduled with `process.nextTick` wouldn't run if the domain attached to it was disposed. This is not longer the case, and as a result the test would not catch any regression: it would always pass. This change rewrites that test to check that the current domain is cleared properly when processing the rest of the timers list if a timer's callback throws an error. This makes the test fail without the original fix, and pass with the original fix, as expected. PR: #3990 PR-URL: https://github.com/nodejs/node/pull/3990 Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-domain-exit-dispose-again.js63
1 files changed, 23 insertions, 40 deletions
diff --git a/test/parallel/test-domain-exit-dispose-again.js b/test/parallel/test-domain-exit-dispose-again.js
index d7046481d1..6fe9f25fb0 100644
--- a/test/parallel/test-domain-exit-dispose-again.js
+++ b/test/parallel/test-domain-exit-dispose-again.js
@@ -1,56 +1,39 @@
'use strict';
-var common = require('../common');
-var assert = require('assert');
-var domain = require('domain');
-var disposalFailed = false;
+const common = require('../common');
+const assert = require('assert');
+const domain = require('domain');
-// no matter what happens, we should increment a 10 times.
-var a = 0;
-log();
-function log() {
- console.log(a++, process.domain);
- if (a < 10) setTimeout(log, 20);
-}
-
-var secondTimerRan = false;
-
-// in 50ms we'll throw an error.
+// Use the same timeout value so that both timers' callbacks are called during
+// the same invocation of the underlying native timer's callback (listOnTimeout
+// in lib/timers.js).
setTimeout(err, 50);
-setTimeout(secondTimer, 50);
+setTimeout(common.mustCall(secondTimer), 50);
+
function err() {
- var d = domain.create();
- d.on('error', handle);
+ const d = domain.create();
+ d.on('error', handleDomainError);
d.run(err2);
function err2() {
- // this timeout should never be called, since the domain gets
- // disposed when the error happens.
- setTimeout(function() {
- console.error('This should not happen.');
- disposalFailed = true;
- process.exit(1);
- });
-
// this function doesn't exist, and throws an error as a result.
err3();
}
- function handle(e) {
- // this should clean up everything properly.
- d.dispose();
- console.error(e);
- console.error('in handler', process.domain, process.domain === d);
+ function handleDomainError(e) {
+ // In the domain's error handler, the current active domain should be the
+ // domain within which the error was thrown.
+ assert.equal(process.domain, d);
}
}
function secondTimer() {
- console.log('In second timer');
- secondTimerRan = true;
+ // secondTimer was scheduled before any domain had been created, so its
+ // callback should not have any active domain set when it runs.
+ // Do not use assert here, as it throws errors and if a domain with an error
+ // handler is active, then asserting wouldn't make the test fail.
+ if (process.domain !== null) {
+ console.log('process.domain should be null, but instead is:',
+ process.domain);
+ process.exit(1);
+ }
}
-
-process.on('exit', function() {
- assert.equal(a, 10);
- assert.equal(disposalFailed, false);
- assert(secondTimerRan);
- console.log('ok');
-});