Run script/setup in new worktrees and give each task a port block
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user