diff --git a/scripts/test-parallel.mjs b/scripts/test-parallel.mjs index b685d41820..a4a9c3bd38 100644 --- a/scripts/test-parallel.mjs +++ b/scripts/test-parallel.mjs @@ -139,7 +139,8 @@ const maxWorkersForRun = (name) => { return 1; } if (name === "unit-isolated") { - return 1; + // Local: allow a bit of parallelism while keeping this run stable. + return Math.min(4, localWorkers); } if (name === "extensions") { return defaultExtensionsWorkers; diff --git a/src/browser/server-context.ensure-tab-available.prefers-last-target.test.ts b/src/browser/server-context.ensure-tab-available.prefers-last-target.test.ts index 04f01014ae..2677d840eb 100644 --- a/src/browser/server-context.ensure-tab-available.prefers-last-target.test.ts +++ b/src/browser/server-context.ensure-tab-available.prefers-last-target.test.ts @@ -1,14 +1,27 @@ -import { describe, expect, it, vi } from "vitest"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import type { BrowserServerState } from "./server-context.js"; import { createBrowserRouteContext } from "./server-context.js"; +const chromeUserDataDir = vi.hoisted(() => ({ dir: "/tmp/openclaw" })); + +beforeAll(async () => { + chromeUserDataDir.dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chrome-user-data-")); +}); + +afterAll(async () => { + await fs.rm(chromeUserDataDir.dir, { recursive: true, force: true }); +}); + vi.mock("./chrome.js", () => ({ isChromeCdpReady: vi.fn(async () => true), isChromeReachable: vi.fn(async () => true), launchOpenClawChrome: vi.fn(async () => { throw new Error("unexpected launch"); }), - resolveOpenClawUserDataDir: vi.fn(() => "/tmp/openclaw"), + resolveOpenClawUserDataDir: vi.fn(() => chromeUserDataDir.dir), stopOpenClawChrome: vi.fn(async () => {}), })); diff --git a/src/browser/server-context.remote-tab-ops.test.ts b/src/browser/server-context.remote-tab-ops.test.ts index a791bd10ec..8e06b30824 100644 --- a/src/browser/server-context.remote-tab-ops.test.ts +++ b/src/browser/server-context.remote-tab-ops.test.ts @@ -1,16 +1,29 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import type { BrowserServerState } from "./server-context.js"; import * as cdpModule from "./cdp.js"; import * as pwAiModule from "./pw-ai-module.js"; import { createBrowserRouteContext } from "./server-context.js"; +const chromeUserDataDir = vi.hoisted(() => ({ dir: "/tmp/openclaw" })); + +beforeAll(async () => { + chromeUserDataDir.dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chrome-user-data-")); +}); + +afterAll(async () => { + await fs.rm(chromeUserDataDir.dir, { recursive: true, force: true }); +}); + vi.mock("./chrome.js", () => ({ isChromeCdpReady: vi.fn(async () => true), isChromeReachable: vi.fn(async () => true), launchOpenClawChrome: vi.fn(async () => { throw new Error("unexpected launch"); }), - resolveOpenClawUserDataDir: vi.fn(() => "/tmp/openclaw"), + resolveOpenClawUserDataDir: vi.fn(() => chromeUserDataDir.dir), stopOpenClawChrome: vi.fn(async () => {}), })); diff --git a/src/browser/server.agent-contract-form-layout-act-commands.test.ts b/src/browser/server.agent-contract-form-layout-act-commands.test.ts index 2c5c223474..c4f44ed9c9 100644 --- a/src/browser/server.agent-contract-form-layout-act-commands.test.ts +++ b/src/browser/server.agent-contract-form-layout-act-commands.test.ts @@ -1,6 +1,9 @@ +import fs from "node:fs/promises"; import { type AddressInfo, createServer } from "node:net"; +import os from "node:os"; +import path from "node:path"; import { fetch as realFetch } from "undici"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; let testPort = 0; let cdpBaseUrl = ""; @@ -62,6 +65,16 @@ const pwMocks = vi.hoisted(() => ({ waitForViaPlaywright: vi.fn(async () => {}), })); +const chromeUserDataDir = vi.hoisted(() => ({ dir: "/tmp/openclaw" })); + +beforeAll(async () => { + chromeUserDataDir.dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chrome-user-data-")); +}); + +afterAll(async () => { + await fs.rm(chromeUserDataDir.dir, { recursive: true, force: true }); +}); + function makeProc(pid = 123) { const handlers = new Map void>>(); return { @@ -116,13 +129,13 @@ vi.mock("./chrome.js", () => ({ return { pid: 123, exe: { kind: "chrome", path: "/fake/chrome" }, - userDataDir: "/tmp/openclaw", + userDataDir: chromeUserDataDir.dir, cdpPort: profile.cdpPort, startedAt: Date.now(), proc, }; }), - resolveOpenClawUserDataDir: vi.fn(() => "/tmp/openclaw"), + resolveOpenClawUserDataDir: vi.fn(() => chromeUserDataDir.dir), stopOpenClawChrome: vi.fn(async () => { reachable = false; }), diff --git a/src/browser/server.agent-contract-snapshot-endpoints.test.ts b/src/browser/server.agent-contract-snapshot-endpoints.test.ts index 3d84311046..b90924e59f 100644 --- a/src/browser/server.agent-contract-snapshot-endpoints.test.ts +++ b/src/browser/server.agent-contract-snapshot-endpoints.test.ts @@ -1,6 +1,9 @@ +import fs from "node:fs/promises"; import { type AddressInfo, createServer } from "node:net"; +import os from "node:os"; +import path from "node:path"; import { fetch as realFetch } from "undici"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { DEFAULT_AI_SNAPSHOT_MAX_CHARS } from "./constants.js"; let testPort = 0; @@ -61,6 +64,16 @@ const pwMocks = vi.hoisted(() => ({ waitForViaPlaywright: vi.fn(async () => {}), })); +const chromeUserDataDir = vi.hoisted(() => ({ dir: "/tmp/openclaw" })); + +beforeAll(async () => { + chromeUserDataDir.dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chrome-user-data-")); +}); + +afterAll(async () => { + await fs.rm(chromeUserDataDir.dir, { recursive: true, force: true }); +}); + function makeProc(pid = 123) { const handlers = new Map void>>(); return { @@ -114,13 +127,13 @@ vi.mock("./chrome.js", () => ({ return { pid: 123, exe: { kind: "chrome", path: "/fake/chrome" }, - userDataDir: "/tmp/openclaw", + userDataDir: chromeUserDataDir.dir, cdpPort: profile.cdpPort, startedAt: Date.now(), proc, }; }), - resolveOpenClawUserDataDir: vi.fn(() => "/tmp/openclaw"), + resolveOpenClawUserDataDir: vi.fn(() => chromeUserDataDir.dir), stopOpenClawChrome: vi.fn(async () => { reachable = false; }), diff --git a/src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts b/src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts index 9ed16d6f3b..8c4612acb1 100644 --- a/src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts +++ b/src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts @@ -1,6 +1,9 @@ +import fs from "node:fs/promises"; import { type AddressInfo, createServer } from "node:net"; +import os from "node:os"; +import path from "node:path"; import { fetch as realFetch } from "undici"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; let testPort = 0; let _cdpBaseUrl = ""; @@ -60,6 +63,16 @@ const pwMocks = vi.hoisted(() => ({ waitForViaPlaywright: vi.fn(async () => {}), })); +const chromeUserDataDir = vi.hoisted(() => ({ dir: "/tmp/openclaw" })); + +beforeAll(async () => { + chromeUserDataDir.dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chrome-user-data-")); +}); + +afterAll(async () => { + await fs.rm(chromeUserDataDir.dir, { recursive: true, force: true }); +}); + function makeProc(pid = 123) { const handlers = new Map void>>(); return { @@ -113,13 +126,13 @@ vi.mock("./chrome.js", () => ({ return { pid: 123, exe: { kind: "chrome", path: "/fake/chrome" }, - userDataDir: "/tmp/openclaw", + userDataDir: chromeUserDataDir.dir, cdpPort: profile.cdpPort, startedAt: Date.now(), proc, }; }), - resolveOpenClawUserDataDir: vi.fn(() => "/tmp/openclaw"), + resolveOpenClawUserDataDir: vi.fn(() => chromeUserDataDir.dir), stopOpenClawChrome: vi.fn(async () => { reachable = false; }),