Files
reverse-engineering-anything/tests/boundary/process/processPreparation.test.ts
T
Ysopwnable c8544b1574 fix(process): preserve unknown filesystem absence in partial captures
Separate exhausted path enumeration from hash coverage and preserve known
effects outside incomplete roots or unfollowed symlink subtrees. Return
explicit unknown effects through capture Evidence and comparison workflows.

Assisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)
2026-10-09 12:09:24 +00:00

63 lines
2.2 KiB
TypeScript

import { expect, it, vi } from "vitest";
import { snapshotRoots } from "../../../src/process/capture/FilesystemSnapshot.js";
import { prepareProcessCapture } from "../../../src/process/capture/ProcessCaptureLifecycle.js";
import { parseProcessScenario } from "../../../src/domain/process/processCapture.js";
it("prepares ownership inspection before snapshotting or allocating a target run", async () => {
const failure = new Error("native process identity inspection unavailable");
const createTemporaryRoot = vi.fn(async () => "/unused");
const cleanup = vi.fn(async () => undefined);
const prepareOwnershipInspector = vi.fn(async () => {
throw failure;
});
const captureSnapshot: typeof snapshotRoots = async () => {
throw new Error("snapshot must not run after failed ownership preflight");
};
await expect(
prepareProcessCapture(
parseProcessScenario({
executable: "/bin/true",
working_directory: "/tmp",
}),
undefined,
captureSnapshot,
{ prepareOwnershipInspector, createTemporaryRoot, cleanup },
),
).rejects.toBe(failure);
expect(prepareOwnershipInspector).toHaveBeenCalledOnce();
expect(createTemporaryRoot).not.toHaveBeenCalled();
expect(cleanup).not.toHaveBeenCalled();
});
it("cleans the temporary root when cancellation arrives during identity capture", async () => {
const controller = new AbortController();
const temporaryRoot = "/temporary-capture-root";
const cleanup = vi.fn(async () => undefined);
const host = {
createTemporaryRoot: vi.fn(async () => temporaryRoot),
captureOwnershipBaseline: vi.fn(async (signal?: AbortSignal) => {
expect(signal).toBe(controller.signal);
controller.abort();
return [];
}),
cleanup,
};
await expect(
prepareProcessCapture(
parseProcessScenario({
executable: "/bin/true",
working_directory: "/tmp",
}),
controller.signal,
async () => ({ files: [], truncated: false, completeRoots: [] }),
host,
),
).rejects.toThrow(/cancelled/u);
expect(host.captureOwnershipBaseline).toHaveBeenCalledWith(controller.signal);
expect(cleanup).toHaveBeenCalledWith(temporaryRoot);
});