import { expect, test } from "bun:test"; import { isWindows } from "harness"; const BYTES_TO_WRITE = 500_000; // https://github.com/oven-sh/bun/issues/12198 test.skipIf(isWindows)( "Absolute memory usage remains relatively constant when reading and writing to a pipe", async () => { async function write(bytes: number) { const buf = Buffer.alloc(bytes, "foo"); await cat.stdin.write(buf); } async function read(bytes: number) { let i = 0; while (true) { const { value } = await r.read(); i += value?.length ?? 0; if (i >= bytes) { return; } } } async function readAndWrite(bytes = BYTES_TO_WRITE) { await Promise.all([write(bytes), read(bytes)]); } await using cat = Bun.spawn(["cat"], { stdin: "pipe", stdout: "pipe", stderr: "inherit", }); const r = cat.stdout.getReader() as any; const rounds = 5000; for (let i = 0; i < rounds; i++) { await readAndWrite(BYTES_TO_WRITE); } Bun.gc(true); const before = process.memoryUsage.rss(); for (let i = 0; i < rounds; i++) { await readAndWrite(); } Bun.gc(true); const after = process.memoryUsage.rss(); for (let i = 0; i < rounds; i++) { await readAndWrite(); } Bun.gc(true); const after2 = process.memoryUsage.rss(); console.log({ after, after2 }); console.log(require("bun:jsc").heapStats()); console.log("RSS delta", ((after - before) | 0) / 1024 / 1024); console.log("RSS total", (after / 1024 / 1024) | 0, "MB"); expect(after).toBeLessThan(250 * 1024 * 1024); expect(after).toBeLessThan(before * 1.5); }, );