package runner
import (
"net"
"os"
"path/filepath"
"strconv"
"strings"
"testing"
)
// #385: a task's TMPDIR is short whatever WorkDir is, so a program can
// make a Unix socket under it. Chrome puts SingletonSocket in a
// com.google.Chrome.XXXXXX directory beneath TMPDIR, and under the old
// WorkDir-relative root every browser test of pikchr-studio aborted.
func TestATaskTempDirHoldsAChromeSocketWhateverTheWorkDir(t *testing.T) {
work := filepath.Join(t.TempDir(), strings.Repeat("deployment-depth/", 8), "runner")
if err := os.MkdirAll(work, 0o755); err != nil {
t.Fatal(err)
}
r, err := New(Config{Bridge: "http://x", Token: "WT", Tasks: []string{"t-job"}, WorkDir: work,
Checkout: appCheckout{}, Logf: func(string, ...any) {}})
if err != nil {
t.Fatal(err)
}
root := r.cfg.TempRoot
t.Cleanup(func() { os.RemoveAll(root) })
if !strings.HasPrefix(root, tempBase+"/") || len(root) > len(tempBase)+12 {
t.Fatalf("FAIL: the default root is %q, want a short one under %s", root, tempBase)
}
if again := defaultTempRoot(work); again != root || defaultTempRoot(work+"2") == root {
t.Errorf("FAIL: the root is not stable per work dir and distinct between them")
}
if err := r.sweepTemp(); err != nil {
t.Fatal(err)
}
td, err := r.taskTemp()
if err != nil {
t.Fatal(err)
}
chrome, err := os.MkdirTemp(td, "com.google.Chrome.")
if err != nil {
t.Fatal(err)
}
sock := filepath.Join(chrome, "SingletonSocket")
l, err := net.Listen("unix", sock)
if err != nil {
t.Fatalf("FAIL: a %d-byte socket path under the task dir does not bind: %v", len(sock), err)
}
l.Close()
t.Logf("ok: WorkDir is %d bytes, the socket path %d", len(work), len(sock))
}
// The runner still clears what a dead runner from before #385 left in
// WorkDir's old root, and leaves a live one's alone.
func TestARunnerSweepsTheOldRootToo(t *testing.T) {
work := t.TempDir()
legacy := filepath.Join(work, legacyRootName)
dead := filepath.Join(legacy, legacyTaskPrefix+strconv.Itoa(1<<22)+"-1")
live := filepath.Join(legacy, legacyTaskPrefix+strconv.Itoa(os.Getppid())+"-2")
for _, d := range []string{dead, live} {
if err := os.MkdirAll(filepath.Join(d, "go-build1"), 0o755); err != nil {
t.Fatal(err)
}
}
r, err := New(Config{Bridge: "http://x", Token: "WT", Tasks: []string{"t-job"}, WorkDir: work,
TempRoot: filepath.Join(t.TempDir(), "root"), Checkout: appCheckout{}, Logf: func(string, ...any) {}})
if err != nil {
t.Fatal(err)
}
if err := r.sweepTemp(); err != nil {
t.Fatal(err)
}
if _, err := os.Stat(dead); !os.IsNotExist(err) {
t.Error("FAIL: a dead runner's old task dir survived the sweep")
}
if _, err := os.Stat(live); err != nil {
t.Error("FAIL: a live runner's old task dir was swept")
}
}