Files
bun.sh/test/js/bun/spawn/spawn-streaming-stdout.test.ts
2024-09-03 21:32:52 -07:00

55 lines
1.7 KiB
TypeScript

import { spawn } from "bun";
import { expect, test } from "bun:test";
import { bunEnv, bunExe, dumpStats, expectMaxObjectTypeCount, gcTick, getMaxFD } from "harness";
test("spawn can read from stdout multiple chunks", async () => {
gcTick(true);
var maxFD: number = -1;
let concurrency = 7;
const count = 100;
const interval = setInterval(dumpStats, 1000).unref();
for (let i = 0; i < count; ) {
const promises = new Array(concurrency);
for (let j = 0; j < concurrency; j++) {
promises[j] = (async function () {
const proc = spawn({
cmd: [bunExe(), import.meta.dir + "/spawn-streaming-stdout-repro.js"],
stdin: "ignore",
stdout: "pipe",
stderr: "ignore",
env: bunEnv,
});
var chunks = [];
let counter = 0;
try {
for await (var chunk of proc.stdout) {
chunks.push(chunk);
counter++;
if (counter > 3) break;
}
} catch (e: any) {
console.log(e.stack);
throw e;
}
expect(counter).toBe(4);
proc.kill();
expect(Buffer.concat(chunks).toString()).toStartWith("Wrote to stdout\n".repeat(4));
await proc.exited;
})();
}
await Promise.all(promises);
i += concurrency;
if (maxFD === -1) {
maxFD = getMaxFD();
}
}
const newMaxFD = getMaxFD();
expect(newMaxFD).toBe(maxFD);
clearInterval(interval);
await expectMaxObjectTypeCount(expect, "ReadableStream", 10);
await expectMaxObjectTypeCount(expect, "ReadableStreamDefaultReader", 10);
await expectMaxObjectTypeCount(expect, "ReadableByteStreamController", 10);
await expectMaxObjectTypeCount(expect, "Subprocess", 5);
dumpStats();
}, 60_0000);