Run script/setup in new worktrees and give each task a port block

This commit is contained in:
Ian Gulliver
2026-10-15 11:52:13 -07:00
parent f5e5dd30e3
commit cfa9699f4b
15 changed files with 453 additions and 174 deletions
+91
View File
@@ -0,0 +1,91 @@
package agents_test
import (
"os"
"path/filepath"
"strings"
"testing"
"g.fc.run/misc/byre/internal/api"
)
func (e *env) commitSetup(script string) {
e.t.Helper()
err := os.MkdirAll(filepath.Join(e.repo, "script"), 0o755)
if err != nil {
e.t.Fatal(err)
}
err = os.WriteFile(filepath.Join(e.repo, "script", "setup"), []byte(script), 0o755)
if err != nil {
e.t.Fatal(err)
}
gitOut(e.t, e.repo, "add", "script/setup")
gitOut(e.t, e.repo, "commit", "--quiet", "--message", "setup")
}
func (e *env) waitSetup(taskID string) api.Event {
e.t.Helper()
seen := e.waitFor("setup.ended", func(ev api.Event) bool {
return ev.Kind == "setup.ended" && ev.TaskId != nil && *ev.TaskId == taskID
})
return seen[len(seen)-1]
}
func TestSetupScriptAndPorts(t *testing.T) {
e := newEnv(t)
e.commitSetup("#!/bin/sh\nset -e\ncp \"$(git rev-parse --path-format=absolute --git-common-dir)/../.env\" .env\necho \"port $PORT\"\n")
err := os.WriteFile(filepath.Join(e.repo, ".env"), []byte("SECRET=1\n"), 0o644)
if err != nil {
t.Fatal(err)
}
m := e.manager()
task, err := m.CreateTask(e.ctx, e.project, "with setup", login, "main", login)
if err != nil {
t.Fatalf("create task: %v", err)
}
if task.PortBase != 41010 {
t.Fatalf("port_base = %d, want 41010 (41000 is taken by the first task)", task.PortBase)
}
ev := e.waitSetup(task.Id)
if ev.Payload["error"] != nil {
t.Fatalf("setup failed: %v", ev.Payload)
}
want := "port 41010"
if out, _ := ev.Payload["output"].(string); !strings.Contains(out, want) {
t.Fatalf("output %q lacks %q", out, want)
}
env, err := os.ReadFile(filepath.Join(task.WorktreePath, ".env"))
if err != nil || string(env) != "SECRET=1\n" {
t.Fatalf("worktree .env = %q, %v", env, err)
}
_, err = e.store.DiscardTask(e.ctx, e.task.Id, login)
if err != nil {
t.Fatalf("discard: %v", err)
}
reused, err := m.CreateTask(e.ctx, e.project, "reuses ports", login, "main", login)
if err != nil {
t.Fatalf("create task: %v", err)
}
if reused.PortBase != 41000 {
t.Fatalf("port_base = %d, want the freed 41000", reused.PortBase)
}
e.waitSetup(reused.Id)
}
func TestSetupFailure(t *testing.T) {
e := newEnv(t)
e.commitSetup("#!/bin/sh\necho installing\nexit 3\n")
m := e.manager()
task, err := m.CreateTask(e.ctx, e.project, "failing setup", login, "main", login)
if err != nil {
t.Fatalf("create task: %v", err)
}
ev := e.waitSetup(task.Id)
if ev.Payload["error"] != "exit status 3" || ev.Payload["output"] != "installing\n" {
t.Fatalf("setup.ended payload = %v", ev.Payload)
}
}