Commit 29647122658 for nodejs
commit 296471226583f1cadf9d5a6267ed60ab52552a42
Author: James M Snell <jasnell@gmail.com>
Date: Sun Aug 30 19:23:31 2026 +0000
test: avoid using promise wrapped timers
Just say no to `new Promise(() => timer(...))` use
promisified timers
Signed-off-by: James M Snell <jasnell@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/66079
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
diff --git a/test/parallel/test-stream-iter-broadcast-basic.js b/test/parallel/test-stream-iter-broadcast-basic.js
index 4135aea6d97..4384c2b0d6d 100644
--- a/test/parallel/test-stream-iter-broadcast-basic.js
+++ b/test/parallel/test-stream-iter-broadcast-basic.js
@@ -3,7 +3,7 @@
const common = require('../common');
const assert = require('assert');
-const { setTimeout } = require('timers/promises');
+const { setTimeout, setImmediate } = require('timers/promises');
const { broadcast, text } = require('stream/iter');
// =============================================================================
@@ -223,7 +223,7 @@ async function testCancelWithReason() {
const resultPromise = text(consumer).catch((err) => err);
// Give the consumer time to enter the waiting state
- await new Promise((resolve) => setImmediate(resolve));
+ await setImmediate();
bc.cancel(new Error('cancelled'));
diff --git a/test/parallel/test-stream-iter-consumers-merge.js b/test/parallel/test-stream-iter-consumers-merge.js
index becf68ee63a..f3b9ebc24b3 100644
--- a/test/parallel/test-stream-iter-consumers-merge.js
+++ b/test/parallel/test-stream-iter-consumers-merge.js
@@ -12,6 +12,7 @@ const {
toAsyncStreamable,
toStreamable,
} = require('stream/iter');
+const { setTimeout, setImmediate } = require('timers/promises');
// =============================================================================
// merge
@@ -89,7 +90,7 @@ async function testMergeSourceError() {
const enc = new TextEncoder();
yield [enc.encode('a')];
// Slow so the bad source errors first
- await new Promise((r) => setTimeout(r, 50));
+ await setTimeout(50);
yield [enc.encode('b')];
}
@@ -159,7 +160,7 @@ async function testMergeSourceErrorDoesNotAwaitCleanup() {
() => ({ __proto__: null, status: 'fulfilled' }),
(error) => ({ __proto__: null, status: 'rejected', error }),
),
- new Promise((resolve) => setImmediate(resolve, timedOut)),
+ setImmediate(timedOut),
]);
assert.notStrictEqual(outcome, timedOut);
@@ -181,7 +182,7 @@ async function testMergeBreakDoesNotAwaitCleanup() {
}
return true;
})(),
- new Promise((resolve) => setImmediate(resolve, timedOut)),
+ setImmediate(timedOut),
]);
assert.strictEqual(outcome, true);
@@ -194,7 +195,7 @@ async function testMergeNaNAbortDoesNotAwaitCleanup() {
signal: ac.signal,
})[Symbol.asyncIterator]();
const next = iterator.next();
- await new Promise(setImmediate);
+ await setImmediate();
ac.abort(NaN);
const timedOut = { __proto__: null };
@@ -203,7 +204,7 @@ async function testMergeNaNAbortDoesNotAwaitCleanup() {
() => ({ __proto__: null, status: 'fulfilled' }),
(error) => ({ __proto__: null, status: 'rejected', error }),
),
- new Promise((resolve) => setImmediate(resolve, timedOut)),
+ setImmediate(timedOut),
]);
assert.notStrictEqual(outcome, timedOut);
@@ -234,7 +235,7 @@ async function testMergeConsumerBreak() {
break; // Break after first batch
}
// Give async cleanup a tick to complete
- await new Promise(setImmediate);
+ await setImmediate();
// Both sources should be cleaned up
assert.strictEqual(source1Return && source2Return, true);
}
@@ -244,7 +245,7 @@ async function testMergeSignalMidIteration() {
async function* slowSource() {
const enc = new TextEncoder();
yield [enc.encode('a')];
- await new Promise((r) => setTimeout(r, 100));
+ await setTimeout(100);
yield [enc.encode('b')];
}
const merged = merge(slowSource(), { signal: ac.signal });
@@ -297,7 +298,7 @@ async function testMergeSignalDuringPendingSingleSourceRead() {
})[Symbol.asyncIterator]();
const next = iter.next();
- await new Promise(setImmediate);
+ await setImmediate();
ac.abort();
await assert.rejects(next, { name: 'AbortError' });
@@ -322,7 +323,7 @@ async function testMergeDoesNotDrainSourcesWhileIdle() {
const iterator = merge(a, b)[Symbol.asyncIterator]();
await iterator.next();
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(a.pulls, 1);
assert.strictEqual(b.pulls, 1);
diff --git a/test/parallel/test-stream-iter-duplex.js b/test/parallel/test-stream-iter-duplex.js
index 354fa28b67a..af2fcb7dd10 100644
--- a/test/parallel/test-stream-iter-duplex.js
+++ b/test/parallel/test-stream-iter-duplex.js
@@ -4,6 +4,7 @@
const common = require('../common');
const assert = require('assert');
const { duplex, text, bytes } = require('stream/iter');
+const { setImmediate } = require('timers/promises');
// =============================================================================
// Basic duplex
@@ -185,7 +186,7 @@ async function testCloseWaitsForDrain() {
const closing = channelA.close().then(common.mustCall(() => {
closed = true;
}));
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(closed, false);
assert.strictEqual(await text(channelB.readable), 'buffered');
diff --git a/test/parallel/test-stream-iter-pipeto.js b/test/parallel/test-stream-iter-pipeto.js
index 4711b291a7a..ed1614552f9 100644
--- a/test/parallel/test-stream-iter-pipeto.js
+++ b/test/parallel/test-stream-iter-pipeto.js
@@ -4,6 +4,7 @@
const common = require('../common');
const assert = require('assert');
const { pipeTo, pipeToSync, from, fromSync } = require('stream/iter');
+const { setTimeout } = require('timers/promises');
async function testPipeToSync() {
const written = [];
@@ -94,7 +95,7 @@ async function testPipeToWithSignal() {
};
async function* slowSource() {
yield [new TextEncoder().encode('a')];
- await new Promise((r) => setTimeout(r, 50));
+ await setTimeout(50);
yield [new TextEncoder().encode('b')];
}
ac.abort();
diff --git a/test/parallel/test-stream-iter-pull-async.js b/test/parallel/test-stream-iter-pull-async.js
index c341cf296dd..452ff3b1734 100644
--- a/test/parallel/test-stream-iter-pull-async.js
+++ b/test/parallel/test-stream-iter-pull-async.js
@@ -14,6 +14,8 @@ const {
toAsyncStreamable,
} = require('stream/iter');
+const { setImmediate } = require('timers/promises');
+
async function testPullIdentity() {
const data = await text(pull(from('hello-async')));
assert.strictEqual(data, 'hello-async');
@@ -166,7 +168,7 @@ async function testTransformSignalListenerErrorOnSourceError() {
);
// Give the nextTick rethrow a chance to fire
- await new Promise(setImmediate);
+ await setImmediate();
process.removeListener('uncaughtException', handler);
assert.strictEqual(uncaughtErrors.length, 1);
@@ -249,7 +251,7 @@ async function testPullReturnWhileSourceNextPending() {
const timeout = {};
const result = await Promise.race([
iter.return(),
- new Promise((resolve) => setImmediate(resolve, timeout)),
+ setImmediate(timeout),
]);
assert.notStrictEqual(result, timeout);
@@ -327,7 +329,7 @@ async function testPullConsumerBreakCleanup() {
break;
}
// Give the abort handler a tick to fire
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(signalAborted, true);
}
diff --git a/test/parallel/test-stream-iter-push-backpressure.js b/test/parallel/test-stream-iter-push-backpressure.js
index 31be8eb46ba..9fb3325f342 100644
--- a/test/parallel/test-stream-iter-push-backpressure.js
+++ b/test/parallel/test-stream-iter-push-backpressure.js
@@ -4,6 +4,7 @@
const common = require('../common');
const assert = require('assert');
const { push, text } = require('stream/iter');
+const { setImmediate } = require('timers/promises');
async function testStrictBackpressure() {
const kChunk = new Uint8Array(16384).fill(65); // 'A'
@@ -74,7 +75,7 @@ async function testBlockBackpressure() {
// The write cannot resolve until the buffer is drained, so a microtask
// tick is sufficient to confirm it is still blocked.
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(writeState, 'pending'); // Still blocked
// Read from the consumer to drain
@@ -83,7 +84,7 @@ async function testBlockBackpressure() {
assert.strictEqual(first.done, false);
// After draining, the pending write resolves as a microtask
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(writeState, 'resolved'); // Now unblocked
writer.endSync();
diff --git a/test/parallel/test-stream-iter-push-writer.js b/test/parallel/test-stream-iter-push-writer.js
index 854bd69f0ac..bf768fc38cc 100644
--- a/test/parallel/test-stream-iter-push-writer.js
+++ b/test/parallel/test-stream-iter-push-writer.js
@@ -4,6 +4,7 @@
const common = require('../common');
const assert = require('assert');
const { push, ondrain, text } = require('stream/iter');
+const { setImmediate } = require('timers/promises');
async function testOndrain() {
const { writer } = push({ budget: 16384 });
@@ -39,7 +40,7 @@ async function testDropPoliciesReportPhysicalCapacity() {
// Drop policies still accept writes despite having no physical capacity.
assert.strictEqual(writer.writeSync(chunk), true);
assert.strictEqual(writer.canWrite, false);
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(drained, false);
assert.strictEqual((await iterator.next()).done, false);
@@ -224,7 +225,7 @@ async function testWritevSyncInvalidChunkDoesNotQueue() {
const next = iter.next();
const result = await Promise.race([
next.then(() => 'resolved'),
- new Promise((resolve) => setImmediate(resolve, 'pending')),
+ setImmediate('pending'),
]);
assert.strictEqual(result, 'pending');
@@ -376,7 +377,7 @@ async function testOndrainWaitsForDrain() {
let drainState = 'pending';
const drainPromise = ondrain(writer).then((v) => { drainState = v; });
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(drainState, 'pending'); // Still waiting
// Read to drain
@@ -429,7 +430,7 @@ async function testEndResolvesPendingRead() {
const readPromise = iter.next();
// Give the read a tick to enter the pending state
- await new Promise(setImmediate);
+ await setImmediate();
// End the writer — should resolve the pending read with done:true
writer.endSync();
@@ -444,7 +445,7 @@ async function testFailRejectsPendingRead() {
const iter = readable[Symbol.asyncIterator]();
const readPromise = iter.next();
- await new Promise(setImmediate);
+ await setImmediate();
writer.fail(new Error('fail during read'));
await assert.rejects(
@@ -460,7 +461,7 @@ async function testConsumerReturnResolvesPendingRead() {
const iter = readable[Symbol.asyncIterator]();
const readPromise = iter.next();
- await new Promise(setImmediate);
+ await setImmediate();
const returnResult = await iter.return();
assert.strictEqual(returnResult.value, undefined);
@@ -492,7 +493,7 @@ async function testConsumerThrowRejectsPendingRead() {
const iter = readable[Symbol.asyncIterator]();
const readPromise = iter.next();
- await new Promise(setImmediate);
+ await setImmediate();
const err = new Error('consumer read boom');
const readRejects = assert.rejects(
@@ -657,7 +658,7 @@ async function testFailRejectsPendingReadWithFalsyReason() {
const iter = readable[Symbol.asyncIterator]();
const readPromise = iter.next();
- await new Promise(setImmediate);
+ await setImmediate();
writer.fail(false);
await readPromise.then(
diff --git a/test/parallel/test-stream-iter-readable-interop.js b/test/parallel/test-stream-iter-readable-interop.js
index 7cb136ba86b..5c7b8ed42cd 100644
--- a/test/parallel/test-stream-iter-readable-interop.js
+++ b/test/parallel/test-stream-iter-readable-interop.js
@@ -7,7 +7,7 @@
const common = require('../common');
const assert = require('assert');
const { Readable } = require('stream');
-const { setImmediate } = require('timers/promises');
+const { setImmediate, setTimeout: wait } = require('timers/promises');
const {
from,
pull,
@@ -381,7 +381,7 @@ async function testEarlyTermination() {
assert.ok(batches.length >= 1);
// Stream should be destroyed after consumer return
// Give it a tick to clean up
- await new Promise((resolve) => setTimeout(resolve, 50));
+ await wait(50);
assert.ok(readable.destroyed);
}
diff --git a/test/parallel/test-stream-iter-share-async.js b/test/parallel/test-stream-iter-share-async.js
index dafb157a751..ab6bc091479 100644
--- a/test/parallel/test-stream-iter-share-async.js
+++ b/test/parallel/test-stream-iter-share-async.js
@@ -9,7 +9,7 @@ const {
text,
} = require('stream/iter');
-const { setTimeout } = require('timers/promises');
+const { setTimeout, setImmediate } = require('timers/promises');
// =============================================================================
// Async share()
@@ -111,7 +111,7 @@ async function testShareCancelMidIteration() {
assert.strictEqual(items.length, 1);
assert.strictEqual(items[0], 'a');
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(sourceReturnCalled, true);
}
@@ -185,7 +185,7 @@ async function testShareCancelWhileSourcePullPending() {
const timedOut = { __proto__: null };
const outcome = await Promise.race([
read,
- new Promise((resolve) => setImmediate(resolve, timedOut)),
+ setImmediate(timedOut),
]);
assert.notStrictEqual(outcome, timedOut);
if (reason === noReason) {
@@ -202,7 +202,7 @@ async function testShareCancelWhileSourcePullPending() {
done: false,
value: [Uint8Array.of(1)],
});
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(returnCalls, 1);
}
}
diff --git a/test/parallel/test-stream-iter-share-from.js b/test/parallel/test-stream-iter-share-from.js
index 69b782ce560..d3fb844eab0 100644
--- a/test/parallel/test-stream-iter-share-from.js
+++ b/test/parallel/test-stream-iter-share-from.js
@@ -11,9 +11,10 @@ const {
SyncShare,
text,
textSync,
-
} = require('stream/iter');
+const { setImmediate } = require('timers/promises');
+
// =============================================================================
// Share.from
// =============================================================================
@@ -202,7 +203,7 @@ async function testShareDropNewest() {
});
await secondPullStarted;
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(pulls, 2);
assert.strictEqual(nextSettled, false);
diff --git a/test/parallel/test-stream-iter-writable-interop.js b/test/parallel/test-stream-iter-writable-interop.js
index 52824b2168b..af2e05aae94 100644
--- a/test/parallel/test-stream-iter-writable-interop.js
+++ b/test/parallel/test-stream-iter-writable-interop.js
@@ -137,7 +137,9 @@ async function testErrorBeforeBackpressureIsStored() {
});
const writer = fromWritable(writable);
const reason = new Error('early stream error');
- const closed = new Promise((resolve) => writable.once('close', resolve));
+ const { promise, resolve } = Promise.withResolvers();
+ writable.once('close', resolve);
+ const closed = promise;
writable.destroy(reason);
await assert.rejects(writer.write('late'), (error) => error === reason);
@@ -151,12 +153,13 @@ async function testAlreadyErroredWritablePreservesReason() {
write(chunk, enc, cb) { cb(); },
});
const reason = new Error('existing stream error');
- const closed = new Promise((resolve) => writable.once('close', resolve));
+ const { promise, resolve } = Promise.withResolvers();
+ writable.once('close', resolve);
writable.destroy(reason);
const writer = fromWritable(writable);
await assert.rejects(writer.write('late'), (error) => error === reason);
- await closed;
+ await promise;
}
async function testCleanDestroyRejectsQueuedOperations() {
diff --git a/test/parallel/test-stream-iter-writer-reentrancy.js b/test/parallel/test-stream-iter-writer-reentrancy.js
index 119bda26923..2fd760b83e3 100644
--- a/test/parallel/test-stream-iter-writer-reentrancy.js
+++ b/test/parallel/test-stream-iter-writer-reentrancy.js
@@ -4,6 +4,7 @@
const common = require('../common');
const assert = require('assert');
const { broadcast, push } = require('stream/iter');
+const { setImmediate } = require('timers/promises');
const factories = [
() => push({ budget: 16384 }),
@@ -31,7 +32,7 @@ async function testWritevReentrancy() {
const write = writer.writev(chunks).then(common.mustCall(() => {
resolved = true;
}));
- await new Promise(setImmediate);
+ await setImmediate();
assert.strictEqual(resolved, false);
const iterator = readable[Symbol.asyncIterator]();