From b19a9501020ce4bd553d8356e4526bf222bd7544 Mon Sep 17 00:00:00 2001 From: Eddie Abbondanzio Date: Tue, 23 Jul 2024 02:49:52 -0400 Subject: [PATCH] test_runner: cleanup global event listeners after run PR-URL: https://github.com/nodejs/node/pull/53878 Fixes: https://github.com/nodejs/node/issues/53868 Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- lib/internal/test_runner/harness.js | 7 ++++++- lib/internal/test_runner/runner.js | 5 ++++- test/parallel/test-runner-run.mjs | 10 ++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/internal/test_runner/harness.js b/lib/internal/test_runner/harness.js index 02b3f9933d02d6..e595f2ed1dff61 100644 --- a/lib/internal/test_runner/harness.js +++ b/lib/internal/test_runner/harness.js @@ -170,8 +170,13 @@ function setup(root) { kCancelledByParent)); hook.disable(); - process.removeListener('unhandledRejection', rejectionHandler); process.removeListener('uncaughtException', exceptionHandler); + process.removeListener('unhandledRejection', rejectionHandler); + process.removeListener('beforeExit', exitHandler); + if (globalOptions.isTestRunner) { + process.removeListener('SIGINT', terminationHandler); + process.removeListener('SIGTERM', terminationHandler); + } }; const terminationHandler = () => { diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index 556bf475d68691..263aedd9abccd2 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -564,6 +564,7 @@ function run(options = kEmptyObject) { } let postRun = () => root.postRun(); + let teardown = () => root.harness.teardown(); let filesWatcher; const opts = { __proto__: null, @@ -578,6 +579,7 @@ function run(options = kEmptyObject) { if (watch) { filesWatcher = watchFiles(testFiles, opts); postRun = undefined; + teardown = undefined; } const runFiles = () => { root.harness.bootstrapComplete = true; @@ -589,7 +591,8 @@ function run(options = kEmptyObject) { }); }; - PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root.reporter)), runFiles), postRun); + const setupPromise = PromiseResolve(setup?.(root.reporter)); + PromisePrototypeThen(PromisePrototypeThen(PromisePrototypeThen(setupPromise, runFiles), postRun), teardown); return root.reporter; } diff --git a/test/parallel/test-runner-run.mjs b/test/parallel/test-runner-run.mjs index 54e882c4ecabe3..0b3c0908601004 100644 --- a/test/parallel/test-runner-run.mjs +++ b/test/parallel/test-runner-run.mjs @@ -551,3 +551,13 @@ describe('forceExit', () => { }); }); }); + + +// exitHandler doesn't run until after the tests / after hooks finish. +process.on('exit', () => { + assert.strictEqual(process.listeners('uncaughtException').length, 0); + assert.strictEqual(process.listeners('unhandledRejection').length, 0); + assert.strictEqual(process.listeners('beforeExit').length, 0); + assert.strictEqual(process.listeners('SIGINT').length, 0); + assert.strictEqual(process.listeners('SIGTERM').length, 0); +});