aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/testsuite/testsuite.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/testsuite/testsuite.go')
-rw-r--r--internal/testsuite/testsuite.go87
1 files changed, 61 insertions, 26 deletions
diff --git a/internal/testsuite/testsuite.go b/internal/testsuite/testsuite.go
index ff6c4420..c4ca23e9 100644
--- a/internal/testsuite/testsuite.go
+++ b/internal/testsuite/testsuite.go
@@ -19,6 +19,7 @@ import (
"os/signal"
"os/user"
"path/filepath"
+ "reflect"
"slices"
"strconv"
"strings"
@@ -263,6 +264,42 @@ func FilterTerminated(err error) error {
return e
}
+// MustDecodeFrom runs the specified command and decodes its JSON output,
+// storing the result in the value pointed to by v.
+func MustDecodeFrom[T any](
+ ctx context.Context,
+ cred *syscall.Credential,
+ env []string,
+ v *T,
+ name string,
+ arg ...string,
+) {
+ cmd := exec.CommandContext(ctx, name, arg...)
+ cmd.Env = env
+ cmd.SysProcAttr = &syscall.SysProcAttr{
+ Pdeathsig: syscall.SIGKILL,
+ Credential: cred,
+ }
+ cmd.Stderr = os.Stderr
+
+ r, err := cmd.StdoutPipe()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ if err = cmd.Start(); err != nil {
+ log.Fatalf("start %s: %v", name, err)
+ }
+
+ if err = json.NewDecoder(r).Decode(v); err != nil {
+ log.Fatalf("decode %s: %v", name, err)
+ }
+
+ if err = cmd.Wait(); err != nil {
+ log.Fatalf("wait for %s: %v", name, err)
+ }
+}
+
// Poll repeatedly runs command until it succeeds.
func Poll(
d time.Duration,
@@ -473,34 +510,13 @@ func PollSwayWindow(
cred *syscall.Credential,
f func(n *SwayNode) bool,
) *SwayNode {
+ var t SwayNode
for {
time.Sleep(25 * time.Millisecond)
- cmd := exec.CommandContext(ctx, "swaymsg", "-t", "get_tree")
- cmd.Env = []string{SwayEnv}
- cmd.SysProcAttr = &syscall.SysProcAttr{
- Pdeathsig: syscall.SIGKILL,
- Credential: cred,
- }
- cmd.Stderr = os.Stderr
-
- r, err := cmd.StdoutPipe()
- if err != nil {
- log.Fatal(err)
- }
-
- if err = cmd.Start(); err != nil {
- log.Fatalf("poll swaymsg: %v", err)
- }
-
- var t SwayNode
- if err = json.NewDecoder(r).Decode(&t); err != nil {
- log.Fatalf("decode swaymsg: %v", err)
- }
-
- if err = cmd.Wait(); err != nil {
- log.Fatalf("wait for swaymsg: %v", err)
- }
-
+ MustDecodeFrom(
+ ctx, cred, []string{SwayEnv}, &t,
+ "swaymsg", "-t", "get_tree",
+ )
for n := range t.All() {
if f(n) {
return n
@@ -701,6 +717,21 @@ func StartHakurei(
return
}
+ var identifiers []hst.ID
+ MustDecodeFrom(
+ ctx, cred, nil, &identifiers,
+ "hakurei", "--json", "ps", "--short",
+ )
+ if !slices.Contains(identifiers, id) {
+ log.Fatal("instance not present in ps output")
+ }
+
+ var got hst.State
+ MustDecodeFrom(
+ ctx, cred, nil, &got,
+ "hakurei", "--json", "show", id.String(),
+ )
+
var ok bool
entries, copyError := s.All()
for entry := range entries {
@@ -720,6 +751,10 @@ func StartHakurei(
return
}
+ if !reflect.DeepEqual(got, p) {
+ log.Fatalf("show: %#v, want %#v", got, p)
+ }
+
var stat syscall.Stat_t
pid = MustScanFor(func(ps *StatScanner) bool {
select {