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) } }