From aba6f7ad217f151beac76e6027460dba536ebd32 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 18 Jun 2026 23:33:44 +0200 Subject: [PATCH] fix(live): validate model sweep limits --- scripts/test-live-models-docker.sh | 13 ++++++- test/scripts/test-live-models-docker.test.ts | 39 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 test/scripts/test-live-models-docker.test.ts diff --git a/scripts/test-live-models-docker.sh b/scripts/test-live-models-docker.sh index 53641494b60..468c51c32f6 100755 --- a/scripts/test-live-models-docker.sh +++ b/scripts/test-live-models-docker.sh @@ -30,6 +30,15 @@ openclaw_live_truthy() { esac } +LIVE_MAX_MODELS="${OPENCLAW_LIVE_MAX_MODELS:-}" +if [[ -n "$LIVE_MAX_MODELS" && ! "$LIVE_MAX_MODELS" =~ ^\+?[0-9]+$ ]]; then + echo "invalid OPENCLAW_LIVE_MAX_MODELS: $LIVE_MAX_MODELS" >&2 + exit 2 +fi +LIVE_MODEL_TIMEOUT_MS="${OPENCLAW_LIVE_MODEL_TIMEOUT_MS:-}" +if [[ -n "$LIVE_MODEL_TIMEOUT_MS" ]]; then + LIVE_MODEL_TIMEOUT_MS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_MODEL_TIMEOUT_MS "$LIVE_MODEL_TIMEOUT_MS")" +fi TEMP_DIRS=() DOCKER_HOME_MOUNT=() cleanup_temp_dirs() { @@ -228,8 +237,8 @@ DOCKER_RUN_ARGS+=(--rm -t \ -e OPENCLAW_LIVE_TEST=1 \ -e OPENCLAW_LIVE_MODELS="${OPENCLAW_LIVE_MODELS:-modern}" \ -e OPENCLAW_LIVE_PROVIDERS="${OPENCLAW_LIVE_PROVIDERS:-}" \ - -e OPENCLAW_LIVE_MAX_MODELS="${OPENCLAW_LIVE_MAX_MODELS:-}" \ - -e OPENCLAW_LIVE_MODEL_TIMEOUT_MS="${OPENCLAW_LIVE_MODEL_TIMEOUT_MS:-}" \ + -e OPENCLAW_LIVE_MAX_MODELS="$LIVE_MAX_MODELS" \ + -e OPENCLAW_LIVE_MODEL_TIMEOUT_MS="$LIVE_MODEL_TIMEOUT_MS" \ -e OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS="${OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS:-}" \ -e OPENCLAW_LIVE_GATEWAY_MODELS="${OPENCLAW_LIVE_GATEWAY_MODELS:-}" \ -e OPENCLAW_LIVE_GATEWAY_PROVIDERS="${OPENCLAW_LIVE_GATEWAY_PROVIDERS:-}" \ diff --git a/test/scripts/test-live-models-docker.test.ts b/test/scripts/test-live-models-docker.test.ts new file mode 100644 index 00000000000..7a2374d19f5 --- /dev/null +++ b/test/scripts/test-live-models-docker.test.ts @@ -0,0 +1,39 @@ +// Test Live Models Docker tests cover direct 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-models-docker.sh"); + +describe("scripts/test-live-models-docker.sh", () => { + it("validates optional live model limits before auth or Docker setup", () => { + const script = fs.readFileSync(SCRIPT_PATH, "utf8"); + + expect(script).toContain('LIVE_MAX_MODELS="${OPENCLAW_LIVE_MAX_MODELS:-}"'); + expect(script).toContain('[[ -n "$LIVE_MAX_MODELS" && ! "$LIVE_MAX_MODELS" =~ ^\\+?[0-9]+$ ]]'); + expect(script).toContain( + 'openclaw_live_read_positive_int_env OPENCLAW_LIVE_MODEL_TIMEOUT_MS "$LIVE_MODEL_TIMEOUT_MS"', + ); + expect(script).toContain('-e OPENCLAW_LIVE_MAX_MODELS="$LIVE_MAX_MODELS"'); + expect(script).toContain('-e OPENCLAW_LIVE_MODEL_TIMEOUT_MS="$LIVE_MODEL_TIMEOUT_MS"'); + }); + + it.each([ + ["max models", "OPENCLAW_LIVE_MAX_MODELS", "3models"], + ["model timeout", "OPENCLAW_LIVE_MODEL_TIMEOUT_MS", "45s"], + ])("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'"); + }); +});