From 52f8dcfccc6d9887d2e50a0cbd76391b6e16d214 Mon Sep 17 00:00:00 2001 From: Colin Ihrig Date: Wed, 10 Apr 2024 22:43:10 -0400 Subject: [PATCH] test_runner: make end of work check stricter This commit updates the logic that checks for the end of the test run. Prior to this change, it was possible for root.run() to be called multiple times because of the way pending subtests were tracked. The extra calls to root.run() were harmless, but could trigger an EventEmitter leak warning due to 'abort' listeners being created. PR-URL: https://github.com/nodejs/node/pull/52326 Reviewed-By: Benjamin Gruenbaum Reviewed-By: Moshe Atlow Reviewed-By: Chemi Atlow --- lib/internal/test_runner/test.js | 9 +++++++++ test/parallel/test-runner-filter-warning.js | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/parallel/test-runner-filter-warning.js diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index 149d4547b4a65d..9c7d95f9420de5 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -829,11 +829,20 @@ class Test extends AsyncResource { this.parent.activeSubtests--; } + // The call to processPendingSubtests() below can change the number of + // pending subtests. When detecting if we are done running tests, we want + // to check if there are no pending subtests both before and after + // calling processPendingSubtests(). Otherwise, it is possible to call + // root.run() multiple times (which is harmless but can trigger an + // EventEmitter leak warning). + const pendingSiblingCount = this.parent.pendingSubtests.length; + this.parent.addReadySubtest(this); this.parent.processReadySubtestRange(false); this.parent.processPendingSubtests(); if (this.parent === this.root && + pendingSiblingCount === 0 && this.root.activeSubtests === 0 && this.root.pendingSubtests.length === 0 && this.root.readySubtests.size === 0) { diff --git a/test/parallel/test-runner-filter-warning.js b/test/parallel/test-runner-filter-warning.js new file mode 100644 index 00000000000000..0f98f796d9f1c7 --- /dev/null +++ b/test/parallel/test-runner-filter-warning.js @@ -0,0 +1,11 @@ +// Flags: --test-only +'use strict'; +const common = require('../common'); +const { test } = require('node:test'); +const { defaultMaxListeners } = require('node:events'); + +process.on('warning', common.mustNotCall()); + +for (let i = 0; i < defaultMaxListeners + 1; ++i) { + test(`test ${i + 1}`); +}