From fe6f1ff521bb4d777d30f6e248d7bb1d1510b20f Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Sun, 25 Oct 2026 05:29:33 -0700 Subject: [PATCH] test(server): tests no longer depend on the host machine Server tests failed on every run inside a T3 Code agent shell and on Ubuntu 26.04, while CI passed: - Agent shells inherit the managed service's T3CODE_HOME, T3_BOOT_SERVICE_UNIT and launcher context, so ServerEnvironment tests saw a service launcher. A setup file now clears them. - The pinned-runtime symlink test copied /bin/sleep under another name; uutils coreutils refuses to run renamed. It now copies Node. - The ACP default-PATH check assumed node lives in /usr/bin or /bin; it now checks sh. Co-Authored-By: Claude Opus 5.5 --- apps/server/src/cloud/pinnedRuntime.test.ts | 5 +++-- .../src/provider/acp/AcpSessionRuntime.processTree.test.ts | 2 +- apps/server/src/testUtils/managedServiceEnv.setup.ts | 6 ++++++ apps/server/vite.config.ts | 5 ++++- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 apps/server/src/testUtils/managedServiceEnv.setup.ts diff --git a/apps/server/src/cloud/pinnedRuntime.test.ts b/apps/server/src/cloud/pinnedRuntime.test.ts index 9d536f471e763..82230858891c4 100644 --- a/apps/server/src/cloud/pinnedRuntime.test.ts +++ b/apps/server/src/cloud/pinnedRuntime.test.ts @@ -487,14 +487,15 @@ it.layer(NodeServices.layer)("prunePinnedRuntimes", (it) => { const path = yield* Path.Path; const { baseDir, versionsDir } = yield* setup(["1.0.0", "1.1.0"]); const entry = path.join(versionsDir, "1.0.0", "t3"); - yield* fs.copyFile("/bin/sleep", entry); + // Multicall coreutils (Ubuntu's uutils) refuse to run renamed, so copy Node instead. + yield* fs.copyFile(process.execPath, entry); yield* fs.chmod(entry, 0o755); const link = path.join(baseDir, "t3"); yield* fs.symlink(entry, link); // Its argv names only the link, as with `t3 serve` run from PATH. Removing the link after // spawning leaves the process's executable as the only reference. const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; - yield* spawner.spawn(ChildProcess.make(link, ["30"])); + yield* spawner.spawn(ChildProcess.make(link, ["-e", "setTimeout(() => {}, 30_000)"])); yield* fs.remove(link); const removed = yield* prunePinnedRuntimes({ baseDir, keep: ["2.0.0"] }).pipe( diff --git a/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts b/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts index 7ee010b6f76d5..c71d414ccdfab 100644 --- a/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts +++ b/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts @@ -165,7 +165,7 @@ describe("terminatePosixOwnedProcessTree", () => { AcpSessionRuntime.resolveLinuxCgroupTargetCommand("grok", scratch, { PATH: undefined }), ).toBeUndefined(); expect( - AcpSessionRuntime.resolveLinuxCgroupTargetCommand("node", scratch, { PATH: undefined }), + AcpSessionRuntime.resolveLinuxCgroupTargetCommand("sh", scratch, { PATH: undefined }), ).toBeDefined(); expect( AcpSessionRuntime.resolveLinuxCgroupTargetCommand("grok", scratch, { diff --git a/apps/server/src/testUtils/managedServiceEnv.setup.ts b/apps/server/src/testUtils/managedServiceEnv.setup.ts new file mode 100644 index 0000000000000..a6581817e14bb --- /dev/null +++ b/apps/server/src/testUtils/managedServiceEnv.setup.ts @@ -0,0 +1,6 @@ +import { SERVICE_LAUNCHER_CONTEXT_ENV } from "../cloud/serviceProtocol.ts"; + +// Agents inside a managed T3 service inherit its home and launcher context; CI has neither. +for (const name of ["T3CODE_HOME", "T3_BOOT_SERVICE_UNIT", SERVICE_LAUNCHER_CONTEXT_ENV]) { + delete process.env[name]; +} diff --git a/apps/server/vite.config.ts b/apps/server/vite.config.ts index 5d36d0867c597..f68d1cc733c6a 100644 --- a/apps/server/vite.config.ts +++ b/apps/server/vite.config.ts @@ -128,7 +128,10 @@ export default mergeConfig( // Parallel sqlite/git/worktree/orchestration tests introduce load-sensitive flakes. fileParallelism: false, sequence: { sequencer: WeightedShardSequencer }, - setupFiles: ["./src/testUtils/gitConfig.setup.ts"], + setupFiles: [ + "./src/testUtils/gitConfig.setup.ts", + "./src/testUtils/managedServiceEnv.setup.ts", + ], hookTimeout: 120_000, testTimeout: 120_000, },