import { assert, describe, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as PlatformError from "effect/PlatformError";import { ChildProcessSpawner } from "effect/unstable/process"; import * as CodexError from "../errors.ts";import { makeTerminationError } from "./stdio.ts"; describe("Codex App Server child process termination", () => { it.effect("retains the process identifier with the exit code", () => Effect.gen(function* () { const error = yield* makeTerminationError({ pid: ChildProcessSpawner.ProcessId(51), exitCode: Effect.succeed(ChildProcessSpawner.ExitCode(9)), }); assert.instanceOf(error, CodexError.CodexAppServerProcessExitedError); assert.equal(error.pid, 51); assert.equal(error.code, 9); assert.equal(error.message, "Codex App Server process exited with code 9"); }), ); it.effect("retains the process identifier and exact exit-status cause", () => Effect.gen(function* () { const rootCause = new Error("private process diagnostics"); const cause = PlatformError.systemError({ _tag: "Unknown", module: "ChildProcess", method: "exitCode", cause: rootCause, }); const error = yield* makeTerminationError({ pid: ChildProcessSpawner.ProcessId(52), exitCode: Effect.fail(cause), }); assert.instanceOf(error, CodexError.CodexAppServerTransportError); assert.equal(error.pid, 52); assert.strictEqual(error.cause, cause); assert.equal( error.message, "Codex App Server transport operation 'read-process-exit-status' failed.", ); assert.notInclude(error.message, rootCause.message); }), );});
import { assert, describe, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
import * as PlatformError from "effect/PlatformError";
import { ChildProcessSpawner } from "effect/unstable/process";
import * as CodexError from "../errors.ts";
import { makeTerminationError } from "./stdio.ts";
describe("Codex App Server child process termination", () => {
it.effect("retains the process identifier with the exit code", () =>
Effect.gen(function* () {
const error = yield* makeTerminationError({
pid: ChildProcessSpawner.ProcessId(51),
exitCode: Effect.succeed(ChildProcessSpawner.ExitCode(9)),
});
assert.instanceOf(error, CodexError.CodexAppServerProcessExitedError);
assert.equal(error.pid, 51);
assert.equal(error.code, 9);
assert.equal(error.message, "Codex App Server process exited with code 9");
}),
);
it.effect("retains the process identifier and exact exit-status cause", () =>
Effect.gen(function* () {
const rootCause = new Error("private process diagnostics");
const cause = PlatformError.systemError({
_tag: "Unknown",
module: "ChildProcess",
method: "exitCode",
cause: rootCause,
});
const error = yield* makeTerminationError({
pid: ChildProcessSpawner.ProcessId(52),
exitCode: Effect.fail(cause),
});
assert.instanceOf(error, CodexError.CodexAppServerTransportError);
assert.equal(error.pid, 52);
assert.strictEqual(error.cause, cause);
assert.equal(
error.message,
"Codex App Server transport operation 'read-process-exit-status' failed.",
);
assert.notInclude(error.message, rootCause.message);
}),
);
});