mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
006c4cadc9
* test: nightly parser fuzz lane with typed-AppError invariant (#1414) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): run envelope, artifact promotion, and harness self-check tests (#1414) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): shared scheduled-lane envelope on every terminal path, watchdog after ready (#1414) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): envelope for malformed options; add scheduled-lane health consumer (#1414, #1430) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(lanes): actions:read scope, terminal error envelope, first-due grace (#1414, #1430) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(lanes): anchor first-run grace to schedule registration, use exec helper in tests (#1414, #1430) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(lanes): portable POSIX pickaxe pattern for schedule registration (#1414, #1430) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(fuzz): fast-check generators over the shared hazard list, drop the bundled lane-health work (#1414) - Strip scripts/scheduled-lane/* and scheduled-lane-health.yml: that watcher is #1430's own deliverable and collides with PR #1439's implementation of the same lane. What this lane owes (a per-run envelope) moves into scripts/fuzz/envelope.ts. - Rebase onto #1437 and rebuild the generator layer on fast-check: cases come from arbitraries sharing SELECTOR_VALUE_HAZARDS with the property suite, and counterexamples are shrunk, so a failure names a minimal input plus fast-check's seed/path instead of a 20k-char random string. - Route harness.test.ts into the serialized subprocess-stub project. - Drop the AGENT_DEVICE_FUZZ_STARTUP_DELAY_MS test seam: the ready handshake is now proven by a case budget far below real worker startup. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): replay the regression corpus through the worker watchdog (#1414) A promoted hang case used to wedge the unit job until the CI timeout, because corpus replay called checkCase in-process. It now goes through the same worker-backed watchdog the nightly lane uses, so such a case fails against a 5s per-case budget; the file moves to the serialized subprocess-stub project with the rest of the worker-driven fuzz tests. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): let the watchdog outlive vitest's default case timeout (#1414) A wedged parser was surfacing as a bare 'Test timed out in 5000ms' instead of the named hang: failure that says which input wedged, because the file's vitest timeout was shorter than the watchdog budget times the number of replayed cases. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fuzz): complete drift provenance in the lane envelope (#1414) configHash now covers every input that decides what a seed generates (generate.ts and the shared property arbitraries, not just the arbitraries/targets/invariant), and tool records fast-check's installed version. A generation-loop edit or a fast-check upgrade previously changed the case set while the envelope looked unchanged. A test recomputes the hash with each input omitted so a future omission fails. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Michał Pierzchała <thymikee@gmail.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
36 lines
1.6 KiB
TypeScript
36 lines
1.6 KiB
TypeScript
// Case-executing worker for the parser fuzz lane (#1414).
|
|
//
|
|
// The cases run off the main thread for one reason: a synchronous parser that never returns
|
|
// cannot be timed out from inside its own tick. The worker answers one case at a time; the
|
|
// runner (scripts/fuzz/execute.ts) budgets the answer from the main thread and terminates this
|
|
// thread when a case stops answering, which is how a hang is attributed to an exact input.
|
|
|
|
import { parentPort, workerData } from 'node:worker_threads';
|
|
import { checkCase, type FuzzFailure } from './invariant.ts';
|
|
import { getFuzzTarget } from './registry.ts';
|
|
|
|
export type FuzzWorkerData = { targetName: string };
|
|
|
|
export type FuzzWorkerRequest = { kind: 'case'; input: string };
|
|
|
|
export type FuzzWorkerMessage = { kind: 'ready' } | { kind: 'result'; failure: FuzzFailure | null };
|
|
|
|
const port = parentPort;
|
|
if (!port) throw new Error('scripts/fuzz/worker.ts must be run as a worker thread.');
|
|
|
|
const { targetName } = workerData as FuzzWorkerData;
|
|
const target = getFuzzTarget(targetName);
|
|
|
|
// The batch-steps parser warns on deprecated step shapes; a fuzz run would emit thousands of
|
|
// those lines and bury the failure report.
|
|
process.stderr.write = (() => true) as typeof process.stderr.write;
|
|
|
|
port.on('message', (request: FuzzWorkerRequest) => {
|
|
const failure = checkCase(target, request.input);
|
|
port.postMessage({ kind: 'result', failure } satisfies FuzzWorkerMessage);
|
|
});
|
|
|
|
// Module loading (type stripping, parser imports) can outlast a per-case budget, so the runner
|
|
// only starts a case budget after this handshake.
|
|
port.postMessage({ kind: 'ready' } satisfies FuzzWorkerMessage);
|