diff --git a/scripts/test-projects.test-support.mjs b/scripts/test-projects.test-support.mjs index d7ec3f854d2..c82fd4ed2dd 100644 --- a/scripts/test-projects.test-support.mjs +++ b/scripts/test-projects.test-support.mjs @@ -644,6 +644,9 @@ export function buildFullSuiteVitestRunPlans(args, cwd = process.cwd()) { } export function shouldUseLocalFullSuiteParallelByDefault(env = process.env) { + if (hasConservativeVitestWorkerBudget(env)) { + return false; + } return ( env.OPENCLAW_TEST_PROJECTS_SERIAL !== "1" && env.CI !== "true" && env.GITHUB_ACTIONS !== "true" ); @@ -654,6 +657,13 @@ function parsePositiveInt(value) { return Number.isFinite(parsed) && parsed > 0 ? parsed : null; } +function hasConservativeVitestWorkerBudget(env) { + const workerBudget = parsePositiveInt( + env.OPENCLAW_VITEST_MAX_WORKERS ?? env.OPENCLAW_TEST_WORKERS, + ); + return workerBudget !== null && workerBudget <= 1; +} + export function resolveParallelFullSuiteConcurrency(specCount, env = process.env) { const override = parsePositiveInt(env.OPENCLAW_TEST_PROJECTS_PARALLEL); if (override !== null) { @@ -665,10 +675,7 @@ export function resolveParallelFullSuiteConcurrency(specCount, env = process.env if (env.CI === "true" || env.GITHUB_ACTIONS === "true") { return 1; } - const workerBudget = parsePositiveInt( - env.OPENCLAW_VITEST_MAX_WORKERS ?? env.OPENCLAW_TEST_WORKERS, - ); - if (workerBudget !== null && workerBudget <= 1) { + if (hasConservativeVitestWorkerBudget(env)) { return 1; } if ( diff --git a/src/scripts/test-projects.test.ts b/src/scripts/test-projects.test.ts index 99253f0f568..885432f975b 100644 --- a/src/scripts/test-projects.test.ts +++ b/src/scripts/test-projects.test.ts @@ -1,12 +1,22 @@ import { describe, expect, it } from "vitest"; const { + buildFullSuiteVitestRunPlans, buildVitestArgs, buildVitestRunPlans, createVitestRunSpecs, parseTestProjectsArgs, resolveParallelFullSuiteConcurrency, } = (await import("../../scripts/test-projects.test-support.mjs")) as unknown as { + buildFullSuiteVitestRunPlans: ( + args: string[], + cwd?: string, + ) => Array<{ + config: string; + forwardedArgs: string[]; + includePatterns: string[] | null; + watchMode: boolean; + }>; buildVitestArgs: (args: string[], cwd?: string) => string[]; buildVitestRunPlans: ( args: string[], @@ -411,6 +421,45 @@ describe("test-projects args", () => { ).toBe(1); }); + it("keeps conservative full-suite runs on aggregate shards", () => { + const originalVitestMaxWorkers = process.env.OPENCLAW_VITEST_MAX_WORKERS; + const originalTestWorkers = process.env.OPENCLAW_TEST_WORKERS; + const originalProjectParallel = process.env.OPENCLAW_TEST_PROJECTS_PARALLEL; + const originalLeafShards = process.env.OPENCLAW_TEST_PROJECTS_LEAF_SHARDS; + try { + process.env.OPENCLAW_VITEST_MAX_WORKERS = "1"; + delete process.env.OPENCLAW_TEST_WORKERS; + delete process.env.OPENCLAW_TEST_PROJECTS_PARALLEL; + delete process.env.OPENCLAW_TEST_PROJECTS_LEAF_SHARDS; + + const configs = buildFullSuiteVitestRunPlans([]).map((plan) => plan.config); + + expect(configs).toContain("vitest.full-agentic.config.ts"); + expect(configs).not.toContain("vitest.plugins.config.ts"); + } finally { + if (originalVitestMaxWorkers === undefined) { + delete process.env.OPENCLAW_VITEST_MAX_WORKERS; + } else { + process.env.OPENCLAW_VITEST_MAX_WORKERS = originalVitestMaxWorkers; + } + if (originalTestWorkers === undefined) { + delete process.env.OPENCLAW_TEST_WORKERS; + } else { + process.env.OPENCLAW_TEST_WORKERS = originalTestWorkers; + } + if (originalProjectParallel === undefined) { + delete process.env.OPENCLAW_TEST_PROJECTS_PARALLEL; + } else { + process.env.OPENCLAW_TEST_PROJECTS_PARALLEL = originalProjectParallel; + } + if (originalLeafShards === undefined) { + delete process.env.OPENCLAW_TEST_PROJECTS_LEAF_SHARDS; + } else { + process.env.OPENCLAW_TEST_PROJECTS_LEAF_SHARDS = originalLeafShards; + } + } + }); + it("keeps explicit project-level parallelism authoritative", () => { expect( resolveParallelFullSuiteConcurrency(58, {