import { createHash } from "node:crypto"; import { writeFile } from "node:fs/promises"; import { join } from "node:path"; import { expect } from "vitest"; import { parseEvidence } from "../../src/domain/evidence.js"; import { buildManagedPeFixture } from "../../src/dotnet/ManagedPe.fixture.js"; import { connectLocalToolsMcp } from "../fixtures/localToolsMcp.js"; import { createTestTempDirectory } from "../fixtures/temporaryDirectory.js"; import { cliTest } from "../support/cli/cliFixture.js"; cliTest( "CLI and stdio MCP inspect CLR ExtraData metadata without shifting table identities", async ({ cli }) => { const root = await createTestTempDirectory("rea-managed-extra-data-"); const path = join(root, "extra-data.dll"); const bytes = buildManagedPeFixture({ metadataExtraData: 0x1234_5678 }); const sha256 = createHash("sha256").update(bytes).digest("hex"); await writeFile(path, bytes); const { client } = await connectLocalToolsMcp(); for (const name of [ "inspect_managed_artifact", "inspect_managed_members", ] as const) { const cliResult = await cli.run({ arguments: [name.replaceAll("_", "-"), path, "--json"], }); expect(cliResult.exitCode, cliResult.stderr).toBe(0); const cliEvidence = parseEvidence(cliResult.json); const response = await client.callTool({ name, arguments: { path } }); expect(response.isError, JSON.stringify(response)).not.toBe(true); const mcpEvidence = parseEvidence(response.structuredContent); expect(mcpEvidence.normalized_result).toEqual( cliEvidence.normalized_result, ); expect(mcpEvidence.subject?.digest.sha256).toBe(sha256); expect(cliEvidence.subject?.digest.sha256).toBe(sha256); expect(mcpEvidence.normalized_result).toMatchObject({ module: { name: "Fixture.dll", mvid: "00112233-4455-6677-8899-aabbccddeeff", }, coverage: { state: "complete", issues: [] }, }); if (name === "inspect_managed_artifact") { expect(mcpEvidence.normalized_result).toMatchObject({ assembly: { name: "Fixture.Managed" }, }); } else { expect(mcpEvidence.normalized_result).toMatchObject({ types: [expect.objectContaining({ full_name: "Fixture.Program" })], methods: [ expect.objectContaining({ token: "0x06000001", name: "Main", declaring_type: "Fixture.Program", }), ], }); } } }, );