From 98857235d5690a3d3e81940ef8dbd8b3e330d0e8 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 18 Jun 2026 23:26:17 +0200 Subject: [PATCH] fix(live): validate gateway model limits --- scripts/test-live-gateway-models-docker.sh | 9 ++-- .../test-live-gateway-models-docker.test.ts | 52 +++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 test/scripts/test-live-gateway-models-docker.test.ts diff --git a/scripts/test-live-gateway-models-docker.sh b/scripts/test-live-gateway-models-docker.sh index 73e85a19f33..77141ae91da 100755 --- a/scripts/test-live-gateway-models-docker.sh +++ b/scripts/test-live-gateway-models-docker.sh @@ -17,6 +17,9 @@ CONFIG_DIR="${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw}" WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-$HOME/.openclaw/workspace}" PROFILE_FILE="$(openclaw_live_default_profile_file)" DOCKER_USER="${OPENCLAW_DOCKER_USER:-node}" +LIVE_GATEWAY_MAX_MODELS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_MAX_MODELS 8)" +LIVE_GATEWAY_STEP_TIMEOUT_MS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS 45000)" +LIVE_GATEWAY_MODEL_TIMEOUT_MS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS 90000)" TEMP_DIRS=() DOCKER_HOME_MOUNT=() DOCKER_AUTH_PRESTAGED=0 @@ -215,10 +218,10 @@ DOCKER_RUN_ARGS+=(--rm -t \ -e OPENCLAW_LIVE_GATEWAY_PROVIDERS="${OPENCLAW_LIVE_GATEWAY_PROVIDERS:-}" \ -e OPENCLAW_LIVE_GATEWAY_THINKING="${OPENCLAW_LIVE_GATEWAY_THINKING:-}" \ -e OPENCLAW_LIVE_GATEWAY_SMOKE="${OPENCLAW_LIVE_GATEWAY_SMOKE:-1}" \ - -e OPENCLAW_LIVE_GATEWAY_MAX_MODELS="${OPENCLAW_LIVE_GATEWAY_MAX_MODELS:-8}" \ + -e OPENCLAW_LIVE_GATEWAY_MAX_MODELS="$LIVE_GATEWAY_MAX_MODELS" \ -e OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS="${OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS:-}" \ - -e OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS="${OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS:-45000}" \ - -e OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS="${OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS:-90000}" \ + -e OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS="$LIVE_GATEWAY_STEP_TIMEOUT_MS" \ + -e OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS="$LIVE_GATEWAY_MODEL_TIMEOUT_MS" \ -e OPENCLAW_VITEST_FS_MODULE_CACHE=0) openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_HOME_MOUNT openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_TRUSTED_HARNESS_MOUNT diff --git a/test/scripts/test-live-gateway-models-docker.test.ts b/test/scripts/test-live-gateway-models-docker.test.ts new file mode 100644 index 00000000000..dd835a3f0c9 --- /dev/null +++ b/test/scripts/test-live-gateway-models-docker.test.ts @@ -0,0 +1,52 @@ +// Test Live Gateway Models Docker tests cover gateway live model Docker script behavior. +import { spawnSync } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import { describe, expect, it } from "vitest"; + +const SCRIPT_PATH = path.resolve( + import.meta.dirname, + "../../scripts/test-live-gateway-models-docker.sh", +); + +describe("scripts/test-live-gateway-models-docker.sh", () => { + it("validates numeric live gateway limits before auth or Docker setup", () => { + const script = fs.readFileSync(SCRIPT_PATH, "utf8"); + + expect(script).toContain( + 'LIVE_GATEWAY_MAX_MODELS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_MAX_MODELS 8)"', + ); + expect(script).toContain( + 'LIVE_GATEWAY_STEP_TIMEOUT_MS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS 45000)"', + ); + expect(script).toContain( + 'LIVE_GATEWAY_MODEL_TIMEOUT_MS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS 90000)"', + ); + expect(script).toContain('-e OPENCLAW_LIVE_GATEWAY_MAX_MODELS="$LIVE_GATEWAY_MAX_MODELS"'); + expect(script).toContain( + '-e OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS="$LIVE_GATEWAY_STEP_TIMEOUT_MS"', + ); + expect(script).toContain( + '-e OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS="$LIVE_GATEWAY_MODEL_TIMEOUT_MS"', + ); + }); + + it.each([ + ["max models", "OPENCLAW_LIVE_GATEWAY_MAX_MODELS", "two"], + ["step timeout", "OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS", "45s"], + ["model timeout", "OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS", "90s"], + ])("rejects invalid %s values before live Docker setup", (_label, envName, value) => { + const result = spawnSync("bash", [SCRIPT_PATH], { + encoding: "utf8", + env: { + ...process.env, + [envName]: value, + }, + }); + + expect(result.status).toBe(2); + expect(result.stderr).toContain(`invalid ${envName}: ${value}`); + expect(result.stderr).not.toContain("docker"); + expect(result.stderr).not.toContain("Cannot find package 'tsx'"); + }); +});