diff options
author | legendecas <legendecas@gmail.com> | 2019-11-17 15:02:01 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-12-17 00:05:53 +0300 |
commit | 6859fcf6f7c0710508b2a1f461043547e8a85acc (patch) | |
tree | 48d417ae1d782815a2eed65f71f9a099a6d21cfa /test | |
parent | 024b6588313a0e32595317936ee279dec7a5a756 (diff) |
cli: add --trace-exit cli option
It could be convenient to trace abnormal exit of the Node.js processes
that printing stacktrace on each `process.exit` call with a cli option.
This also takes effects on worker threads.
PR-URL: https://github.com/nodejs/node/pull/30516
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/parallel/test-trace-exit.js | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/parallel/test-trace-exit.js b/test/parallel/test-trace-exit.js new file mode 100644 index 00000000000..237512ac273 --- /dev/null +++ b/test/parallel/test-trace-exit.js @@ -0,0 +1,59 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { promisify } = require('util'); +const execFile = promisify(require('child_process').execFile); +const { Worker, isMainThread, workerData } = require('worker_threads'); + +const variant = process.argv[process.argv.length - 1]; +switch (true) { + case variant === 'main-thread': { + return; + } + case variant === 'main-thread-exit': { + return process.exit(0); + } + case variant.startsWith('worker-thread'): { + const worker = new Worker(__filename, { workerData: variant }); + worker.on('error', common.mustNotCall()); + worker.on('exit', common.mustCall((code) => { + assert.strictEqual(code, 0); + })); + return; + } + case !isMainThread: { + if (workerData === 'worker-thread-exit') { + process.exit(0); + } + return; + } +} + +(async function() { + for (const { execArgv, variant, warnings } of [ + { execArgv: ['--trace-exit'], variant: 'main-thread-exit', warnings: 1 }, + { execArgv: [], variant: 'main-thread-exit', warnings: 0 }, + { execArgv: ['--trace-exit'], variant: 'main-thread', warnings: 0 }, + { execArgv: [], variant: 'main-thread', warnings: 0 }, + { execArgv: ['--trace-exit'], variant: 'worker-thread-exit', warnings: 1 }, + { execArgv: [], variant: 'worker-thread-exit', warnings: 0 }, + { execArgv: ['--trace-exit'], variant: 'worker-thread', warnings: 0 }, + { execArgv: [], variant: 'worker-thread', warnings: 0 }, + ]) { + const { stdout, stderr } = + await execFile(process.execPath, [...execArgv, __filename, variant]); + assert.strictEqual(stdout, ''); + const actualWarnings = + stderr.match(/WARNING: Exited the environment with code 0/g); + if (warnings === 0) { + assert.strictEqual(actualWarnings, null); + return; + } + assert.strictEqual(actualWarnings.length, warnings); + + if (variant.startsWith('worker')) { + const workerIds = stderr.match(/\(node:\d+, thread:\d+)/g); + assert.strictEqual(workerIds.length, warnings); + } + } +})().then(common.mustCall()); |