test: collect timeout signals explicitly

Force collection on a later turn while the timeout sources are only
retained by AbortSignal.any(). Shorten the first timeout and clear the
watchdog after the assertion. This preserves the source-retention
regression check without waiting ten seconds on successful runs.

Signed-off-by: Filip Skokan <panva.ip@gmail.com>
Assisted-by: Codex
PR-URL: https://github.com/nodejs/node/pull/65980
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: LiviaMedeiros <livia@cirno.name>
This commit is contained in:
Filip Skokan committed 2026-09-13 14:01:18 +02:00
1 parent 1677ee7af2
commit c109c85703
1 file changed
+25 -11
@@ -1,28 +1,42 @@
// Flags: --expose-gc
'use strict';
require('../common');
const common = require('../common');
const assert = require('assert');
const { once } = require('node:events');
const { describe, it } = require('node:test');
describe('AbortSignal.any() with timeout signals', () => {
it('should abort when the first timeout signal fires', async () => {
const signal = AbortSignal.any([AbortSignal.timeout(9000), AbortSignal.timeout(110000)]);
const signal = AbortSignal.any([
AbortSignal.timeout(common.platformTimeout(1000)),
AbortSignal.timeout(110000),
]);
let timeout;
const abortPromise = Promise.race([
once(signal, 'abort').then(() => {
throw signal.reason;
}),
new Promise((resolve) => setTimeout(resolve, 10000)),
new Promise((resolve) => {
timeout = setTimeout(resolve, common.platformTimeout(10000));
}),
]);
// The promise should be aborted by the 9000ms timeout
await assert.rejects(
() => abortPromise,
{
name: 'TimeoutError',
message: 'The operation was aborted due to timeout'
}
);
// Collect after this turn so the WeakRefs no longer keep the timeout
// signals alive by themselves.
setImmediate(common.mustCall(() => globalThis.gc()));
try {
await assert.rejects(
() => abortPromise,
{
name: 'TimeoutError',
message: 'The operation was aborted due to timeout'
}
);
} finally {
clearTimeout(timeout);
}
});
});