diff --git a/src/artifacts/MachOSliceArtifactReader.test.ts b/src/artifacts/MachOSliceArtifactReader.test.ts index 8db4ab16fc..504dfec6f5 100644 --- a/src/artifacts/MachOSliceArtifactReader.test.ts +++ b/src/artifacts/MachOSliceArtifactReader.test.ts @@ -1,7 +1,24 @@ +import { readFile } from "node:fs/promises"; + import { describe, expect, it } from "vitest"; import { MachOSliceArtifactReader } from "./MachOSliceArtifactReader.js"; +/** + * Read a 32-bit FAT table directly. The host's /bin/ls changes between macOS + * releases, so the expected slice layout comes from the file itself. + */ +const fatSlices = async ( + path: string, +): Promise => { + const bytes = await readFile(path); + expect(bytes.readUInt32BE(0)).toBe(0xca_fe_ba_be); + return Array.from({ length: bytes.readUInt32BE(4) }, (_, index) => { + const entry = 8 + index * 20; + return [bytes.readUInt32BE(entry + 8), bytes.readUInt32BE(entry + 12)]; + }); +}; + describe("Mach-O slice reader with system lipo", () => { it.skipIf(process.platform !== "darwin")( "checks real /bin/ls lipo CPU symbols and ptrauth capabilities against the FAT table", @@ -18,10 +35,7 @@ describe("Mach-O slice reader with system lipo", () => { byteOffset, declaredSize, ]), - ).toEqual([ - [16384, 48112], - [65536, 89088], - ]); + ).toEqual(await fatSlices("/bin/ls")); }, ); });