





















@@ -21,6 +21,7 @@ const mockState = vi.hoisted(() => ({
2121gatewayAuth: [] as GatewayClientAuth[],
2222agentSideConnectionCtor: vi.fn(),
2323agentStart: vi.fn(),
24+routeLogsToStderr: vi.fn(),
2425resolveGatewayClientBootstrap: vi.fn<ResolveGatewayClientBootstrap>(async (_params) => ({
2526url: "ws://127.0.0.1:18789",
2627urlSource: "local loopback",
@@ -104,6 +105,10 @@ vi.mock("../infra/is-main.js", () => ({
104105isMainModule: () => false,
105106}));
106107108+vi.mock("../logging/console.js", () => ({
109+routeLogsToStderr: () => mockState.routeLogsToStderr(),
110+}));
111+107112vi.mock("./translator.js", () => ({
108113AcpGatewayAgent: class {
109114start(): void {
@@ -166,6 +171,7 @@ describe("serveAcpGateway startup", () => {
166171mockState.gatewayAuth.length = 0;
167172mockState.agentSideConnectionCtor.mockReset();
168173mockState.agentStart.mockReset();
174+mockState.routeLogsToStderr.mockReset();
169175mockState.resolveGatewayClientBootstrap.mockReset();
170176mockState.resolveGatewayClientBootstrap.mockResolvedValue({
171177url: "ws://127.0.0.1:18789",
@@ -192,6 +198,26 @@ describe("serveAcpGateway startup", () => {
192198}
193199});
194200201+it("routes logs to stderr before loading gateway config", async () => {
202+const { signalHandlers, onceSpy } = captureProcessSignalHandlers();
203+204+try {
205+const servePromise = serveAcpGateway({});
206+await Promise.resolve();
207+208+expect(mockState.routeLogsToStderr).toHaveBeenCalledTimes(1);
209+expect(mockState.routeLogsToStderr.mock.invocationCallOrder[0]).toBeLessThan(
210+mockState.resolveGatewayClientBootstrap.mock.invocationCallOrder[0] ??
211+Number.MAX_SAFE_INTEGER,
212+);
213+214+await emitHelloAndWaitForAgentSideConnection();
215+await stopServeWithSigint(signalHandlers, servePromise);
216+} finally {
217+onceSpy.mockRestore();
218+}
219+});
220+195221it("rejects startup when gateway connect fails before hello", async () => {
196222const onceSpy = vi
197223.spyOn(process, "once")
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。