diff --git a/test/parallel/test-domain-top-level-error-handler-clears-stack.js b/test/parallel/test-domain-top-level-error-handler-clears-stack.js new file mode 100644 index 0000000000..a5fec1f65e --- /dev/null +++ b/test/parallel/test-domain-top-level-error-handler-clears-stack.js @@ -0,0 +1,34 @@ +'use strict'; + +const common = require('../common'); +const domain = require('domain'); + +/* + * Make sure that the domains stack is cleared after a top-level domain + * error handler exited gracefully. + */ +const d = domain.create(); + +d.on('error', common.mustCall(function() { + process.nextTick(function() { + // Scheduling a callback with process.nextTick will enter a _new_ domain, + // and the callback will be called after the domain that handled the error + // was exited. So there should be only one domain on the domains stack if + // the domains stack was cleared properly when the domain error handler + // returned. + if (domain._stack.length !== 1) { + // Do not use assert to perform this test: this callback runs in a + // different callstack as the original process._fatalException that + // handled the original error, thus throwing here would trigger another + // call to process._fatalException, and so on recursively and + // indefinitely. + console.error('domains stack length should be 1, but instead is:', + domain._stack.length); + process.exit(1); + } + }); +})); + +d.run(function() { + throw new Error('Error from domain'); +});