rea/tests/boundary/process/processPreparation.test.ts
morluto 63cf28fd8f
fix(process): preserve partial evidence and verify detached cleanup (#1011)
* test(ci): allow transport delivery in source identity regression

* fix(process): preserve partial evidence and verify detached cleanup

* fix(process): scope Linux token sweeps by stable process identity

* fix(process): retain environment permission failure codes

* fix(process): wait for signaled processes before verifying cleanup

* fix(process): verify sampled detached groups during cleanup

* fix(electron): preserve prelaunch identities through cleanup

* fix(process): retry growing Darwin process table snapshots

* fix(process): retain compatibility with saved v3 capture evidence

* fix(process): migrate saved v3 captures during reconstruction verification

* fix(process): preserve cancellation during Darwin helper compilation

* fix(process): propagate cancellation through ownership baselines

* perf(javascript): cache canonical export comparison sort keys

* fix(process): cancel provider ownership preparation before spawn

* fix(process): isolate native compiler waiter cancellation
2026-10-08 04:46:46 +08:00

62 lines
2.1 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 }),
host,
),
).rejects.toThrow(/cancelled/u);
expect(host.captureOwnershipBaseline).toHaveBeenCalledWith(controller.signal);
expect(cleanup).toHaveBeenCalledWith(temporaryRoot);
});