Files
reverse-engineering-anything/tests/boundary/cli/apktoolBooleanOptions.test.ts
T
morluto cb4e5cfbff feat(analysis): make resource budgets recoverable across CLI and MCP (#9706)
* 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
2026-11-10 05:11:20 -05:00

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([]);
});