test(artifacts): read /bin/ls slice layout from its FAT table (#1223)
The real-lipo slice test pinned the byte offsets and sizes of one macOS release's /bin/ls, so it failed on any host whose /bin/ls differs (macOS 26.7.1: x86_64 48128 bytes, arm64e 88672, versus the pinned 48112 and 89088). Read the expected layout from the binary's FAT header instead. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6935dc7fe1
commit
c89b3a00dc
1 file changed
+18
-4
@@ -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<readonly (readonly [number, number])[]> => {
|
||||
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"));
|
||||
},
|
||||
);
|
||||
});
|
||||
Reference in new issue
Block a user