summaryrefslogtreecommitdiffhomepage
path: root/packages/app/script
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-08 05:02:19 -0600
committerGitHub <[email protected]>2026-02-08 05:02:19 -0600
commitd1ebe0767c264d395c8bc504c0957ccc3af90103 (patch)
tree4e10adf10def7a5ec731d1b33a6f21dbe67769f6 /packages/app/script
parent19b1222cd85060f7b0999b99586e93f84821b94b (diff)
downloadopencode-d1ebe0767c264d395c8bc504c0957ccc3af90103.tar.gz
opencode-d1ebe0767c264d395c8bc504c0957ccc3af90103.zip
chore: refactoring and tests (#12629)
Diffstat (limited to 'packages/app/script')
-rw-r--r--packages/app/script/e2e-local.ts120
1 files changed, 81 insertions, 39 deletions
diff --git a/packages/app/script/e2e-local.ts b/packages/app/script/e2e-local.ts
index df2107f76..96b35cfb7 100644
--- a/packages/app/script/e2e-local.ts
+++ b/packages/app/script/e2e-local.ts
@@ -55,6 +55,7 @@ const extraArgs = (() => {
const [serverPort, webPort] = await Promise.all([freePort(), freePort()])
const sandbox = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-e2e-"))
+const keepSandbox = process.env.OPENCODE_E2E_KEEP_SANDBOX === "1"
const serverEnv = {
...process.env,
@@ -83,58 +84,99 @@ const runnerEnv = {
PLAYWRIGHT_PORT: String(webPort),
} satisfies Record<string, string>
-const seed = Bun.spawn(["bun", "script/seed-e2e.ts"], {
- cwd: opencodeDir,
- env: serverEnv,
- stdout: "inherit",
- stderr: "inherit",
-})
+let seed: ReturnType<typeof Bun.spawn> | undefined
+let runner: ReturnType<typeof Bun.spawn> | undefined
+let server: { stop: () => Promise<void> | void } | undefined
+let inst: { Instance: { disposeAll: () => Promise<void> | void } } | undefined
+let cleaned = false
+let internalError = false
+
+const cleanup = async () => {
+ if (cleaned) return
+ cleaned = true
+
+ if (seed && seed.exitCode === null) seed.kill("SIGTERM")
+ if (runner && runner.exitCode === null) runner.kill("SIGTERM")
+
+ const jobs = [
+ inst?.Instance.disposeAll(),
+ server?.stop(),
+ keepSandbox ? undefined : fs.rm(sandbox, { recursive: true, force: true }),
+ ].filter(Boolean)
+ await Promise.allSettled(jobs)
+}
-const seedExit = await seed.exited
-if (seedExit !== 0) {
- process.exit(seedExit)
+const shutdown = (code: number, reason: string) => {
+ process.exitCode = code
+ void cleanup().finally(() => {
+ console.error(`e2e-local shutdown: ${reason}`)
+ process.exit(code)
+ })
}
-Object.assign(process.env, serverEnv)
-process.env.AGENT = "1"
-process.env.OPENCODE = "1"
+const reportInternalError = (reason: string, error: unknown) => {
+ internalError = true
+ console.error(`e2e-local internal error: ${reason}`)
+ console.error(error)
+}
-const log = await import("../../opencode/src/util/log")
-const install = await import("../../opencode/src/installation")
-await log.Log.init({
- print: true,
- dev: install.Installation.isLocal(),
- level: "WARN",
+process.once("SIGINT", () => shutdown(130, "SIGINT"))
+process.once("SIGTERM", () => shutdown(143, "SIGTERM"))
+process.once("SIGHUP", () => shutdown(129, "SIGHUP"))
+process.once("uncaughtException", (error) => {
+ reportInternalError("uncaughtException", error)
+})
+process.once("unhandledRejection", (error) => {
+ reportInternalError("unhandledRejection", error)
})
-const servermod = await import("../../opencode/src/server/server")
-const inst = await import("../../opencode/src/project/instance")
-const server = servermod.Server.listen({ port: serverPort, hostname: "127.0.0.1" })
-console.log(`opencode server listening on http://127.0.0.1:${serverPort}`)
+let code = 1
-const result = await (async () => {
- try {
- await waitForHealth(`http://127.0.0.1:${serverPort}/global/health`)
+try {
+ seed = Bun.spawn(["bun", "script/seed-e2e.ts"], {
+ cwd: opencodeDir,
+ env: serverEnv,
+ stdout: "inherit",
+ stderr: "inherit",
+ })
- const runner = Bun.spawn(["bun", "test:e2e", ...extraArgs], {
+ const seedExit = await seed.exited
+ if (seedExit !== 0) {
+ code = seedExit
+ } else {
+ Object.assign(process.env, serverEnv)
+ process.env.AGENT = "1"
+ process.env.OPENCODE = "1"
+
+ const log = await import("../../opencode/src/util/log")
+ const install = await import("../../opencode/src/installation")
+ await log.Log.init({
+ print: true,
+ dev: install.Installation.isLocal(),
+ level: "WARN",
+ })
+
+ const servermod = await import("../../opencode/src/server/server")
+ inst = await import("../../opencode/src/project/instance")
+ server = servermod.Server.listen({ port: serverPort, hostname: "127.0.0.1" })
+ console.log(`opencode server listening on http://127.0.0.1:${serverPort}`)
+
+ await waitForHealth(`http://127.0.0.1:${serverPort}/global/health`)
+ runner = Bun.spawn(["bun", "test:e2e", ...extraArgs], {
cwd: appDir,
env: runnerEnv,
stdout: "inherit",
stderr: "inherit",
})
-
- return { code: await runner.exited }
- } catch (error) {
- return { error }
- } finally {
- await inst.Instance.disposeAll()
- await server.stop()
+ code = await runner.exited
}
-})()
-
-if ("error" in result) {
- console.error(result.error)
- process.exit(1)
+} catch (error) {
+ console.error(error)
+ code = 1
+} finally {
+ await cleanup()
}
-process.exit(result.code)
+if (code === 0 && internalError) code = 1
+
+process.exit(code)