Files
rea/tests/acceptance/goBinaryCli.test.ts
T
morluto 6ba6aea5eb fix(parsers): respect container facts and real decoding boundaries
Use zip.js's parsed symlink fact for inventory and open refusal. Treat an
unmatched Godot trailer as an unconfirmed candidate while preserving failures
for confirmed malformed packs. Report entropy path-resolution failures at the
selected-input boundary.

Separate Go header discovery from inline string extents in ELF and Mach-O,
and apply the aggregate content allowance after validating real source ranges.
Normalize binary plist UID widths through the existing scalar-copy owner,
budget exact clone growth, preserve source identity, and refuse inexact UIDs.

Validation: 389 distinct tests passed, one Linux /proc test skipped on Darwin;
build, typecheck/lint, docs, single-thread formatting, and discovery (2142 files)
passed. CLI/MCP Go fixtures and public ZIP/Godot/keyed-archive workflows ran.
Real producer prevalence and external provider execution were not established.

Repeated ordinary keyed-archive CLI inventory facts and estimated reply tokens
were equal before/after. Warm median elapsed was 0.5166s / 0.5177s; no speed claim.

Fixes #6751
Fixes #6763
Fixes #6754
Fixes #6767
Fixes #6762
Fixes #6779
2026-10-23 23:02:07 +08:00

626 lines
22 KiB
TypeScript

