diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-10-14 20:34:18 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-10-14 20:34:18 +0900 |
| commit | 6b118e1ef14cd61c3032a6f72afe3c3d71c2f7f6 (patch) | |
| tree | 32d27592d82c360a7121de9675762075665a24b7 /cmd | |
| parent | 2eb3b1129bf73f8e2a0b46683af3139498fa89fd (diff) | |
internal/testsuite: move helpers from cmd/hakurei
These helpers are useful across multiple test suites.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/hakurei/testsuite/sandbox/main.go | 186 |
1 files changed, 11 insertions, 175 deletions
diff --git a/cmd/hakurei/testsuite/sandbox/main.go b/cmd/hakurei/testsuite/sandbox/main.go index 88e028e1..31e85331 100644 --- a/cmd/hakurei/testsuite/sandbox/main.go +++ b/cmd/hakurei/testsuite/sandbox/main.go @@ -5,11 +5,8 @@ package main import ( - "bytes" "context" - "encoding/json" "fmt" - "io" "log" "os" "os/exec" @@ -21,31 +18,13 @@ import ( "sync" "syscall" - "hakurei.app/check" "hakurei.app/fhs" "hakurei.app/hst" - "hakurei.app/internal/store" "hakurei.app/internal/testsuite" "hakurei.app/cmd/hakurei/testsuite/sandbox/testdata" ) -// mustScanFor continuously scans the proc filesystem and calls f for each entry -// visited. -func mustScanFor(f func(ps *testsuite.StatScanner) bool) int { - var ps testsuite.StatScanner - - for ps.Scan() { - if f(&ps) { - break - } - } - if err := ps.Err(); err != nil { - log.Fatal(err) - } - return ps.Stat().PID -} - // mustStart starts a hakurei container and returns the pid of a process within // the container. This process must be terminated by the caller. func mustStart( @@ -63,7 +42,7 @@ func mustStart( ) var stat syscall.Stat_t - pid = mustScanFor(func(s *testsuite.StatScanner) bool { + pid = testsuite.MustScanFor(func(s *testsuite.StatScanner) bool { select { case err := <-done: if err == nil { @@ -292,12 +271,7 @@ func main() { } }) - if err := os.MkdirAll(testsuite.XDGRuntimeDir, 0700); err != nil { - log.Fatal(err) - } else if err = os.Chown(testsuite.XDGRuntimeDir, 1000, 1000); err != nil { - log.Fatal(err) - } - + testsuite.MustPrepareUserDirs(&cred) var swg sync.WaitGroup defer swg.Wait() dbusEnv := testsuite.MustStartSessionBus(&cred) @@ -310,156 +284,18 @@ func main() { } log.Println("created test helper") - s := store.New(check.MustAbs("/tmp/hakurei.0/state")) for name, tc := range testdata.All() { wg.Go(func() { - cmd := exec.Command( - "script", "/dev/null", - "-E", "always", - "-qec", - "hakurei run "+ - "--identifier-fd=5"+ - " 4 1>&3", - ) - cmd.SysProcAttr = &syscall.SysProcAttr{ - Pdeathsig: syscall.SIGTERM, - Credential: &cred, - } - var output bytes.Buffer - cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, &output, &output - cmd.Env = []string{ - "PATH=" + os.Getenv("PATH"), - "TERM=xterm", - testsuite.XDGRuntimeEnv, - testsuite.WaylandEnv, - "DISPLAY=:0", - dbusEnv, - } - - var err error - var notify, _notify, _conf, conf, ident, _ident *os.File - if notify, _notify, err = os.Pipe(); err != nil { - log.Fatal(err) - } - cmd.ExtraFiles = append(cmd.ExtraFiles, _notify) - if _conf, conf, err = os.Pipe(); err != nil { - log.Fatal(err) - } - cmd.ExtraFiles = append(cmd.ExtraFiles, _conf) - if ident, _ident, err = os.Pipe(); err != nil { - log.Fatal(err) - } - cmd.ExtraFiles = append(cmd.ExtraFiles, _ident) - - done := testsuite.MustStart(cmd) - wg.Go(func() { - _err := <-done - log.Printf("completed test case %s\n%s", name, output.String()) - if _err != nil { - log.Fatalf("test case %s: %v", name, _err) - } - }) - - if err = json.NewEncoder(conf).Encode(&tc.Hakurei); err != nil { - log.Fatal(err) - } else if err = conf.Close(); err != nil { - log.Fatal(err) - } - - var id hst.ID - if _, err = io.ReadFull(ident, id[:]); err != nil { - log.Fatal(err) - } else if err = ident.Close(); err != nil { - log.Fatal(err) - } - - if _, err = io.ReadFull(notify, make([]byte, 8)); err != nil { - log.Fatal(err) - } else if err = notify.Close(); err != nil { - log.Fatal(err) - } - - var ( - ok bool - p hst.State - ) - entries, copyError := s.All() - for entry := range entries { - if entry.ID == id { - ok = true - if _, err = entry.Load(&p, nil); err != nil { - log.Fatal(err) - } - break - } - } - if err = copyError(); err != nil { - log.Fatal(err) - } - if !ok { - log.Fatalf("instance %s is not present in store", id) - } - - var stat syscall.Stat_t - pid := mustScanFor(func(ps *testsuite.StatScanner) bool { - select { - case err = <-done: - if err == nil { - log.Fatal("test process terminated unexpectedly") + _, pid := testsuite.MustStartHakurei( + &wg, &cred, dbusEnv, + func(err error, output string) { + log.Printf("completed test case %s\n%s", name, output) + if err != nil { + log.Fatalf("test case %s: %v", name, err) } - log.Fatal(err) - default: - break - } - - if ps.Stat().Comm != "test-helper" { - return false - } - - var args []string - if args, err = ps.Stat().Args(); err != nil { - if testsuite.IsNotExist(err) { - return false - } - log.Fatal(err) - } else if !slices.Equal(args, tc.Hakurei.Container.Args) { - return false - } - - if err = ps.Stat().Stat(&stat); err != nil { - if testsuite.IsNotExist(err) { - return false - } - log.Fatal(err) - } - - uid := hst.ToUser[uint32](0, uint32(tc.Hakurei.Identity)) - if stat.Uid != uid || stat.Gid != uid { - return false - } - - var t []byte - if t, err = os.ReadFile(filepath.Join( - fhs.Proc, - strconv.Itoa(ps.Stat().PPID), - "stat", - )); err != nil { - if testsuite.IsNotExist(err) { - return false - } - log.Fatal(err) - } - - var _stat testsuite.Stat - if err = _stat.UnmarshalText(t); err != nil { - log.Fatal(err) - } - if _stat.PPID != p.ShimPID { - return false - } - - return true - }) + }, + &tc.Hakurei, + ) testsuite.MustCheckFilter( pid, |
