Skip to content
quarry Artifact [6301f5b184]
Login

Artifact [6301f5b184]

Artifact 6301f5b184e372ed31eb7903625610bdd40de41ca587507ced256d92de8afc4c:


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