import { goBinarySchema } from "../../src/domain/go/goBinary.js";
import { evidenceResultOf } from "../../src/contracts/toolOutputSchemaPrimitives.js";
import { readFile, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { createHash } from "node:crypto";
import { expect } from "vitest";
import { machoImageWithUnknownCommand } from "../../src/artifacts/apple/MachoImage.fixture.js";
import {
createGoBinaryByteStringFixture,
createGoBinaryDiagnosticFixtures,
createGoBinaryFixture,
createGoSplitElfFixture,
createGoOverlappingElfFixture,
createGoBinaryPathFailureFixture,
createGoInlineAggregateFixture,
setGoPeVirtualSize,
setGoElfLoadFileSize,
setGoMachOSectionSize,
setGoMachOSegmentFileSize,
GO_MODULE_TEXT,
} from "../fixtures/go/image.js";
import { createTestTempDirectory } from "../fixtures/temporaryDirectory.js";
import { cliTest, runFileCli } from "../support/cli/cliFixture.js";
import { parseEvidence } from "../../src/domain/evidence.js";
import { connectLocalToolsMcp } from "../fixtures/localToolsMcp.js";
import { parseMcpToolError } from "../fixtures/mcpToolError.js";
cliTest(
"reads Mach-O inline Go strings beyond a header-only discovery section through CLI and MCP",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-macho-inline-range-");
const { client, call } = await connectLocalToolsMcp();
const complete = createGoBinaryFixture({ format: "macho" });
setGoMachOSectionSize(complete.bytes, 32);
const truncated = createGoBinaryFixture({ format: "macho" });
setGoMachOSectionSize(truncated.bytes, 32);
setGoMachOSegmentFileSize(
truncated.bytes,
truncated.moduleOffset + truncated.moduleBytes.length - 1,
);
for (const item of [
{ name: "header-only", bytes: complete.bytes, expected: "success" },
{ name: "truncated", bytes: truncated.bytes, expected: "malformed" },
] as const) {
const path = join(root, `${item.name}.macho`);
await writeFile(path, item.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
const response = await call("inspect_go_binary", { path });
if (item.expected === "success") {
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.normalized_result).toMatchObject({
format: "macho",
build_info: {
header_offset: complete.headerOffset,
go_version: "go1.26.0",
module: { path: "example.com/tool/cmd/tool" },
},
});
expect(response.isError, JSON.stringify(response)).not.toBe(true);
expect(response.structuredContent).toEqual(evidence);
} else {
const expected = {
code: "invalid_request",
details: {
operation: "inspect_go_binary",
issues: [{ path: ["path"], reason: "invalid_format" }],
},
};
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject(expected);
expect(parseMcpToolError(response).error).toMatchObject(expected);
}
}
await client.ping();
},
60000,
);
cliTest(
"counts inline Go string contents separately from varint framing through CLI and MCP",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-inline-budget-");
const { client, call } = await connectLocalToolsMcp();
const maximum = 1024 * 1024;
const cases = [
{
name: "exact",
fixture: createGoInlineAggregateFixture(maximum),
outcome: "success",
},
{
name: "over",
fixture: createGoInlineAggregateFixture(maximum + 1),
outcome: "resource",
},
{
name: "truncated",
fixture: createGoInlineAggregateFixture(512),
outcome: "malformed",
},
] as const;
for (const item of cases) {
if (item.name === "truncated")
setGoElfLoadFileSize(
item.fixture.bytes,
item.fixture.moduleOffset + item.fixture.moduleBytes.length - 1,
);
const path = join(root, `${item.name}.elf`);
await writeFile(path, item.fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
const response = await call("inspect_go_binary", { path });
if (item.outcome === "success") {
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
const buildInfo = evidence.normalized_result.build_info;
expect(buildInfo).not.toBeNull();
expect(
buildInfo!.version_location.bytes + buildInfo!.module_location.bytes,
).toBe(maximum);
expect(
item.fixture.moduleOffset +
item.fixture.moduleBytes.length -
item.fixture.headerOffset,
).toBeGreaterThan(maximum + 32);
expect(response.isError, JSON.stringify(response)).not.toBe(true);
expect(response.structuredContent).toEqual(evidence);
} else {
const code =
item.outcome === "resource"
? "resource_constraint"
: "invalid_request";
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code,
details: {
operation: "inspect_go_binary",
...(item.outcome === "resource"
? {
resource: "memory",
reported_limits: {
boundary: "build-info",
maximum_bytes: maximum,
},
}
: { issues: [{ path: ["path"], reason: "invalid_format" }] }),
},
});
expect(parseMcpToolError(response).error).toMatchObject({
code,
details: {
operation: "inspect_go_binary",
...(item.outcome === "resource"
? {
resource: "memory",
reported_limits: {
boundary: "build-info",
maximum_bytes: maximum,
},
}
: { issues: [{ path: ["path"], reason: "invalid_format" }] }),
},
});
}
}
await client.ping();
},
60000,
);
cliTest(
"delivers a Go CLI summary with its unchanged complete source bundle",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-summary-");
const path = join(root, "application.elf");
const output = join(root, "source.json");
await writeFile(path, createGoBinaryFixture().bytes);
const complete = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(complete.exitCode, complete.stderr).toBe(0);
const full = evidenceResultOf(goBinarySchema).parse(complete.json);
const summary = await runFileCli(cli, {
arguments: [
"inspect-go-binary",
path,
"--detail",
"summary",
"--evidence_output",
output,
"--json",
],
});
expect(summary.exitCode, summary.stderr).toBe(0);
expect(summary.json).toMatchObject({
summary: {
normalized_result: {
kind: "summary",
parent_evidence_id: full.evidence_id,
source_coverage: { runtime_dependencies: "unknown" },
},
},
});
const bundle = JSON.parse(await readFile(output, "utf8")) as {
records: unknown[];
};
expect(
bundle.records
.map((record) => parseEvidence(record))
.find((record) => record.evidence_id === full.evidence_id),
).toEqual(full);
const refused = await runFileCli(cli, {
arguments: [
"inspect-go-binary",
join(root, "missing"),
"--detail",
"summary",
"--json",
],
});
expect(refused.exitCode).toBe(1);
expect(refused.json).toMatchObject({
code: "invalid_request",
details: { issues: [{ path: ["evidence_output"] }] },
});
},
30000,
);
cliTest(
"bounds overlapping ELF scans through CLI and keeps MCP responsive",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-overlap-");
const path = join(root, "overlapping.elf");
await writeFile(path, createGoOverlappingElfFixture());
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode).toBe(1);
const expected = {
code: "resource_constraint",
details: {
operation: "inspect_go_binary",
resource: "cpu",
reported_limits: {
boundary: "search",
maximum_bytes: 256 * 1024 * 1024,
},
},
};
expect(result.json).toMatchObject(expected);
const { client, call } = await connectLocalToolsMcp();
const response = await call("inspect_go_binary", { path });
expect(parseMcpToolError(response).error).toMatchObject(expected);
await client.ping();
},
30000,
);
cliTest(
"retains later-load sectionless ELF evidence through public CLI and stdio MCP",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-split-elf-");
const { client, call } = await connectLocalToolsMcp();
const infos = [];
for (const sectionless of [false, true]) {
const fixture = createGoSplitElfFixture({ sectionless });
const path = join(root, sectionless ? "sectionless.elf" : "original.elf");
await writeFile(path, fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.normalized_result.build_info).not.toBeNull();
infos.push(evidence.normalized_result.build_info);
const response = await call("inspect_go_binary", { path });
expect(response.isError, JSON.stringify(response)).not.toBe(true);
expect(response.structuredContent).toEqual(evidence);
}
expect(infos[1]).toEqual(infos[0]);
await client.ping();
},
30000,
);
for (const bits of [32, 64] as const) {
for (const encoding of ["inline", "pointer"] as const) {
cliTest(
`preserves PE ${bits}-bit ${encoding} build info at zero VirtualSize through CLI and stdio MCP`,
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-pe-zero-vsize-");
const fixture = createGoBinaryFixture({ format: "pe", bits, encoding });
const ordinaryBytes = Buffer.from(fixture.bytes);
const zeroSizeBytes = Buffer.from(fixture.bytes);
setGoPeVirtualSize(zeroSizeBytes, 0);
const { client, call } = await connectLocalToolsMcp();
const buildInfos = [];
for (const [label, bytes] of [
["ordinary", ordinaryBytes],
["zero-vsize", zeroSizeBytes],
] as const) {
const path = join(root, `${label}.exe`);
await writeFile(path, bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.subject?.digest.sha256).toBe(
createHash("sha256").update(bytes).digest("hex"),
);
expect(evidence.normalized_result.build_info).toMatchObject({
go_version: "go1.26.0",
encoding,
header_offset: fixture.headerOffset,
module_text: GO_MODULE_TEXT,
});
buildInfos.push(evidence.normalized_result.build_info);
const response = await call("inspect_go_binary", { path });
expect(response.isError, JSON.stringify(response)).not.toBe(true);
expect(response.structuredContent).toEqual(evidence);
}
expect(buildInfos[1]).toEqual(buildInfos[0]);
await client.ping();
},
30000,
);
}
}
cliTest(
"rejects misaligned 64-bit Mach-O through Go CLI and stdio MCP",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-macho-alignment-");
const { client, call } = await connectLocalToolsMcp();
const expectedFailure = {
code: "invalid_request",
details: {
operation: "inspect_go_binary",
issues: [{ path: ["path"], reason: "invalid_format" }],
},
};
for (const fixture of [
{ wide: true, size: 12, bits: 64, malformed: true },
{ wide: true, size: 16, bits: 64, malformed: false },
{ wide: false, size: 12, bits: 32, malformed: false },
]) {
const path = join(root, `image-${fixture.bits}-${fixture.size}.macho`);
await writeFile(
path,
machoImageWithUnknownCommand(fixture.wide, fixture.size),
);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
const response = await call("inspect_go_binary", { path });
if (fixture.malformed) {
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject(expectedFailure);
expect(result.json).not.toHaveProperty("normalized_result");
expect(parseMcpToolError(response).error).toMatchObject(
expectedFailure,
);
expect(response.structuredContent).toBeUndefined();
continue;
}
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.normalized_result).toMatchObject({
format: "macho",
bits: fixture.bits,
build_info: null,
});
expect(response.isError, JSON.stringify(response)).not.toBe(true);
expect(response.structuredContent).toEqual(evidence);
}
await client.ping();
},
30000,
);
for (const expectedErrno of ["ELOOP", "ENAMETOOLONG"] as const) {
cliTest.skipIf(expectedErrno === "ELOOP" && process.platform === "win32")(
`reports native ${expectedErrno} path failure as invalid selected-path input through the public Go CLI`,
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-path-failure-");
const { path, errno } = await createGoBinaryPathFailureFixture(
root,
expectedErrno,
);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: "invalid_request",
details: {
operation: "inspect_go_binary",
issues: [
{
path: ["path"],
reason: "invalid_value",
message: expect.stringContaining(errno),
},
],
},
});
expect(result.json).toMatchObject({
details: { issues: [{ message: expect.stringContaining(path) }] },
});
},
);
}
cliTest(
"preserves invalid embedded Go text bytes through the public CLI",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-byte-strings-");
const path = join(root, "byte-strings.elf");
const fixture = createGoBinaryByteStringFixture();
await writeFile(path, fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.normalized_result.build_info).toEqual(
fixture.expectedBuildInfo,
);
},
);
for (const fixture of createGoBinaryDiagnosticFixtures()) {
cliTest(
`reports ${fixture.code} for ${fixture.name} through the public Go CLI`,
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-mz-");
const path = join(root, `${fixture.name}.exe`);
await writeFile(path, fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: fixture.code,
details: {
...fixture.details,
...(fixture.code === "unsupported_target" ? { path } : {}),
},
});
},
);
}
cliTest(
"reports a readable unsupported carrier through the public Go CLI",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-");
const path = join(root, "text.bin");
await writeFile(path, "This is not an executable container.");
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: "unsupported_target",
details: { operation: "inspect_go_binary", path },
});
},
);
for (const format of ["elf", "pe", "macho"] as const) {
for (const encoding of ["inline", "pointer"] as const) {
cliTest(
`inspects authored ${format} ${encoding} build metadata through the compiled CLI`,
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-");
const fixture = createGoBinaryFixture({ format, encoding });
const path = join(root, "application.bin");
await writeFile(path, fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", "application.bin", "--json"],
cwd: root,
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.raw_result).toBeNull();
expect(evidence.subject?.local_path).toBe(path);
expect(evidence.subject?.digest.sha256).toBe(
createHash("sha256").update(fixture.bytes).digest("hex"),
);
const report = evidence.normalized_result;
expect(report).toMatchObject({
format,
bits: 64,
byte_order: "little",
artifact: { path, bytes: fixture.bytes.length },
});
expect(report.build_info).toMatchObject({
header_offset: fixture.headerOffset,
encoding,
go_version: "go1.26.0",
module_text: GO_MODULE_TEXT,
module_bytes_base64: fixture.moduleBytes.toString("base64"),
module: {
path: "example.com/tool/cmd/tool",
main: {
path: "example.com/tool",
version: "(devel)",
sum: "",
replacement: null,
},
dependencies: [
{
path: "example.com/dependency",
version: "v1.2.3",
sum: "h1:sample",
replacement: { path: "../dependency", version: "", sum: "" },
},
],
complete: true,
unparsed_lines: [],
},
});
expect(report.build_info?.module.settings).toContainEqual({
key: "-ldflags",
value: "-s -w",
});
if (report.build_info === null)
throw new Error("Fixture build metadata must be present");
const version = report.build_info.version_location;
const module = report.build_info.module_location;
expect(
fixture.bytes
.subarray(version.offset, version.offset + version.bytes)
.toString("utf8"),
).toBe(report.build_info.go_version);
expect(
fixture.bytes.subarray(module.offset, module.offset + module.bytes),
).toEqual(Buffer.from(report.build_info.module_bytes_base64, "base64"));
},
);
}
}
cliTest("preserves MIPS identity in Go CLI Evidence", async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-mips-");
const fixture = createGoBinaryFixture();
fixture.bytes.writeUInt16LE(8, 18); // ELF EM_MIPS.
const path = join(root, "application.elf");
await writeFile(path, fixture.bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.subject?.architecture).toBe("mips");
expect(evidence.normalized_result).toMatchObject({
architecture: "mips",
bits: 64,
byte_order: "little",
});
});
cliTest(
"reports missing build information as unknown and preserves unsupported carriers distinctly",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-go-cli-");
const path = join(root, "metadata-free.elf");
await writeFile(path, createGoBinaryFixture({ omitBuildInfo: true }).bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode).toBe(0);
const report = evidenceResultOf(goBinarySchema).parse(
result.json,
).normalized_result;
expect(report.build_info).toBeNull();
expect(report.limitations.join(" ")).toContain(
"does not establish that the binary is not Go",
);
},
);
cliTest(
"returns unknown dependency coverage for parse-complete GOPATH metadata in CLI Evidence",
async ({ cli }) => {
const moduleText =
"path\texample.com/tool/cmd/tool\n" +
"build\t-compiler=gc\n" +
"build\tGOOS=linux\n";
const root = await createTestTempDirectory("rea-go-gopath-cli-");
const path = join(root, "application.elf");
await writeFile(path, createGoBinaryFixture({ moduleText }).bytes);
const result = await runFileCli(cli, {
arguments: ["inspect-go-binary", path, "--json"],
});
expect(result.exitCode, result.stderr).toBe(0);
const evidence = evidenceResultOf(goBinarySchema).parse(result.json);
expect(evidence.normalized_result.build_info?.module).toMatchObject({
path: "example.com/tool/cmd/tool",
main: null,
dependencies: [],
complete: true,
unparsed_lines: [],
});
expect(evidence.limitations.join(" ")).toContain(
"Dependency coverage is unknown",
);
},
);