Skip to content

Commit dc81043

Browse files
committed
test: harden docker mcp smoke requests
1 parent 61b0cd3 commit dc81043

2 files changed

Lines changed: 56 additions & 90 deletions

File tree

scripts/e2e/cron-mcp-cleanup-docker-client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,13 @@ async function runCronCleanupScenario(params: {
127127
enabled: true,
128128
schedule: { kind: "every", everyMs: 60_000 },
129129
sessionTarget: "isolated",
130-
wakeMode: "now",
130+
wakeMode: "next-heartbeat",
131131
payload: {
132132
kind: "agentTurn",
133133
message: "Use available context and then stop.",
134134
timeoutSeconds: 90,
135135
lightContext: true,
136-
toolsAllow: ["cronCleanupProbe__cleanup_probe"],
136+
toolsAllow: ["bundle-mcp", "cronCleanupProbe__cleanup_probe"],
137137
},
138138
delivery: { mode: "none" },
139139
});

scripts/e2e/mcp-channels-harness.ts

Lines changed: 54 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -205,103 +205,69 @@ async function connectGatewayOnce(params: {
205205
pending.clear();
206206
});
207207

208-
const connectId = randomUUID();
209-
ws.send(
210-
JSON.stringify({
208+
const sendGatewayRequest = <T = unknown>(
209+
method: string,
210+
requestParams: unknown,
211+
timeoutMs: number,
212+
): Promise<T> => {
213+
const id = randomUUID();
214+
const frame = JSON.stringify({
211215
type: "req",
212-
id: connectId,
213-
method: "connect",
214-
params: {
215-
minProtocol: PROTOCOL_VERSION,
216-
maxProtocol: PROTOCOL_VERSION,
217-
client: {
218-
id: "openclaw-tui",
219-
displayName: "docker-mcp-channels",
220-
version: "1.0.0",
221-
platform: process.platform,
222-
mode: "ui",
216+
id,
217+
method,
218+
params: requestParams ?? {},
219+
});
220+
return new Promise<T>((resolve, reject) => {
221+
const timeout = setTimeout(() => {
222+
pending.delete(id);
223+
reject(new Error(`gateway request timeout: ${method}`));
224+
}, timeoutMs);
225+
timeout.unref?.();
226+
pending.set(id, {
227+
resolve: (value) => {
228+
clearTimeout(timeout);
229+
resolve(value as T);
223230
},
224-
role: "operator",
225-
scopes: requestedScopes,
226-
caps: [],
227-
auth: { token: params.token },
228-
},
229-
}),
230-
);
231-
232-
await new Promise<void>((resolve, reject) => {
233-
const timeout = setTimeout(() => {
234-
pending.delete(connectId);
235-
reject(new Error("gateway connect timeout"));
236-
}, GATEWAY_RPC_TIMEOUT_MS);
237-
timeout.unref?.();
238-
pending.set(connectId, {
239-
resolve: () => {
240-
clearTimeout(timeout);
241-
resolve();
242-
},
243-
reject: (error) => {
231+
reject: (error) => {
232+
clearTimeout(timeout);
233+
reject(error);
234+
},
235+
});
236+
try {
237+
ws.send(frame);
238+
} catch (error) {
244239
clearTimeout(timeout);
245-
reject(error);
246-
},
240+
pending.delete(id);
241+
reject(error instanceof Error ? error : new Error(String(error)));
242+
}
247243
});
248-
});
244+
};
249245

250-
await new Promise<void>((resolve, reject) => {
251-
const id = randomUUID();
252-
const timeout = setTimeout(() => {
253-
pending.delete(id);
254-
reject(new Error("gateway sessions.subscribe timeout"));
255-
}, GATEWAY_RPC_TIMEOUT_MS);
256-
timeout.unref?.();
257-
pending.set(id, {
258-
resolve: () => {
259-
clearTimeout(timeout);
260-
resolve();
261-
},
262-
reject: (error) => {
263-
clearTimeout(timeout);
264-
reject(error);
246+
await sendGatewayRequest(
247+
"connect",
248+
{
249+
minProtocol: PROTOCOL_VERSION,
250+
maxProtocol: PROTOCOL_VERSION,
251+
client: {
252+
id: "openclaw-tui",
253+
displayName: "docker-mcp-channels",
254+
version: "1.0.0",
255+
platform: process.platform,
256+
mode: "ui",
265257
},
266-
});
267-
ws.send(
268-
JSON.stringify({
269-
type: "req",
270-
id,
271-
method: "sessions.subscribe",
272-
params: {},
273-
}),
274-
);
275-
});
258+
role: "operator",
259+
scopes: requestedScopes,
260+
caps: [],
261+
auth: { token: params.token },
262+
},
263+
GATEWAY_RPC_TIMEOUT_MS,
264+
);
265+
266+
await sendGatewayRequest("sessions.subscribe", {}, GATEWAY_RPC_TIMEOUT_MS);
276267

277268
return {
278269
request(method, requestParams) {
279-
const id = randomUUID();
280-
ws.send(
281-
JSON.stringify({
282-
type: "req",
283-
id,
284-
method,
285-
params: requestParams ?? {},
286-
}),
287-
);
288-
return new Promise((resolve, reject) => {
289-
const timeout = setTimeout(() => {
290-
pending.delete(id);
291-
reject(new Error(`gateway request timeout: ${method}`));
292-
}, GATEWAY_REQUEST_TIMEOUT_MS);
293-
timeout.unref?.();
294-
pending.set(id, {
295-
resolve: (value) => {
296-
clearTimeout(timeout);
297-
resolve(value as T);
298-
},
299-
reject: (error) => {
300-
clearTimeout(timeout);
301-
reject(error);
302-
},
303-
});
304-
});
270+
return sendGatewayRequest(method, requestParams, GATEWAY_REQUEST_TIMEOUT_MS);
305271
},
306272
events,
307273
async close() {

0 commit comments

Comments
 (0)