@zanii/testing 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tools.d.ts +142 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +183 -0
- package/dist/tools.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +1 -0
- package/src/tools.ts +202 -0
package/README.md
CHANGED
|
@@ -51,6 +51,7 @@ expect((await fetchAndVerifyProof('http://test.local', hash, ledger.fetch)).ok).
|
|
|
51
51
|
|
|
52
52
|
## Changelog
|
|
53
53
|
|
|
54
|
+
- **0.1.3** — Seeded chaos fetch, lying ledgers (fork, bad proof, rollback, drop), record/replay fixtures, assertions and vitest/jest matchers, a manual clock, A2A and swarm fixtures, policy cases, a load generator.
|
|
54
55
|
- **0.1.2** — now depends on `@zanii/core` 0.5 (protocol 1.2), so it shares one core with `@zanii/sdk` 0.5 instead of pulling in a second, older copy. No API change.
|
|
55
56
|
- **0.1.0** — initial release: `createTestLedger` (in-memory ledger with real proofs) + `makeIdentity` / `makeCert` / `makeReceipt` fixtures.
|
|
56
57
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAcL,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEpE,mFAAmF;AACnF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAUjF,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,6CAA6C;IAC7C,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,oEAAoE;IACpE,SAAS,IAAI,OAAO,CAAC;IACrB,gCAAgC;IAChC,GAAG,IAAI,cAAc,CAAC;IACtB,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;CACf;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,OAA2B,GAAG,UAAU,CA2HhF;AAID,wDAAwD;AACxD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,GAAG,SAAyB,GAC3B,cAAc,CAEhB;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9F,OAAO,CAaT"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAcL,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEpE,mFAAmF;AACnF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAUjF,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,6CAA6C;IAC7C,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,oEAAoE;IACpE,SAAS,IAAI,OAAO,CAAC;IACrB,gCAAgC;IAChC,GAAG,IAAI,cAAc,CAAC;IACtB,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;CACf;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,OAA2B,GAAG,UAAU,CA2HhF;AAID,wDAAwD;AACxD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,GAAG,SAAyB,GAC3B,cAAc,CAEhB;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9F,OAAO,CAaT;AACD,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More test tooling: chaos and lying ledgers, record/replay, framework-free assertions and
|
|
3
|
+
* matchers for vitest or jest, a controllable clock, A2A / swarm / policy fixtures and a
|
|
4
|
+
* load generator. All work with `createTestLedger` and the SDK's `fetchImpl`.
|
|
5
|
+
*/
|
|
6
|
+
import { type A2AReceipt, type DelegationCert, type Keypair, type Receipt, type SwarmLedgerReceipt } from '@zanii/core';
|
|
7
|
+
import { type FetchLike, type TestLedger } from './index.js';
|
|
8
|
+
/** A small seeded PRNG (mulberry32), so chaos runs repeat exactly. */
|
|
9
|
+
export declare function seededRandom(seed: number): () => number;
|
|
10
|
+
/** Wrap a ledger's fetch with outages (503), added latency and network errors, at seeded rates. */
|
|
11
|
+
export declare function chaosFetch(inner: FetchLike, faults?: {
|
|
12
|
+
outageRate?: number;
|
|
13
|
+
errorRate?: number;
|
|
14
|
+
latencyMs?: number;
|
|
15
|
+
seed?: number;
|
|
16
|
+
}): FetchLike;
|
|
17
|
+
export type Lie = 'fork' | 'bad-proof' | 'rollback' | 'drop';
|
|
18
|
+
/**
|
|
19
|
+
* A log that lies, to test that verifiers catch it: `fork` signs a different root for the
|
|
20
|
+
* same size, `bad-proof` corrupts inclusion proofs, `rollback` serves a smaller tree than
|
|
21
|
+
* before, `drop` accepts receipts but never includes them.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lyingLedger(ledger: TestLedger, lie: Lie): FetchLike;
|
|
24
|
+
export interface Fixture {
|
|
25
|
+
method: string;
|
|
26
|
+
path: string;
|
|
27
|
+
body: string | null;
|
|
28
|
+
status: number;
|
|
29
|
+
response: string;
|
|
30
|
+
}
|
|
31
|
+
/** Record every exchange with a real (or test) ledger as fixtures. */
|
|
32
|
+
export declare function recordingFetch(inner: FetchLike): {
|
|
33
|
+
fetch: FetchLike;
|
|
34
|
+
fixtures: Fixture[];
|
|
35
|
+
};
|
|
36
|
+
/** Replay fixtures in order; a request that differs from the recording fails loudly. */
|
|
37
|
+
export declare function replayFetch(fixtures: Fixture[]): FetchLike;
|
|
38
|
+
/** Each agent's receipts link by `prev` in order, starting from null. Returns the first break, or null. */
|
|
39
|
+
export declare function chainBreak(receipts: Receipt[]): string | null;
|
|
40
|
+
export declare function expectRecorded(ledger: TestLedger, target: string): void;
|
|
41
|
+
export declare function expectChainUnbroken(ledger: TestLedger): void;
|
|
42
|
+
export declare function expectNoRisk(ledger: TestLedger, level: 'low' | 'medium' | 'high' | 'critical'): void;
|
|
43
|
+
/** Matchers for `expect.extend(zaniiMatchers)` in vitest or jest. */
|
|
44
|
+
export declare const zaniiMatchers: {
|
|
45
|
+
toHaveRecorded(ledger: TestLedger, target: string): {
|
|
46
|
+
pass: boolean;
|
|
47
|
+
message: () => string;
|
|
48
|
+
};
|
|
49
|
+
toHaveUnbrokenChain(ledger: TestLedger): {
|
|
50
|
+
pass: boolean;
|
|
51
|
+
message: () => string;
|
|
52
|
+
};
|
|
53
|
+
toVerifyAll(ledger: TestLedger): {
|
|
54
|
+
pass: boolean;
|
|
55
|
+
message: () => "expected some receipt to fail verification" | "expected every receipt to verify";
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
/** A clock you move by hand, for expiry tests: pass `clock.now` wherever a `now` function is taken. */
|
|
59
|
+
export declare function createClock(start?: string): {
|
|
60
|
+
now: () => number;
|
|
61
|
+
iso: () => string;
|
|
62
|
+
advance: (ms: number) => undefined;
|
|
63
|
+
set: (iso: string) => undefined;
|
|
64
|
+
};
|
|
65
|
+
/** Two agents (different owners) and a signed A2A receipt between them. */
|
|
66
|
+
export declare function a2aFixture(opts?: {
|
|
67
|
+
target?: string;
|
|
68
|
+
scopes?: string[];
|
|
69
|
+
ts?: string;
|
|
70
|
+
}): {
|
|
71
|
+
initiator: Keypair;
|
|
72
|
+
responder: Keypair;
|
|
73
|
+
receipt: A2AReceipt;
|
|
74
|
+
delegations: [DelegationCert[], DelegationCert[]];
|
|
75
|
+
};
|
|
76
|
+
/** An on-ledger swarm receipt: `n` agents under distinct owners, `threshold` of them signing. */
|
|
77
|
+
export declare function swarmFixture(n?: number, threshold?: number, opts?: {
|
|
78
|
+
target?: string;
|
|
79
|
+
ts?: string;
|
|
80
|
+
}): {
|
|
81
|
+
agents: Keypair[];
|
|
82
|
+
receipt: SwarmLedgerReceipt;
|
|
83
|
+
};
|
|
84
|
+
/** Common actions for policy tests, with the decision a typical guardrail policy should reach. */
|
|
85
|
+
export declare const policyCases: readonly [{
|
|
86
|
+
readonly name: "small payment";
|
|
87
|
+
readonly action: {
|
|
88
|
+
readonly target: "payments.send";
|
|
89
|
+
readonly payload: {
|
|
90
|
+
readonly amount: 10;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
readonly typical: "allow";
|
|
94
|
+
}, {
|
|
95
|
+
readonly name: "large payment";
|
|
96
|
+
readonly action: {
|
|
97
|
+
readonly target: "payments.send";
|
|
98
|
+
readonly payload: {
|
|
99
|
+
readonly amount: 50000;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
readonly typical: "require_approval";
|
|
103
|
+
}, {
|
|
104
|
+
readonly name: "read CRM";
|
|
105
|
+
readonly action: {
|
|
106
|
+
readonly target: "crm.read";
|
|
107
|
+
};
|
|
108
|
+
readonly typical: "allow";
|
|
109
|
+
}, {
|
|
110
|
+
readonly name: "wipe admin";
|
|
111
|
+
readonly action: {
|
|
112
|
+
readonly target: "admin.wipe";
|
|
113
|
+
};
|
|
114
|
+
readonly typical: "deny";
|
|
115
|
+
}, {
|
|
116
|
+
readonly name: "critical risk";
|
|
117
|
+
readonly action: {
|
|
118
|
+
readonly target: "infra.change";
|
|
119
|
+
readonly risk: "critical";
|
|
120
|
+
};
|
|
121
|
+
readonly typical: "require_approval";
|
|
122
|
+
}, {
|
|
123
|
+
readonly name: "bulk export";
|
|
124
|
+
readonly action: {
|
|
125
|
+
readonly target: "crm.export";
|
|
126
|
+
readonly payload: {
|
|
127
|
+
readonly rows: 1000000;
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
readonly typical: "require_approval";
|
|
131
|
+
}];
|
|
132
|
+
/** Many valid receipts: `agents` agents, `perAgent` receipts each, chained per agent. For load and verifier benchmarks. */
|
|
133
|
+
export declare function generateLoad(opts: {
|
|
134
|
+
agents: number;
|
|
135
|
+
perAgent: number;
|
|
136
|
+
target?: string;
|
|
137
|
+
start?: string;
|
|
138
|
+
}): {
|
|
139
|
+
receipts: Receipt[];
|
|
140
|
+
perSecond: number;
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More test tooling: chaos and lying ledgers, record/replay, framework-free assertions and
|
|
3
|
+
* matchers for vitest or jest, a controllable clock, A2A / swarm / policy fixtures and a
|
|
4
|
+
* load generator. All work with `createTestLedger` and the SDK's `fetchImpl`.
|
|
5
|
+
*/
|
|
6
|
+
import { assembleA2AReceipt, buildA2ABody, hashPayload, receiptHash, signA2ABody } from '@zanii/core';
|
|
7
|
+
import { makeCert, makeIdentity, makeReceipt } from './index.js';
|
|
8
|
+
/** A small seeded PRNG (mulberry32), so chaos runs repeat exactly. */
|
|
9
|
+
export function seededRandom(seed) {
|
|
10
|
+
let a = seed >>> 0;
|
|
11
|
+
return () => {
|
|
12
|
+
a = (a + 0x6d2b79f5) >>> 0;
|
|
13
|
+
let t = a;
|
|
14
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
15
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
16
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4_294_967_296;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const json = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
20
|
+
// ------------------------------------------------------------------------------ //
|
|
21
|
+
// Faulty and lying ledgers
|
|
22
|
+
// ------------------------------------------------------------------------------ //
|
|
23
|
+
/** Wrap a ledger's fetch with outages (503), added latency and network errors, at seeded rates. */
|
|
24
|
+
export function chaosFetch(inner, faults = {}) {
|
|
25
|
+
const rnd = seededRandom(faults.seed ?? 1);
|
|
26
|
+
return async (input, init) => {
|
|
27
|
+
if (faults.latencyMs)
|
|
28
|
+
await new Promise((r) => setTimeout(r, faults.latencyMs));
|
|
29
|
+
const x = rnd();
|
|
30
|
+
if (x < (faults.errorRate ?? 0))
|
|
31
|
+
throw new TypeError('chaos: network error');
|
|
32
|
+
if (x < (faults.errorRate ?? 0) + (faults.outageRate ?? 0))
|
|
33
|
+
return json({ error: 'chaos: service unavailable' }, 503);
|
|
34
|
+
return inner(input, init);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A log that lies, to test that verifiers catch it: `fork` signs a different root for the
|
|
39
|
+
* same size, `bad-proof` corrupts inclusion proofs, `rollback` serves a smaller tree than
|
|
40
|
+
* before, `drop` accepts receipts but never includes them.
|
|
41
|
+
*/
|
|
42
|
+
export function lyingLedger(ledger, lie) {
|
|
43
|
+
let sthCalls = 0;
|
|
44
|
+
return async (input, init) => {
|
|
45
|
+
const path = new URL(input).pathname;
|
|
46
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
47
|
+
if (lie === 'drop' && method === 'POST' && path === '/v1/receipts') {
|
|
48
|
+
const receipts = (JSON.parse(String(init?.body ?? '{}')).receipts ?? []);
|
|
49
|
+
return json({ results: receipts.map((r, i) => ({ status: 'accepted', hash: receiptHash(r), index: ledger.size + i })), sth: ledger.sth() });
|
|
50
|
+
}
|
|
51
|
+
const res = await ledger.fetch(input, init);
|
|
52
|
+
if (method !== 'GET' || !res.ok)
|
|
53
|
+
return res;
|
|
54
|
+
const body = (await res.json());
|
|
55
|
+
if (lie === 'fork' && path === '/v1/sth')
|
|
56
|
+
return json({ ...body, root: `sha256:${'f'.repeat(64)}` });
|
|
57
|
+
if (lie === 'rollback' && path === '/v1/sth' && sthCalls++ > 0)
|
|
58
|
+
return json({ ...body, size: Math.max(0, body.size - 1) });
|
|
59
|
+
if (lie === 'bad-proof' && path.startsWith('/v1/proof/'))
|
|
60
|
+
return json({ ...body, proof: body.proof.map((p) => p.replace(/^./, (c) => (c === '0' ? '1' : '0'))).concat(body.proof.length ? [] : ['00'.repeat(32)]) });
|
|
61
|
+
return json(body, res.status);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Record every exchange with a real (or test) ledger as fixtures. */
|
|
65
|
+
export function recordingFetch(inner) {
|
|
66
|
+
const fixtures = [];
|
|
67
|
+
const fetch = async (input, init) => {
|
|
68
|
+
const res = await inner(input, init);
|
|
69
|
+
const text = await res.text();
|
|
70
|
+
fixtures.push({ method: (init?.method ?? 'GET').toUpperCase(), path: new URL(input).pathname + new URL(input).search, body: typeof init?.body === 'string' ? init.body : null, status: res.status, response: text });
|
|
71
|
+
return new Response(text, { status: res.status, headers: { 'content-type': 'application/json' } });
|
|
72
|
+
};
|
|
73
|
+
return { fetch, fixtures };
|
|
74
|
+
}
|
|
75
|
+
/** Replay fixtures in order; a request that differs from the recording fails loudly. */
|
|
76
|
+
export function replayFetch(fixtures) {
|
|
77
|
+
let i = 0;
|
|
78
|
+
return async (input, init) => {
|
|
79
|
+
const f = fixtures[i++];
|
|
80
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
81
|
+
const path = new URL(input).pathname + new URL(input).search;
|
|
82
|
+
if (!f)
|
|
83
|
+
throw new Error(`replay: no fixture left for ${method} ${path}`);
|
|
84
|
+
if (f.method !== method || f.path !== path)
|
|
85
|
+
throw new Error(`replay: expected ${f.method} ${f.path}, got ${method} ${path}`);
|
|
86
|
+
return new Response(f.response, { status: f.status, headers: { 'content-type': 'application/json' } });
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ------------------------------------------------------------------------------ //
|
|
90
|
+
// Assertions and matchers
|
|
91
|
+
// ------------------------------------------------------------------------------ //
|
|
92
|
+
/** Each agent's receipts link by `prev` in order, starting from null. Returns the first break, or null. */
|
|
93
|
+
export function chainBreak(receipts) {
|
|
94
|
+
const last = new Map();
|
|
95
|
+
for (const r of receipts) {
|
|
96
|
+
const expected = last.get(r.agent_id) ?? null;
|
|
97
|
+
if (r.prev !== expected)
|
|
98
|
+
return `${r.agent_id}: receipt ${receiptHash(r)} has prev ${r.prev}, expected ${expected}`;
|
|
99
|
+
last.set(r.agent_id, receiptHash(r));
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
export function expectRecorded(ledger, target) {
|
|
104
|
+
if (!ledger.hasRecorded(target))
|
|
105
|
+
throw new Error(`expected ${target} to be recorded; recorded: ${ledger.recordedTargets().join(', ') || 'nothing'}`);
|
|
106
|
+
}
|
|
107
|
+
export function expectChainUnbroken(ledger) {
|
|
108
|
+
const b = chainBreak(ledger.receipts);
|
|
109
|
+
if (b)
|
|
110
|
+
throw new Error(`chain broken: ${b}`);
|
|
111
|
+
}
|
|
112
|
+
export function expectNoRisk(ledger, level) {
|
|
113
|
+
const hits = ledger.receipts.filter((r) => r.risk === level);
|
|
114
|
+
if (hits.length)
|
|
115
|
+
throw new Error(`expected no ${level}-risk receipts, found ${hits.length}: ${hits.map((r) => r.target).join(', ')}`);
|
|
116
|
+
}
|
|
117
|
+
/** Matchers for `expect.extend(zaniiMatchers)` in vitest or jest. */
|
|
118
|
+
export const zaniiMatchers = {
|
|
119
|
+
toHaveRecorded(ledger, target) {
|
|
120
|
+
const pass = ledger.hasRecorded(target);
|
|
121
|
+
return { pass, message: () => (pass ? `expected ${target} not to be recorded` : `expected ${target} to be recorded; recorded: ${ledger.recordedTargets().join(', ') || 'nothing'}`) };
|
|
122
|
+
},
|
|
123
|
+
toHaveUnbrokenChain(ledger) {
|
|
124
|
+
const b = chainBreak(ledger.receipts);
|
|
125
|
+
return { pass: b === null, message: () => (b ? `chain broken: ${b}` : 'expected a broken chain') };
|
|
126
|
+
},
|
|
127
|
+
toVerifyAll(ledger) {
|
|
128
|
+
const pass = ledger.verifyAll();
|
|
129
|
+
return { pass, message: () => (pass ? 'expected some receipt to fail verification' : 'expected every receipt to verify') };
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
// ------------------------------------------------------------------------------ //
|
|
133
|
+
// Clock, fixtures, load
|
|
134
|
+
// ------------------------------------------------------------------------------ //
|
|
135
|
+
/** A clock you move by hand, for expiry tests: pass `clock.now` wherever a `now` function is taken. */
|
|
136
|
+
export function createClock(start = '2026-01-01T00:00:00Z') {
|
|
137
|
+
let t = Date.parse(start);
|
|
138
|
+
return { now: () => t, iso: () => new Date(t).toISOString(), advance: (ms) => void (t += ms), set: (iso) => void (t = Date.parse(iso)) };
|
|
139
|
+
}
|
|
140
|
+
/** Two agents (different owners) and a signed A2A receipt between them. */
|
|
141
|
+
export function a2aFixture(opts = {}) {
|
|
142
|
+
const [o1, o2, a, b] = [makeIdentity(), makeIdentity(), makeIdentity(), makeIdentity()];
|
|
143
|
+
const d1 = [makeCert(o1, a, opts.scopes ?? ['*'])];
|
|
144
|
+
const d2 = [makeCert(o2, b, opts.scopes ?? ['*'])];
|
|
145
|
+
const body = buildA2ABody({ action: 'a2a', target: opts.target ?? 'deal.agree', payloadHash: hashPayload('fixture'), ts: opts.ts ?? new Date().toISOString(), initiator: { agent_id: a.did, delegation: d1, prev: null }, responder: { agent_id: b.did, delegation: d2, prev: null } });
|
|
146
|
+
return { initiator: a, responder: b, receipt: assembleA2AReceipt(body, signA2ABody(body, a.privateKey), signA2ABody(body, b.privateKey)), delegations: [d1, d2] };
|
|
147
|
+
}
|
|
148
|
+
/** An on-ledger swarm receipt: `n` agents under distinct owners, `threshold` of them signing. */
|
|
149
|
+
export function swarmFixture(n = 3, threshold = 2, opts = {}) {
|
|
150
|
+
const agents = Array.from({ length: n }, () => makeIdentity());
|
|
151
|
+
const delegations = agents.map((a) => [makeCert(makeIdentity(), a, ['*'])]);
|
|
152
|
+
const body = { v: 1, type: 'swarm', task: 'fixture.task', target: opts.target ?? 'team.approve', ts: opts.ts ?? new Date().toISOString(), participants: agents.map((a) => a.did).sort(), threshold };
|
|
153
|
+
// The swarm signing input is the canonical body, exactly as for an A2A body.
|
|
154
|
+
const signers = agents.slice(0, threshold).map((a, i) => ({ agent_id: a.did, delegation: delegations[i], prev: null, sig: signA2ABody(body, a.privateKey) }));
|
|
155
|
+
return { agents, receipt: { v: 1, type: 'swarm', body, signers } };
|
|
156
|
+
}
|
|
157
|
+
/** Common actions for policy tests, with the decision a typical guardrail policy should reach. */
|
|
158
|
+
export const policyCases = [
|
|
159
|
+
{ name: 'small payment', action: { target: 'payments.send', payload: { amount: 10 } }, typical: 'allow' },
|
|
160
|
+
{ name: 'large payment', action: { target: 'payments.send', payload: { amount: 50_000 } }, typical: 'require_approval' },
|
|
161
|
+
{ name: 'read CRM', action: { target: 'crm.read' }, typical: 'allow' },
|
|
162
|
+
{ name: 'wipe admin', action: { target: 'admin.wipe' }, typical: 'deny' },
|
|
163
|
+
{ name: 'critical risk', action: { target: 'infra.change', risk: 'critical' }, typical: 'require_approval' },
|
|
164
|
+
{ name: 'bulk export', action: { target: 'crm.export', payload: { rows: 1_000_000 } }, typical: 'require_approval' },
|
|
165
|
+
];
|
|
166
|
+
/** Many valid receipts: `agents` agents, `perAgent` receipts each, chained per agent. For load and verifier benchmarks. */
|
|
167
|
+
export function generateLoad(opts) {
|
|
168
|
+
const start = Date.parse(opts.start ?? '2026-01-01T00:00:00Z');
|
|
169
|
+
const out = [];
|
|
170
|
+
const t0 = performance.now();
|
|
171
|
+
for (let a = 0; a < opts.agents; a++) {
|
|
172
|
+
const agent = makeIdentity();
|
|
173
|
+
const d = [makeCert(makeIdentity(), agent, ['*'])];
|
|
174
|
+
let prev = null;
|
|
175
|
+
for (let i = 0; i < opts.perAgent; i++) {
|
|
176
|
+
const r = makeReceipt(agent, d, { target: opts.target ?? 'load.test', payload: { a, i }, prev, ts: new Date(start + i * 1000).toISOString() });
|
|
177
|
+
out.push(r);
|
|
178
|
+
prev = receiptHash(r);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { receipts: out, perSecond: Math.round(out.length / ((performance.now() - t0) / 1000)) };
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zanii/testing",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Zanii test utilities: an in-memory ledger (with real Merkle proofs) plus identity/cert/receipt fixtures — unit-test instrumented agents with no server or network.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://ledger.zanii.agency",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@noble/hashes": "^1.7.1",
|
|
27
|
-
"@zanii/core": "^0.5.
|
|
27
|
+
"@zanii/core": "^0.5.4"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^26.1.0",
|
|
31
31
|
"typescript": "^5.8.2",
|
|
32
32
|
"vitest": "^3.0.9",
|
|
33
|
-
"@zanii/sdk": "0.5.
|
|
33
|
+
"@zanii/sdk": "0.5.3"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsc -p tsconfig.build.json",
|
package/src/index.ts
CHANGED
package/src/tools.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More test tooling: chaos and lying ledgers, record/replay, framework-free assertions and
|
|
3
|
+
* matchers for vitest or jest, a controllable clock, A2A / swarm / policy fixtures and a
|
|
4
|
+
* load generator. All work with `createTestLedger` and the SDK's `fetchImpl`.
|
|
5
|
+
*/
|
|
6
|
+
import { assembleA2AReceipt, buildA2ABody, hashPayload, receiptHash, signA2ABody, type A2AReceipt, type DelegationCert, type Keypair, type Receipt, type SwarmLedgerReceipt } from '@zanii/core';
|
|
7
|
+
import { makeCert, makeIdentity, makeReceipt, type FetchLike, type TestLedger } from './index.js';
|
|
8
|
+
|
|
9
|
+
/** A small seeded PRNG (mulberry32), so chaos runs repeat exactly. */
|
|
10
|
+
export function seededRandom(seed: number): () => number {
|
|
11
|
+
let a = seed >>> 0;
|
|
12
|
+
return () => {
|
|
13
|
+
a = (a + 0x6d2b79f5) >>> 0;
|
|
14
|
+
let t = a;
|
|
15
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
16
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
17
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4_294_967_296;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const json = (body: unknown, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
22
|
+
|
|
23
|
+
// ------------------------------------------------------------------------------ //
|
|
24
|
+
// Faulty and lying ledgers
|
|
25
|
+
// ------------------------------------------------------------------------------ //
|
|
26
|
+
|
|
27
|
+
/** Wrap a ledger's fetch with outages (503), added latency and network errors, at seeded rates. */
|
|
28
|
+
export function chaosFetch(inner: FetchLike, faults: { outageRate?: number; errorRate?: number; latencyMs?: number; seed?: number } = {}): FetchLike {
|
|
29
|
+
const rnd = seededRandom(faults.seed ?? 1);
|
|
30
|
+
return async (input, init) => {
|
|
31
|
+
if (faults.latencyMs) await new Promise((r) => setTimeout(r, faults.latencyMs));
|
|
32
|
+
const x = rnd();
|
|
33
|
+
if (x < (faults.errorRate ?? 0)) throw new TypeError('chaos: network error');
|
|
34
|
+
if (x < (faults.errorRate ?? 0) + (faults.outageRate ?? 0)) return json({ error: 'chaos: service unavailable' }, 503);
|
|
35
|
+
return inner(input, init);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type Lie = 'fork' | 'bad-proof' | 'rollback' | 'drop';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* A log that lies, to test that verifiers catch it: `fork` signs a different root for the
|
|
43
|
+
* same size, `bad-proof` corrupts inclusion proofs, `rollback` serves a smaller tree than
|
|
44
|
+
* before, `drop` accepts receipts but never includes them.
|
|
45
|
+
*/
|
|
46
|
+
export function lyingLedger(ledger: TestLedger, lie: Lie): FetchLike {
|
|
47
|
+
let sthCalls = 0;
|
|
48
|
+
return async (input, init) => {
|
|
49
|
+
const path = new URL(input).pathname;
|
|
50
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
51
|
+
if (lie === 'drop' && method === 'POST' && path === '/v1/receipts') {
|
|
52
|
+
const receipts = (JSON.parse(String(init?.body ?? '{}')).receipts ?? []) as Receipt[];
|
|
53
|
+
return json({ results: receipts.map((r, i) => ({ status: 'accepted', hash: receiptHash(r), index: ledger.size + i })), sth: ledger.sth() });
|
|
54
|
+
}
|
|
55
|
+
const res = await ledger.fetch(input, init);
|
|
56
|
+
if (method !== 'GET' || !res.ok) return res;
|
|
57
|
+
const body = (await res.json()) as Record<string, any>;
|
|
58
|
+
if (lie === 'fork' && path === '/v1/sth') return json({ ...body, root: `sha256:${'f'.repeat(64)}` });
|
|
59
|
+
if (lie === 'rollback' && path === '/v1/sth' && sthCalls++ > 0) return json({ ...body, size: Math.max(0, body.size - 1) });
|
|
60
|
+
if (lie === 'bad-proof' && path.startsWith('/v1/proof/')) return json({ ...body, proof: (body.proof as string[]).map((p) => p.replace(/^./, (c) => (c === '0' ? '1' : '0'))).concat(body.proof.length ? [] : ['00'.repeat(32)]) });
|
|
61
|
+
return json(body, res.status);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ------------------------------------------------------------------------------ //
|
|
66
|
+
// Record and replay
|
|
67
|
+
// ------------------------------------------------------------------------------ //
|
|
68
|
+
|
|
69
|
+
export interface Fixture {
|
|
70
|
+
method: string;
|
|
71
|
+
path: string;
|
|
72
|
+
body: string | null;
|
|
73
|
+
status: number;
|
|
74
|
+
response: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Record every exchange with a real (or test) ledger as fixtures. */
|
|
78
|
+
export function recordingFetch(inner: FetchLike) {
|
|
79
|
+
const fixtures: Fixture[] = [];
|
|
80
|
+
const fetch: FetchLike = async (input, init) => {
|
|
81
|
+
const res = await inner(input, init);
|
|
82
|
+
const text = await res.text();
|
|
83
|
+
fixtures.push({ method: (init?.method ?? 'GET').toUpperCase(), path: new URL(input).pathname + new URL(input).search, body: typeof init?.body === 'string' ? init.body : null, status: res.status, response: text });
|
|
84
|
+
return new Response(text, { status: res.status, headers: { 'content-type': 'application/json' } });
|
|
85
|
+
};
|
|
86
|
+
return { fetch, fixtures };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Replay fixtures in order; a request that differs from the recording fails loudly. */
|
|
90
|
+
export function replayFetch(fixtures: Fixture[]): FetchLike {
|
|
91
|
+
let i = 0;
|
|
92
|
+
return async (input, init) => {
|
|
93
|
+
const f = fixtures[i++];
|
|
94
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
95
|
+
const path = new URL(input).pathname + new URL(input).search;
|
|
96
|
+
if (!f) throw new Error(`replay: no fixture left for ${method} ${path}`);
|
|
97
|
+
if (f.method !== method || f.path !== path) throw new Error(`replay: expected ${f.method} ${f.path}, got ${method} ${path}`);
|
|
98
|
+
return new Response(f.response, { status: f.status, headers: { 'content-type': 'application/json' } });
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ------------------------------------------------------------------------------ //
|
|
103
|
+
// Assertions and matchers
|
|
104
|
+
// ------------------------------------------------------------------------------ //
|
|
105
|
+
|
|
106
|
+
/** Each agent's receipts link by `prev` in order, starting from null. Returns the first break, or null. */
|
|
107
|
+
export function chainBreak(receipts: Receipt[]): string | null {
|
|
108
|
+
const last = new Map<string, string | null>();
|
|
109
|
+
for (const r of receipts) {
|
|
110
|
+
const expected = last.get(r.agent_id) ?? null;
|
|
111
|
+
if (r.prev !== expected) return `${r.agent_id}: receipt ${receiptHash(r)} has prev ${r.prev}, expected ${expected}`;
|
|
112
|
+
last.set(r.agent_id, receiptHash(r));
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function expectRecorded(ledger: TestLedger, target: string): void {
|
|
118
|
+
if (!ledger.hasRecorded(target)) throw new Error(`expected ${target} to be recorded; recorded: ${ledger.recordedTargets().join(', ') || 'nothing'}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function expectChainUnbroken(ledger: TestLedger): void {
|
|
122
|
+
const b = chainBreak(ledger.receipts);
|
|
123
|
+
if (b) throw new Error(`chain broken: ${b}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function expectNoRisk(ledger: TestLedger, level: 'low' | 'medium' | 'high' | 'critical'): void {
|
|
127
|
+
const hits = ledger.receipts.filter((r) => r.risk === level);
|
|
128
|
+
if (hits.length) throw new Error(`expected no ${level}-risk receipts, found ${hits.length}: ${hits.map((r) => r.target).join(', ')}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Matchers for `expect.extend(zaniiMatchers)` in vitest or jest. */
|
|
132
|
+
export const zaniiMatchers = {
|
|
133
|
+
toHaveRecorded(ledger: TestLedger, target: string) {
|
|
134
|
+
const pass = ledger.hasRecorded(target);
|
|
135
|
+
return { pass, message: () => (pass ? `expected ${target} not to be recorded` : `expected ${target} to be recorded; recorded: ${ledger.recordedTargets().join(', ') || 'nothing'}`) };
|
|
136
|
+
},
|
|
137
|
+
toHaveUnbrokenChain(ledger: TestLedger) {
|
|
138
|
+
const b = chainBreak(ledger.receipts);
|
|
139
|
+
return { pass: b === null, message: () => (b ? `chain broken: ${b}` : 'expected a broken chain') };
|
|
140
|
+
},
|
|
141
|
+
toVerifyAll(ledger: TestLedger) {
|
|
142
|
+
const pass = ledger.verifyAll();
|
|
143
|
+
return { pass, message: () => (pass ? 'expected some receipt to fail verification' : 'expected every receipt to verify') };
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// ------------------------------------------------------------------------------ //
|
|
148
|
+
// Clock, fixtures, load
|
|
149
|
+
// ------------------------------------------------------------------------------ //
|
|
150
|
+
|
|
151
|
+
/** A clock you move by hand, for expiry tests: pass `clock.now` wherever a `now` function is taken. */
|
|
152
|
+
export function createClock(start = '2026-01-01T00:00:00Z') {
|
|
153
|
+
let t = Date.parse(start);
|
|
154
|
+
return { now: () => t, iso: () => new Date(t).toISOString(), advance: (ms: number) => void (t += ms), set: (iso: string) => void (t = Date.parse(iso)) };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Two agents (different owners) and a signed A2A receipt between them. */
|
|
158
|
+
export function a2aFixture(opts: { target?: string; scopes?: string[]; ts?: string } = {}): { initiator: Keypair; responder: Keypair; receipt: A2AReceipt; delegations: [DelegationCert[], DelegationCert[]] } {
|
|
159
|
+
const [o1, o2, a, b] = [makeIdentity(), makeIdentity(), makeIdentity(), makeIdentity()];
|
|
160
|
+
const d1 = [makeCert(o1, a, opts.scopes ?? ['*'])];
|
|
161
|
+
const d2 = [makeCert(o2, b, opts.scopes ?? ['*'])];
|
|
162
|
+
const body = buildA2ABody({ action: 'a2a', target: opts.target ?? 'deal.agree', payloadHash: hashPayload('fixture'), ts: opts.ts ?? new Date().toISOString(), initiator: { agent_id: a.did, delegation: d1, prev: null }, responder: { agent_id: b.did, delegation: d2, prev: null } });
|
|
163
|
+
return { initiator: a, responder: b, receipt: assembleA2AReceipt(body, signA2ABody(body, a.privateKey), signA2ABody(body, b.privateKey)), delegations: [d1, d2] };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** An on-ledger swarm receipt: `n` agents under distinct owners, `threshold` of them signing. */
|
|
167
|
+
export function swarmFixture(n = 3, threshold = 2, opts: { target?: string; ts?: string } = {}): { agents: Keypair[]; receipt: SwarmLedgerReceipt } {
|
|
168
|
+
const agents = Array.from({ length: n }, () => makeIdentity());
|
|
169
|
+
const delegations = agents.map((a) => [makeCert(makeIdentity(), a, ['*'])]);
|
|
170
|
+
const body = { v: 1 as const, type: 'swarm' as const, task: 'fixture.task', target: opts.target ?? 'team.approve', ts: opts.ts ?? new Date().toISOString(), participants: agents.map((a) => a.did).sort(), threshold };
|
|
171
|
+
// The swarm signing input is the canonical body, exactly as for an A2A body.
|
|
172
|
+
const signers = agents.slice(0, threshold).map((a, i) => ({ agent_id: a.did, delegation: delegations[i]!, prev: null, sig: signA2ABody(body as never, a.privateKey) }));
|
|
173
|
+
return { agents, receipt: { v: 1, type: 'swarm', body, signers } };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** Common actions for policy tests, with the decision a typical guardrail policy should reach. */
|
|
177
|
+
export const policyCases = [
|
|
178
|
+
{ name: 'small payment', action: { target: 'payments.send', payload: { amount: 10 } }, typical: 'allow' },
|
|
179
|
+
{ name: 'large payment', action: { target: 'payments.send', payload: { amount: 50_000 } }, typical: 'require_approval' },
|
|
180
|
+
{ name: 'read CRM', action: { target: 'crm.read' }, typical: 'allow' },
|
|
181
|
+
{ name: 'wipe admin', action: { target: 'admin.wipe' }, typical: 'deny' },
|
|
182
|
+
{ name: 'critical risk', action: { target: 'infra.change', risk: 'critical' }, typical: 'require_approval' },
|
|
183
|
+
{ name: 'bulk export', action: { target: 'crm.export', payload: { rows: 1_000_000 } }, typical: 'require_approval' },
|
|
184
|
+
] as const;
|
|
185
|
+
|
|
186
|
+
/** Many valid receipts: `agents` agents, `perAgent` receipts each, chained per agent. For load and verifier benchmarks. */
|
|
187
|
+
export function generateLoad(opts: { agents: number; perAgent: number; target?: string; start?: string }) {
|
|
188
|
+
const start = Date.parse(opts.start ?? '2026-01-01T00:00:00Z');
|
|
189
|
+
const out: Receipt[] = [];
|
|
190
|
+
const t0 = performance.now();
|
|
191
|
+
for (let a = 0; a < opts.agents; a++) {
|
|
192
|
+
const agent = makeIdentity();
|
|
193
|
+
const d = [makeCert(makeIdentity(), agent, ['*'])];
|
|
194
|
+
let prev: string | null = null;
|
|
195
|
+
for (let i = 0; i < opts.perAgent; i++) {
|
|
196
|
+
const r = makeReceipt(agent, d, { target: opts.target ?? 'load.test', payload: { a, i }, prev, ts: new Date(start + i * 1000).toISOString() });
|
|
197
|
+
out.push(r);
|
|
198
|
+
prev = receiptHash(r);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return { receipts: out, perSecond: Math.round(out.length / ((performance.now() - t0) / 1000)) };
|
|
202
|
+
}
|