From b8811b7dde14078a9cce3eedaf58a9d30a0533ae Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Tue, 23 Jun 2026 17:30:37 +0200 Subject: [PATCH] fix(qa): reject duplicate gateway cpu controls --- scripts/check-gateway-cpu-scenarios.mjs | 14 ++++++++++++++ test/scripts/check-gateway-cpu-scenarios.test.ts | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/scripts/check-gateway-cpu-scenarios.mjs b/scripts/check-gateway-cpu-scenarios.mjs index 8525a9fbed5..a6c10a83a04 100644 --- a/scripts/check-gateway-cpu-scenarios.mjs +++ b/scripts/check-gateway-cpu-scenarios.mjs @@ -24,6 +24,13 @@ const DEFAULT_QA_SCENARIOS = [ "memory-failure-fallback", "gateway-restart-inflight-run", ]; +const SINGLE_VALUE_FLAGS = new Set([ + "--cpu-core-warn", + "--hot-wall-warn-ms", + "--output-dir", + "--runs", + "--warmup", +]); const DEFAULT_CPU_CORE_WARN = 0.9; const DEFAULT_HOT_WALL_WARN_MS = 30_000; const PRIVATE_QA_REQUIRED_DIST_ENTRIES = [ @@ -49,8 +56,15 @@ function parseArgs(argv) { cpuCoreWarn: DEFAULT_CPU_CORE_WARN, hotWallWarnMs: DEFAULT_HOT_WALL_WARN_MS, }; + const seenSingleValueFlags = new Set(); for (let index = 0; index < args.length; index += 1) { const arg = args[index]; + if (SINGLE_VALUE_FLAGS.has(arg)) { + if (seenSingleValueFlags.has(arg)) { + throw new Error(`${arg} was provided more than once`); + } + seenSingleValueFlags.add(arg); + } const readValue = () => { const value = args[index + 1]; if (!value || value.startsWith("-")) { diff --git a/test/scripts/check-gateway-cpu-scenarios.test.ts b/test/scripts/check-gateway-cpu-scenarios.test.ts index 5981f3a9fc9..8bfcccdc135 100644 --- a/test/scripts/check-gateway-cpu-scenarios.test.ts +++ b/test/scripts/check-gateway-cpu-scenarios.test.ts @@ -111,6 +111,19 @@ describe("gateway CPU scenario guard", () => { } }); + it("rejects duplicate single-value controls before running scenarios", () => { + expect(() => + testing.parseArgs(["--output-dir", makeTempRoot(), "--output-dir", makeTempRoot()]), + ).toThrow("--output-dir was provided more than once"); + + const result = runCli("--runs", "1", "--runs", "2"); + + expect(result.status).toBe(1); + expect(result.stdout).toBe(""); + expect(result.stderr.trim()).toBe("--runs was provided more than once"); + expectNoNodeStack(result.stderr); + }); + it("reports CLI argument errors without a Node stack trace", () => { const result = runCli("--wat");