92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
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)
|
||
|
|
}
|
||
|
|
}
|