test: reuse Frida SDK setup across status scenarios

This commit is contained in:
morluto committed 2026-10-24 01:49:39 +08:00
1 parent 4f3d486d8f
commit 5feac72c79
1 file changed
+57 -55
+57 -55
View File
@@ -94,58 +94,60 @@ const createFridaTestProvider = (
...overrides,
});
it.each([false, true])(
"delivers Frida status summaries with complete retained Evidence (truncated=%s)",
async (truncated) => {
const id = "00000000-0000-4000-8000-000000000001";
const messages = [
{
type: "send",
payload: { token: "caller-selected-nonsecret", rows: [1, 2] },
},
];
let reads = 0;
const session = createTestBinarySession(() => {
throw new Error("No binary provider");
});
const server = createServer(
{ kind: "session", session },
{
fridaInstrumentation: createFridaTestProvider({
status(sessionId) {
reads++;
return {
sessionId,
deviceId: "local",
target: "fixture",
pid: 10,
mode: "attach",
state: "running",
targetResumeObserved: false,
scripts: [],
messages,
messagesTruncated: truncated,
};
},
}),
},
);
const client = new Client({ name: "frida-status-summary", version: "1" });
onTestFinished(async () => {
await client.close();
await server.close();
await session.close();
});
const [ct, st] = InMemoryTransport.createLinkedPair();
await server.connect(st);
await client.connect(ct);
const tools = (await client.listTools()).tools;
const tool = tools.find((t) => t.name === "frida_session_status");
if (!tool?.outputSchema) throw new Error("Missing Frida status schema");
const ajv = new Ajv2020({ strict: false, validateFormats: false });
expect(ajv.validateSchema(tool.inputSchema)).toBe(true);
const outputSchema: Record<string, unknown> = tool.outputSchema;
expect(ajv.validateSchema(outputSchema)).toBe(true);
it("delivers Frida status summaries with complete retained Evidence for both truncation states", async () => {
const id = "00000000-0000-4000-8000-000000000001";
const messages = [
{
type: "send",
payload: { token: "caller-selected-nonsecret", rows: [1, 2] },
},
];
let reads = 0;
let statusTruncated = false;
const session = createTestBinarySession(() => {
throw new Error("No binary provider");
});
const server = createServer(
{ kind: "session", session },
{
fridaInstrumentation: createFridaTestProvider({
status(sessionId) {
reads++;
return {
sessionId,
deviceId: "local",
target: "fixture",
pid: 10,
mode: "attach",
state: "running",
targetResumeObserved: false,
scripts: [],
messages,
messagesTruncated: statusTruncated,
};
},
}),
},
);
const client = new Client({ name: "frida-status-summary", version: "1" });
onTestFinished(async () => {
await client.close();
await server.close();
await session.close();
});
const [ct, st] = InMemoryTransport.createLinkedPair();
await server.connect(st);
await client.connect(ct);
const tools = (await client.listTools()).tools;
const tool = tools.find((t) => t.name === "frida_session_status");
if (!tool?.outputSchema) throw new Error("Missing Frida status schema");
const ajv = new Ajv2020({ strict: false, validateFormats: false });
expect(ajv.validateSchema(tool.inputSchema)).toBe(true);
const outputSchema: Record<string, unknown> = tool.outputSchema;
expect(ajv.validateSchema(outputSchema)).toBe(true);
for (const truncated of [false, true]) {
statusTruncated = truncated;
const readsBefore = reads;
const complete = await client.callTool({
name: tool.name,
arguments: { session_id: id },
@@ -199,7 +201,7 @@ it.each([false, true])(
},
});
expect(retained.structuredContent).toEqual(evidence);
expect(reads).toBe(3);
expect(reads - readsBefore).toBe(3);
const discovered = await client.callTool({
name: "get_evidence_bundle",
arguments: {
@@ -243,8 +245,8 @@ it.each([false, true])(
},
});
expect(rejected.isError).toBe(true);
},
);
}
});
const expectFridaToolsAvailable = async (client: Client) => {
const inventory = await client.callTool({