node/test/parallel/test-timers-timeout-promisified.js
Paolo Insogna 6d654ddd00
timers: fix validation
PR-URL: https://github.com/nodejs/node/pull/54404
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
2024-08-25 07:30:10 +00:00

97 lines
2.8 KiB
JavaScript

// Flags: --no-warnings --expose-internals
'use strict';
const common = require('../common');
const assert = require('assert');
const timers = require('timers');
const { promisify } = require('util');
const { getEventListeners } = require('events');
const { NodeEventTarget } = require('internal/event_target');
const timerPromises = require('timers/promises');
const setPromiseTimeout = promisify(timers.setTimeout);
assert.strictEqual(setPromiseTimeout, timerPromises.setTimeout);
process.on('multipleResolves', common.mustNotCall());
{
const promise = setPromiseTimeout(1);
promise.then(common.mustCall((value) => {
assert.strictEqual(value, undefined);
}));
}
{
const promise = setPromiseTimeout(1, 'foobar');
promise.then(common.mustCall((value) => {
assert.strictEqual(value, 'foobar');
}));
}
{
const ac = new AbortController();
const signal = ac.signal;
assert.rejects(setPromiseTimeout(10, undefined, { signal }), /AbortError/)
.then(common.mustCall());
ac.abort();
}
{
const signal = AbortSignal.abort(); // Abort in advance
assert.rejects(setPromiseTimeout(10, undefined, { signal }), /AbortError/)
.then(common.mustCall());
}
{
// Check that aborting after resolve will not reject.
const ac = new AbortController();
const signal = ac.signal;
setPromiseTimeout(10, undefined, { signal })
.then(common.mustCall(() => { ac.abort(); }))
.then(common.mustCall());
}
{
// Check that timer adding signals does not leak handlers
const signal = new NodeEventTarget();
signal.aborted = false;
setPromiseTimeout(0, null, { signal }).finally(common.mustCall(() => {
assert.strictEqual(getEventListeners(signal, 'abort').length, 0);
}));
}
{
for (const delay of ['', false]) {
assert.rejects(() => setPromiseTimeout(delay, null, {}), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
}
for (const options of [1, '', false, Infinity]) {
assert.rejects(() => setPromiseTimeout(10, null, options), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
}
for (const signal of [1, '', false, Infinity, null, {}]) {
assert.rejects(() => setPromiseTimeout(10, null, { signal }), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
}
for (const ref of [1, '', Infinity, null, {}]) {
assert.rejects(() => setPromiseTimeout(10, null, { ref }), /ERR_INVALID_ARG_TYPE/).then(common.mustCall());
}
}
{
common.spawnPromisified(process.execPath, ['-pe', 'const assert = require(\'assert\');' +
'require(\'timers/promises\').setTimeout(1000, null, { ref: false }).' +
'then(assert.fail)']).then(common.mustCall(({ stderr }) => {
assert.strictEqual(stderr, '');
}));
}
(async () => {
const signal = AbortSignal.abort('boom');
await assert.rejects(timerPromises.setTimeout(1, undefined, { signal }), {
cause: 'boom',
});
})().then(common.mustCall());