diff --git a/scripts/e2e/gateway-network-docker.sh b/scripts/e2e/gateway-network-docker.sh index 91ee501eb04..278ebd04a4b 100644 --- a/scripts/e2e/gateway-network-docker.sh +++ b/scripts/e2e/gateway-network-docker.sh @@ -12,6 +12,22 @@ NET_NAME="openclaw-net-e2e-$$" GW_NAME="openclaw-gateway-e2e-$$" DOCKER_COMMAND_TIMEOUT="${OPENCLAW_GATEWAY_NETWORK_DOCKER_COMMAND_TIMEOUT:-600s}" CLIENT_TIMEOUT="${OPENCLAW_GATEWAY_NETWORK_CLIENT_TIMEOUT:-90s}" +CLIENT_LIMIT_ENV_ARGS=() +if [[ -n "${OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS+x}" ]]; then + CLIENT_CONNECT_TIMEOUT_MS="$( + docker_e2e_read_positive_int_env OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS 80000 + )" + CLIENT_LIMIT_ENV_ARGS+=( + -e "OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS=$CLIENT_CONNECT_TIMEOUT_MS" + ) +elif [[ -n "${OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS+x}" ]]; then + CONNECT_READY_TIMEOUT_MS="$( + docker_e2e_read_positive_int_env OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS 80000 + )" + CLIENT_LIMIT_ENV_ARGS+=( + -e "OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS=$CONNECT_READY_TIMEOUT_MS" + ) +fi cleanup() { docker_e2e_docker_cmd rm -f "$GW_NAME" >/dev/null 2>&1 || true @@ -49,6 +65,7 @@ echo "Running client container (connect + health)..." DOCKER_COMMAND_TIMEOUT="$CLIENT_TIMEOUT" run_logged gateway-network-client docker_e2e_docker_run_cmd run --rm \ "${DOCKER_E2E_HARNESS_ARGS[@]}" \ --network "$NET_NAME" \ + "${CLIENT_LIMIT_ENV_ARGS[@]}" \ -e "GW_URL=ws://$GW_NAME:$PORT" \ -e "GW_TOKEN=$TOKEN" \ "$IMAGE_NAME" \ diff --git a/test/scripts/docker-build-helper.test.ts b/test/scripts/docker-build-helper.test.ts index 5d8cecedacd..ea26ee570f0 100644 --- a/test/scripts/docker-build-helper.test.ts +++ b/test/scripts/docker-build-helper.test.ts @@ -3387,6 +3387,45 @@ output="$(cat "$sampler_log")" ); }); + it.each([ + ["connect", "OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS", "100ms"], + ["ready", "OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS", "1e3"], + ])( + "rejects invalid gateway network client %s timeout before Docker setup", + (_label, envName, value) => { + const result = spawnSync("bash", [GATEWAY_NETWORK_DOCKER_E2E_PATH], { + encoding: "utf8", + env: { + ...process.env, + [envName]: value, + OPENCLAW_SKIP_DOCKER_BUILD: "1", + }, + }); + + expect(result.status).toBe(2); + expect(result.stderr).toContain(`invalid ${envName}: ${value}`); + expect(result.stderr).not.toContain("Docker image not found"); + }, + ); + + it("forwards gateway network client timeout env into the Docker client", () => { + const runner = readFileSync(GATEWAY_NETWORK_DOCKER_E2E_PATH, "utf8"); + + expect(runner).toContain( + "docker_e2e_read_positive_int_env OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS 80000", + ); + expect(runner).toContain( + "docker_e2e_read_positive_int_env OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS 80000", + ); + expect(runner).toContain( + '-e "OPENCLAW_GATEWAY_NETWORK_CLIENT_CONNECT_TIMEOUT_MS=$CLIENT_CONNECT_TIMEOUT_MS"', + ); + expect(runner).toContain( + '-e "OPENCLAW_GATEWAY_NETWORK_CONNECT_READY_TIMEOUT_MS=$CONNECT_READY_TIMEOUT_MS"', + ); + expect(runner).toContain('"${CLIENT_LIMIT_ENV_ARGS[@]}"'); + }); + it("requires TCP readiness for the gateway network runner", () => { const runner = readFileSync(GATEWAY_NETWORK_DOCKER_E2E_PATH, "utf8");