Files
reverse-engineering-anything/tests/acceptance/artifactComparisonAsarUnpacked.test.ts
T
morluto cdc4541ef7 refactor: remove redundant seams and preserve cleanup ownership (#10375)
* refactor: remove redundant seams and preserve cleanup ownership

* fix: validate PE resource extents before budget checks
2026-11-13 10:11:06 -05:00

120 lines
4.6 KiB
TypeScript

import { createPackageWithOptions } from "@electron/asar";
import { TextReader, Uint8ArrayWriter, ZipWriter } from "@zip.js/zip.js";
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect, it } from "vitest";
import { artifactInventoryResultSchema } from "../../src/domain/artifactGraph.js";
import { parseArtifactInventoryEvidence } from "../../src/domain/artifactInventoryEvidence.js";
import { historicalInventoryEvidence } from "../fixtures/artifactEvidence.js";
import { connectArtifactComparisonMcp } from "../fixtures/artifactComparisonMcp.js";
import { createTestTempDirectory } from "../fixtures/temporaryDirectory.js";
it("compares ASAR companion declarations from public MCP inventories and preserves historical unknowns", async () => {
const root = await createTestTempDirectory("rea-asar-unpacked-comparison-");
const input = join(root, "source");
await mkdir(input);
await writeFile(join(input, "member.bin"), "identical child bytes");
const packedPath = join(root, "packed.asar");
const unpackedPath = join(root, "unpacked.asar");
await createPackageWithOptions(input, packedPath, {});
await createPackageWithOptions(input, unpackedPath, { unpack: "*.bin" });
// This fixture validates advertised SDK-converted input/output schemas and
// every structured response against the declared JSON Schema dialect.
const { inspect, compare } = await connectArtifactComparisonMcp();
const packed = await inspect(packedPath);
const unpacked = await inspect(unpackedPath);
const packedInventory = artifactInventoryResultSchema.parse(
packed.normalized_result,
);
const unpackedInventory = artifactInventoryResultSchema.parse(
unpacked.normalized_result,
);
const packedChild = packedInventory.occurrences.find(
({ logical_path }) => logical_path === "member.bin",
);
const unpackedChild = unpackedInventory.occurrences.find(
({ logical_path }) => logical_path === "member.bin",
);
expect(packedChild).toMatchObject({
unpacked: false,
hash_status: "verified",
});
expect(unpackedChild).toMatchObject({
unpacked: true,
hash_status: "verified",
artifact_id: packedChild?.artifact_id,
});
expect(
packedInventory.occurrences.find(
({ logical_path }) => logical_path === ".",
),
).not.toHaveProperty("unpacked");
const known = await compare(packed, unpacked);
expect(
known.changes.find(({ logical_path }) => logical_path === "member.bin"),
).toEqual({
classification: "changed",
logical_path: "member.bin",
dimensions: ["metadata"],
left_occurrence_id: packedChild?.occurrence_id,
right_occurrence_id: unpackedChild?.occurrence_id,
left_artifact_id: packedChild?.artifact_id,
right_artifact_id: unpackedChild?.artifact_id,
evidence_links: [packed.evidence_id, unpacked.evidence_id],
});
// Model an authenticated pre-field snapshot with its original graph commitment,
// rather than editing a current Evidence payload without updating its identity.
const historical = historicalInventoryEvidence(
packed,
({ unpacked: _unpacked, ...occurrence }) => occurrence,
);
const historicalParsed = parseArtifactInventoryEvidence(historical);
expect(
historicalParsed.inventory.occurrences.map(
({ occurrence_id }) => occurrence_id,
),
).toEqual(
packedInventory.occurrences.map(({ occurrence_id }) => occurrence_id),
);
expect(
historicalParsed.inventory.occurrences.every(
(occurrence) => !Object.hasOwn(occurrence, "unpacked"),
),
).toBe(true);
const unknown = await compare(historical, unpacked);
expect(
unknown.changes.find(({ logical_path }) => logical_path === "member.bin"),
).toMatchObject({
classification: "unknown",
dimensions: ["availability"],
evidence_links: [historical.evidence_id, unpacked.evidence_id],
});
const zipPath = join(root, "control.zip");
const writer = new ZipWriter(new Uint8ArrayWriter());
await writer.add("member.bin", new TextReader("identical child bytes"));
await writeFile(zipPath, await writer.close());
const zip = await inspect(zipPath);
const zipOccurrences = artifactInventoryResultSchema.parse(
zip.normalized_result,
).occurrences;
expect(zipOccurrences).toContainEqual(
expect.objectContaining({ logical_path: "member.bin" }),
);
expect(
zipOccurrences.every(
(occurrence) => !Object.hasOwn(occurrence, "unpacked"),
),
).toBe(true);
const unchanged = await compare(zip, zip);
expect(unchanged).toMatchObject({
status: "unchanged",
changes: [],
summary: { unknown: 0 },
});
});