mirror of
https://github.com/morluto/rea.git
synced 2026-11-12 01:41:21 +00:00
* fix(process): preserve UTF-8 at diagnostic truncation boundaries * fix(process): preserve malformed UTF-8 excerpt evidence
67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { execFileBoundedOutput } from "./ExecFileBoundedOutput.js";
|
|
|
|
describe("execFileBoundedOutput", () => {
|
|
it("retains complete UTF-8 characters at both sides of truncated command output", async () => {
|
|
const text = `A🙂${"x".repeat(30)}🙂Z`;
|
|
const result = await execFileBoundedOutput(
|
|
process.execPath,
|
|
[
|
|
"-e",
|
|
`process.stdout.write(${JSON.stringify(text)}); process.stderr.write(${JSON.stringify(text)});`,
|
|
],
|
|
{ env: {}, limit: 8 },
|
|
);
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.stdout).toBe("A … [output omitted] … Z");
|
|
expect(result.stderr).toBe("A … [output omitted] … Z");
|
|
expect(result.outputTruncated).toBe(true);
|
|
});
|
|
|
|
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: {}, 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: {}, 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: {}, 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);
|
|
});
|
|
});
|