node/test/parallel/test-timers-timeout-promisified.js
Rich Trott 52c753932f test: split promisified timers test for coverage purposes
Because of lazy loading, running promisified timers tests for setTimeout
and setImmediate from the same file means that there is a piece of code
that doesn't get covered. Split into separate files to cover everything.

Refs: https://coverage.nodejs.org/coverage-290c158018ac0277/lib/timers.js.html#L269

PR-URL: https://github.com/nodejs/node/pull/37943
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
2021-03-29 15:55:55 -07:00

100 lines
2.6 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 child_process = require('child_process');
// TODO(benjamingr) - refactor to use getEventListeners when #35991 lands
const { NodeEventTarget } = require('internal/event_target');
const timerPromises = require('timers/promises');
const setPromiseTimeout = promisify(timers.setTimeout);
const exec = promisify(child_process.exec);
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(signal.listenerCount('abort'), 0);
}));
}
{
Promise.all(
[1, '', false, Infinity].map(
(i) => assert.rejects(setPromiseTimeout(10, null, i), {
code: 'ERR_INVALID_ARG_TYPE'
})
)
).then(common.mustCall());
Promise.all(
[1, '', false, Infinity, null, {}].map(
(signal) => assert.rejects(setPromiseTimeout(10, null, { signal }), {
code: 'ERR_INVALID_ARG_TYPE'
})
)
).then(common.mustCall());
Promise.all(
[1, '', Infinity, null, {}].map(
(ref) => assert.rejects(setPromiseTimeout(10, null, { ref }), {
code: 'ERR_INVALID_ARG_TYPE'
})
)
).then(common.mustCall());
}
{
exec(`${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, '');
}));
}