mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 10:15:07 +08:00
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>
43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
// Flags: --expose-gc
|
|
'use strict';
|
|
|
|
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(common.platformTimeout(1000)),
|
|
AbortSignal.timeout(110000),
|
|
]);
|
|
let timeout;
|
|
|
|
const abortPromise = Promise.race([
|
|
once(signal, 'abort').then(() => {
|
|
throw signal.reason;
|
|
}),
|
|
new Promise((resolve) => {
|
|
timeout = setTimeout(resolve, common.platformTimeout(10000));
|
|
}),
|
|
]);
|
|
|
|
// 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);
|
|
}
|
|
});
|
|
});
|