Files
rea/tests/boundary/cli/nativeMachoLinkerOptionsCli.test.ts
morluto 0f61261e01 fix(native): retain owned preparation failures through command adapters
Refs #4522, #4526, #4555.

Retain producer-owned compiler output and cleanup markers through xcrun
resolution and native failure projection. Keep physical preparation failures
primary and preserve separate command deadline classification for interrupted
preparation. Omitted output facts stay unknown; client close does not resolve
foreign helper cleanup. Include CLI failure output in native regression reports.

Validation: 87 focused tests passed. Broader 140-file run passed 1483 tests,
skipped 109, and exposed three pre-existing deep-provider selection failures
tracked in #4555. Static checks passed. Compiler faults use controlled Node
fixtures; native Swift compiler faults and Windows execution were not verified.
Other command consumers still need preparation-fact propagation.
2026-10-17 02:47:42 +08:00

69 lines
2.3 KiB
TypeScript

import { join } from "node:path";
import { writeFile } from "node:fs/promises";
import { describe, expect } from "vitest";
import { z } from "zod";
import { inspectMachoSchema } from "../../../src/domain/native/nativeInspection.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { cliTest } from "../../support/cli/cliFixture.js";
const evidenceSchema = z.object({ normalized_result: inspectMachoSchema });
describe.skipIf(process.platform !== "darwin")(
"native Mach-O CLI linker options",
() => {
cliTest(
"retains every compiler-recorded linker option string in order",
async ({ cli, processes }) => {
const directory = await createTestTempDirectory("rea-linker-option-");
const source = join(directory, "options.c");
const object = join(directory, "options.o");
await writeFile(
source,
[
'__asm__(".linker_option \\"-framework\\", \\"Foundation\\"");',
'__asm__(".linker_option \\"-lz\\"");',
"int sample(void) { return 7; }",
"",
].join("\n"),
);
const compiled = await processes.run(
"/usr/bin/xcrun",
["clang", "-c", source, "-o", object],
{ timeoutMs: 30_000 },
);
expect(compiled.exitCode, compiled.stderr).toBe(0);
const result = await cli.run({
arguments: ["inspect-macho", object, "--json"],
environment: { REA_LOG_LEVEL: "silent" },
});
expect(result.exitCode, result.stdout + result.stderr).toBe(0);
const { load_commands: loadCommands } = evidenceSchema.parse(
result.json,
).normalized_result;
expect(loadCommands.exhaustive).toBe(true);
expect(
loadCommands.items
.filter((command) => command.kind === "LC_LINKER_OPTION")
.map(({ fields }) => fields),
).toEqual([
{
cmd: "LC_LINKER_OPTION",
cmdsize: 40,
count: 2,
"string #1": "-framework",
"string #2": "Foundation",
},
{
cmd: "LC_LINKER_OPTION",
cmdsize: 16,
count: 1,
"string #1": "-lz",
},
]);
},
);
},
);