rea/src/process/ExecFileBoundedOutput.test.ts

51 lines
1.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { execFileBoundedOutput } from "./ExecFileBoundedOutput.js";
describe("execFileBoundedOutput", () => {
it("lets a command finish after its output exceeds the capture limit", async () => {
const result = await execFileBoundedOutput(
process.execPath,
[
"-e",
"process.stdout.write('x'.repeat(70000)); process.stderr.write('failure detail');",
],
{ env: process.env, limit: 64 * 1024 },
);
expect(result.exitCode).toBe(0);
expect(Buffer.byteLength(result.stdout)).toBeLessThan(64 * 1024 + 50);
expect(result.stdout).toContain("[output omitted]");
expect(result.stderr).toBe("failure detail");
expect(result.outputTruncated).toBe(true);
});
it("retains a failing command's status and stderr after verbose stdout", async () => {
const result = await execFileBoundedOutput(
process.execPath,
[
"-e",
"process.stdout.write('x'.repeat(70000)); process.stderr.write('package conflict'); process.exitCode = 1;",
],
{ env: process.env, limit: 64 * 1024 },
);
expect(result.exitCode).toBe(1);
expect(result.stderr).toBe("package conflict");
expect(result.outputTruncated).toBe(true);
});
it("retains a final error after a long prefix in the same stream", async () => {
const result = await execFileBoundedOutput(
process.execPath,
[
"-e",
"process.stderr.write('warning '.repeat(10000)); process.stderr.write('error: final conflict'); process.exitCode = 1;",
],
{ env: process.env, limit: 64 * 1024 },
);
expect(result.exitCode).toBe(1);
expect(result.stderr).toContain("[output omitted]");
expect(result.stderr).toContain("error: final conflict");
expect(result.outputTruncated).toBe(true);
});
});