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]();