Files
reverse-engineering-anything/tests/boundary/filesystem/keyedArchiveXmlNesting.test.ts
T
morluto 5044e20171 test: focus diagnostics and evidence checks on behavior (#9303)
* test: focus configuration diagnostics on their owners

Preserve shape errors, selected paths, recovery guidance, and unchanged-file behavior across parser, setup, and uninstall boundaries.

* test: focus artifact and evidence checks on behavior

Retain format, identity, malformed-input, and cleanup coverage while removing fixed prose and closing the admitted test source.

* refactor(debugger): use configured session admission limits

* test: focus evidence and diagnostics on behavior

* fix(test): restore verifier export and formatting

* test(config): verify debugger limit ranges

* test(rizin): keep fixture executable authoritative

* test(rizin): isolate debugger fixture environment
2026-11-08 16:39:20 +00:00

105 lines
3.6 KiB
TypeScript

import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect, it } from "vitest";
import { ArtifactReaderFailure } from "../../../src/artifacts/ArtifactReader.js";
import { inspectBundleKeyedArchive } from "../../../src/artifacts/apple/KeyedArchiveReader.js";
import type { OpenStepPropertyListCode } from "../../../src/domain/propertyListOpenStep.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { deeplyNestedXmlPlist } from "../../fixtures/keyedArchiveXmlNesting.js";
it.each([129, 3000])(
"reports XML nesting of %i levels as the keyed archive decode limit",
async (depth) => {
const root = await createTestTempDirectory("rea-keyed-depth-");
await writeFile(join(root, "Deep.plist"), deeplyNestedXmlPlist(depth));
const rejected = await inspectBundleKeyedArchive({
bundlePath: root,
targetSha256: "a".repeat(64),
parameters: { path: "Deep.plist" },
platform: "linux",
}).catch((cause: unknown) => cause);
// The format owner must reject source depth before recursive decoding
// exhausts the call stack.
expect(rejected).toMatchObject({
reason: "limit",
message: expect.stringMatching(
/keyed archive.*128 nesting levels.*no runtime override/iu,
),
});
},
);
it.each([
["{key @", "expected_equals", 5],
["(x ", "expected_separator", 3],
] as const)(
"reports OpenStep %s before a deep suffix as %s at %s",
async (prefix, code: OpenStepPropertyListCode, position) => {
const root = await createTestTempDirectory("rea-keyed-openstep-malformed-");
await writeFile(join(root, "Malformed.plist"), prefix + "(".repeat(130));
const rejected = await inspectBundleKeyedArchive({
bundlePath: root,
targetSha256: "a".repeat(64),
parameters: { path: "Malformed.plist" },
platform: "linux",
}).catch((cause: unknown) => cause);
expect(rejected).toBeInstanceOf(ArtifactReaderFailure);
expect(rejected).toMatchObject({
reason: "format",
cause: {
_tag: "OpenStepPropertyListError",
code,
position,
},
});
},
);
it("retains the limit classification for syntactically valid deep OpenStep values", async () => {
const root = await createTestTempDirectory("rea-keyed-openstep-limit-");
await writeFile(
join(root, "Deep.plist"),
"(".repeat(129) + "x" + ")".repeat(129),
);
const rejected = await inspectBundleKeyedArchive({
bundlePath: root,
targetSha256: "a".repeat(64),
parameters: { path: "Deep.plist" },
platform: "linux",
}).catch((cause: unknown) => cause);
expect(rejected).toMatchObject({
reason: "limit",
message: expect.stringMatching(
/keyed archive.*128 nesting levels.*no runtime override/iu,
),
});
});
it.each([
["array sibling", (deep: string) => `((x),${deep})`],
["compound dictionary key", (deep: string) => `{(key)=${deep};}`],
] as const)(
"retains the named OpenStep depth limit after a completed %s",
async (_name, document) => {
const root = await createTestTempDirectory(
"rea-keyed-openstep-sibling-depth-",
);
const deep = "(".repeat(30000) + "x" + ")".repeat(30000);
await writeFile(join(root, "Deep.plist"), document(deep));
const rejected = await inspectBundleKeyedArchive({
bundlePath: root,
targetSha256: "a".repeat(64),
parameters: { path: "Deep.plist" },
platform: "linux",
}).catch((cause: unknown) => cause);
expect(rejected).toMatchObject({
reason: "limit",
message: expect.stringMatching(
/keyed archive.*128 nesting levels.*no runtime override/iu,
),
});
},
);