diff --git a/scripts/e2e/parallels/env-limits.ts b/scripts/e2e/parallels/env-limits.ts index 9e3b6c8740f4..853dc24526b7 100644 --- a/scripts/e2e/parallels/env-limits.ts +++ b/scripts/e2e/parallels/env-limits.ts @@ -15,6 +15,14 @@ export function parsePositiveInt(value: string, label: string): number { return parsed; } +export function parseTcpPort(value: string, label: string): number { + const parsed = parsePositiveInt(value, label); + if (parsed > 65_535) { + die(`invalid ${label}: ${value}`); + } + return parsed; +} + export function readPositiveIntEnv(name: string, fallback: number): number { const raw = process.env[name]; if (raw == null || raw.trim() === "") { diff --git a/scripts/e2e/parallels/linux-smoke.ts b/scripts/e2e/parallels/linux-smoke.ts index f6220e135842..c8642a35dfaf 100755 --- a/scripts/e2e/parallels/linux-smoke.ts +++ b/scripts/e2e/parallels/linux-smoke.ts @@ -11,7 +11,7 @@ import { makeTempDir, parseBoolEnv, parseMode, - parsePositiveInt, + parseTcpPort, parseProvider, readPositiveIntEnv, modelProviderConfigBatchJson, @@ -202,7 +202,7 @@ export function parseArgs(argv: string[]): LinuxOptions { i++; break; case "--host-port": - options.hostPort = parsePositiveInt(ensureValue(args, i, arg), arg); + options.hostPort = parseTcpPort(ensureValue(args, i, arg), arg); options.hostPortExplicit = true; i++; break; diff --git a/scripts/e2e/parallels/macos-smoke.ts b/scripts/e2e/parallels/macos-smoke.ts index 72513b7ce335..ea67d75a301f 100755 --- a/scripts/e2e/parallels/macos-smoke.ts +++ b/scripts/e2e/parallels/macos-smoke.ts @@ -18,7 +18,7 @@ import { modelProviderConfigBatchJson, posixCodexPlatformPackageRepairFunction, posixProviderOnlyPluginIsolationScript, - parsePositiveInt, + parseTcpPort, readPositiveIntEnv, resolveParallelsModelTimeoutSeconds, resolveHostIp, @@ -202,7 +202,7 @@ export function parseArgs(argv: string[]): MacosOptions { i++; break; case "--host-port": - options.hostPort = parsePositiveInt(ensureValue(args, i, arg), arg); + options.hostPort = parseTcpPort(ensureValue(args, i, arg), arg); options.hostPortExplicit = true; i++; break; diff --git a/scripts/e2e/parallels/windows-smoke.ts b/scripts/e2e/parallels/windows-smoke.ts index ccb34bc64cb4..6c9abd87750f 100755 --- a/scripts/e2e/parallels/windows-smoke.ts +++ b/scripts/e2e/parallels/windows-smoke.ts @@ -9,7 +9,7 @@ import { currentRunningSnapshotInfo, makeTempDir, parseMode, - parsePositiveInt, + parseTcpPort, parseProvider, readPositiveIntEnv, resolveLatestVersion, @@ -157,7 +157,7 @@ export function parseArgs(argv: string[]): WindowsOptions { options.hostIp = value; }, "--host-port": (value) => { - options.hostPort = parsePositiveInt(value, "--host-port"); + options.hostPort = parseTcpPort(value, "--host-port"); options.hostPortExplicit = true; }, "--install-url": (value) => { diff --git a/test/scripts/parallels-smoke-model.test.ts b/test/scripts/parallels-smoke-model.test.ts index 281450bbd1cc..4c9f553647c4 100644 --- a/test/scripts/parallels-smoke-model.test.ts +++ b/test/scripts/parallels-smoke-model.test.ts @@ -172,6 +172,9 @@ describe("Parallels smoke model selection", () => { let invalidHostPortResult: ReturnType; let invalidLinuxHostPortResult: ReturnType; let invalidWindowsHostPortResult: ReturnType; + let invalidMacosHostPortRangeResult: ReturnType; + let invalidLinuxHostPortRangeResult: ReturnType; + let invalidWindowsHostPortRangeResult: ReturnType; let invalidLinuxAgentTimeoutResult: ReturnType; let invalidWindowsAgentTimeoutResult: ReturnType; let invalidWindowsUpdateTimeoutResult: ReturnType; @@ -218,6 +221,18 @@ describe("Parallels smoke model selection", () => { `process.argv = ["node", "${TS_PATHS.windows}", "--host-port", "0x4800"]; await import("./${TS_PATHS.windows}");`, { env: process.env, imports: ["tsx"] }, ); + invalidMacosHostPortRangeResult = spawnNodeEvalSync( + `process.argv = ["node", "${TS_PATHS.macos}", "--host-port", "65536"]; await import("./${TS_PATHS.macos}");`, + { env: process.env, imports: ["tsx"] }, + ); + invalidLinuxHostPortRangeResult = spawnNodeEvalSync( + `process.argv = ["node", "${TS_PATHS.linux}", "--host-port", "65536"]; await import("./${TS_PATHS.linux}");`, + { env: process.env, imports: ["tsx"] }, + ); + invalidWindowsHostPortRangeResult = spawnNodeEvalSync( + `process.argv = ["node", "${TS_PATHS.windows}", "--host-port", "65536"]; await import("./${TS_PATHS.windows}");`, + { env: process.env, imports: ["tsx"] }, + ); invalidLinuxAgentTimeoutResult = spawnNodeEvalSync( `process.env.OPENCLAW_PARALLELS_LINUX_AGENT_TIMEOUT_S = "1e3"; process.argv = ["node", "${TS_PATHS.linux}"]; await import("./${TS_PATHS.linux}");`, { env: process.env, imports: ["tsx"] }, @@ -254,6 +269,9 @@ describe("Parallels smoke model selection", () => { expect(parseMacosSmokeArgs(["--mode", "fresh", "--", "--mode", "upgrade"]).mode).toBe("fresh"); expect(parseMacosSmokeArgs([]).vmNameExplicit).toBe(false); expect(parseMacosSmokeArgs(["--vm", "macOS"]).vmNameExplicit).toBe(true); + expect(parseMacosSmokeArgs(["--host-port", "65535"]).hostPort).toBe(65535); + expect(parseLinuxSmokeArgs(["--host-port", "65535"]).hostPort).toBe(65535); + expect(parseWindowsSmokeArgs(["--host-port", "65535"]).hostPort).toBe(65535); expect(parseNpmUpdateSmokeArgs(["--", "--package-spec", "openclaw@2026.5.1"]).packageSpec).toBe( "openclaw@2026.5.1", ); @@ -1496,6 +1514,15 @@ setInterval(() => {}, 1000); expect(invalidWindowsHostPortResult.status).toBe(1); expect(invalidWindowsHostPortResult.stderr).toContain("invalid --host-port: 0x4800"); + expect(invalidMacosHostPortRangeResult.status).toBe(1); + expect(invalidMacosHostPortRangeResult.stderr).toContain("invalid --host-port: 65536"); + + expect(invalidLinuxHostPortRangeResult.status).toBe(1); + expect(invalidLinuxHostPortRangeResult.stderr).toContain("invalid --host-port: 65536"); + + expect(invalidWindowsHostPortRangeResult.status).toBe(1); + expect(invalidWindowsHostPortRangeResult.stderr).toContain("invalid --host-port: 65536"); + expect(invalidLinuxAgentTimeoutResult.status).toBe(1); expect(invalidLinuxAgentTimeoutResult.stderr).toContain( "invalid OPENCLAW_PARALLELS_LINUX_AGENT_TIMEOUT_S: 1e3",