node/test/parallel/test-stream-readable-to-web.mjs
Ethan Arrowood fa458d2fee
test: deflake stream-readable-to-web test
Co-authored-by: Luigi Pinca <luigipinca@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/58948
Fixes: https://github.com/nodejs/node/issues/58949
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Mattias Buelens <mattias@buelens.com>
Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Zeyu "Alex" Yang <himself65@outlook.com>
Reviewed-By: Daeyeon Jeong <daeyeon.dev@gmail.com>
2025-08-02 04:25:35 +00:00

64 lines
1.6 KiB
JavaScript

import { mustCall } from '../common/index.mjs';
import { Readable } from 'node:stream';
import { memoryUsage } from 'node:process';
import assert from 'node:assert';
import { setImmediate } from 'node:timers/promises';
// Based on: https://github.com/nodejs/node/issues/46347#issuecomment-1413886707
// edit: make it cross-platform as /dev/urandom is not available on Windows
const MAX_MEM = 256 * 1024 * 1024; // 256 MiB
function checkMemoryUsage() {
assert(memoryUsage().arrayBuffers < MAX_MEM);
}
const MAX_BUFFERS = 1000;
let buffersCreated = 0;
const randomNodeStream = new Readable({
read(size) {
if (buffersCreated >= MAX_BUFFERS) {
this.push(null);
return;
}
this.push(Buffer.alloc(size));
buffersCreated++;
}
});
randomNodeStream.on('error', (err) => {
assert.fail(err);
});
// Before doing anything, make sure memory usage is okay
checkMemoryUsage();
// Create stream and check memory usage remains okay
const randomWebStream = Readable.toWeb(randomNodeStream);
checkMemoryUsage();
let timeout;
try {
// Wait two seconds before consuming the stream to see if memory usage increases
timeout = setTimeout(mustCall(async () => {
// Did the stream leak memory?
checkMemoryUsage();
// eslint-disable-next-line no-unused-vars
for await (const _ of randomWebStream) {
// Yield event loop to allow garbage collection
await setImmediate();
// consume the stream
// check memory usage remains okay
checkMemoryUsage();
}
}), 2000);
} catch (err) {
if (timeout) {
clearTimeout(timeout);
}
assert.fail(err);
}