mirror of
https://github.com/morluto/rea.git
synced 2026-11-10 16:57:19 +00:00
* refactor(analysis): centralize resource budgets and recovery facts * feat(analysis): expose ASAR and Ghidra runtime admission controls * feat(artifacts): expose reader admission and preserve limited recognition * feat(javascript): expose recoverable semantic precision budgets * feat(web): add recoverable source-map budgets and compact retained views * feat(web): make historical capture decoding budgets recoverable * fix(desktop): enforce selected view policies across capture and export * feat(runtime): make Frida and LLDB retention budgets selectable * feat(native): expose diagnostic budgets and preserve exhaustion causes * feat(managed): expose recoverable snapshot and representation budgets * feat(metadata): make Go and Rust inspection budgets recoverable * feat(wasm): expose representation and producer admissions * feat(evm): expose per-call worker resource budgets * feat(android): make resource and string-pool omissions recoverable * feat(producers): expose command and recorded-capture budgets * docs(analysis): record recovery contracts and integrated validation * fix(docs): link calibration oracle from published verification pages * fix(docs): restore desktop task anchors and receipt links * test(analysis): align fixtures with selectable budget contracts * fix(analysis): remove source-location projector dependency cycle * test(analysis): refresh budget recovery and verifier regressions * test(analysis): preserve format and publication recovery expectations * test(windows): align conformance with owned runtime admission * fix(desktop): preserve selected alias kinds in exported state * test(analysis): align provider fixtures with recoverable budgets * test(desktop): validate emitted alias metadata structurally * fix(ghidra): classify bounded Windows endpoint refusals * test(cli): assert selectable artifact admission recovery * fix(cli): preserve capture provenance in environment builds
113 lines
2.9 KiB
TypeScript
113 lines
2.9 KiB
TypeScript
import { expect, it } from "vitest";
|
|
|
|
import { invokeApktoolCli } from "../../support/cli/apktoolCli.js";
|
|
|
|
it("dispatches --no-strings as include_strings false", async () => {
|
|
const result = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--no-strings",
|
|
"--json",
|
|
]);
|
|
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.requests).toEqual([
|
|
{
|
|
operation: "decode_android_resources",
|
|
input: { path: "/targets/app.apk", include_strings: false },
|
|
},
|
|
]);
|
|
});
|
|
|
|
it("keeps string projection enabled when the flag is omitted", async () => {
|
|
const result = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--json",
|
|
]);
|
|
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.requests).toEqual([
|
|
{
|
|
operation: "decode_android_resources",
|
|
input: { path: "/targets/app.apk", include_strings: true },
|
|
},
|
|
]);
|
|
});
|
|
|
|
it("passes decode_timeout_ms only when the caller selects it", async () => {
|
|
const omitted = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--json",
|
|
]);
|
|
expect(omitted.exitCode).toBe(0);
|
|
expect(omitted.requests[0]?.input).not.toHaveProperty("decode_timeout_ms");
|
|
|
|
const selected = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--decode-timeout-ms",
|
|
"900000",
|
|
"--json",
|
|
]);
|
|
expect(selected.exitCode).toBe(0);
|
|
expect(selected.requests[0]?.input).toMatchObject({
|
|
decode_timeout_ms: 900_000,
|
|
});
|
|
|
|
for (const value of ["0", "2147483648"]) {
|
|
const rejected = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--decode-timeout-ms",
|
|
value,
|
|
"--json",
|
|
]);
|
|
expect(rejected.exitCode).not.toBe(0);
|
|
expect(rejected.requests).toEqual([]);
|
|
}
|
|
});
|
|
|
|
it("documents the supported negative flag in command help", async () => {
|
|
const result = await invokeApktoolCli(["decode-android-resources", "--help"]);
|
|
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.stdout).toContain("--no-strings");
|
|
});
|
|
|
|
it("preserves selected string pages and budgets and rejects an invalid page before decoding", async () => {
|
|
const result = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--string-offset",
|
|
"2000",
|
|
"--string-limit",
|
|
"100",
|
|
"--max-total-strings",
|
|
"200",
|
|
"--max-string-table-bytes",
|
|
"12000000",
|
|
"--max-total-string-table-bytes",
|
|
"24000000",
|
|
"--json",
|
|
]);
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.requests[0]?.input).toMatchObject({
|
|
string_offset: 2000,
|
|
string_limit: 100,
|
|
max_total_strings: 200,
|
|
max_string_table_bytes: 12000000,
|
|
max_total_string_table_bytes: 24000000,
|
|
});
|
|
const refused = await invokeApktoolCli([
|
|
"decode-android-resources",
|
|
"/targets/app.apk",
|
|
"--string-limit",
|
|
"0",
|
|
"--json",
|
|
]);
|
|
expect(refused.exitCode).not.toBe(0);
|
|
expect(refused.requests).toEqual([]);
|
|
});
|