From 17b7ec4df3b3dda2ac48b71ab379eefd4b50a379 Mon Sep 17 00:00:00 2001 From: Sonny <47546413+sonsurim@users.noreply.github.com> Date: Sun, 4 Aug 2024 04:52:44 +0900 Subject: [PATCH] test: add initial pull delay and prototype pollution prevention tests Refs : https://github.com/nodejs/node/blob/main/lib/internal/webstreams/readablestream.js#L522-L536 PR-URL: https://github.com/nodejs/node/pull/54061 Reviewed-By: James M Snell --- test/parallel/test-whatwg-readablestream.js | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/parallel/test-whatwg-readablestream.js b/test/parallel/test-whatwg-readablestream.js index 122500a3cfe0d5..9af751ddd02958 100644 --- a/test/parallel/test-whatwg-readablestream.js +++ b/test/parallel/test-whatwg-readablestream.js @@ -1701,3 +1701,50 @@ class Source { assert.deepStrictEqual(value, new Uint8Array([1, 1, 1])); })); } + +// Initial Pull Delay +{ + const stream = new ReadableStream({ + start(controller) { + controller.enqueue('data'); + controller.close(); + } + }); + + const iterator = stream.values(); + + let microtaskCompleted = false; + Promise.resolve().then(() => { microtaskCompleted = true; }); + + iterator.next().then(common.mustCall(({ done, value }) => { + assert.strictEqual(done, false); + assert.strictEqual(value, 'data'); + assert.strictEqual(microtaskCompleted, true); + })); +} + +// Avoiding Prototype Pollution +{ + const stream = new ReadableStream({ + start(controller) { + controller.enqueue('data'); + controller.close(); + } + }); + + const iterator = stream.values(); + + // Modify Promise.prototype.then to simulate prototype pollution + const originalThen = Promise.prototype.then; + Promise.prototype.then = function(onFulfilled, onRejected) { + return originalThen.call(this, onFulfilled, onRejected); + }; + + iterator.next().then(common.mustCall(({ done, value }) => { + assert.strictEqual(done, false); + assert.strictEqual(value, 'data'); + + // Restore original then method + Promise.prototype.then = originalThen; + })); +}