aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-10-17 17:30:15 +0900
committerOphestra <cat@gensokyo.uk>2026-10-17 18:01:12 +0900
commitd1a648f9379fe2b4f6a3b2230889d520cae2f868 (patch)
treea9d74fc44d7a4bb135af5b2acccdc8b14fb4bcd8 /internal
parent79cd9088c7b541d2a3c9e9cad879f0ae46632ca6 (diff)
cmd/hakurei/testsuite: migrate testsHEADmasterdevelop
This runs much faster than the NixOS test suite, and is much more precise. This also uncovered a recent severe pipewire regression. This change removes all remaining deprecated nix code. Closes #22. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
-rw-r--r--internal/testsuite/testsuite.go87
-rw-r--r--internal/workflows/Containerfile3
-rw-r--r--internal/workflows/doc.go3
-rw-r--r--internal/workflows/step.go12
-rw-r--r--internal/workflows/test.go22
5 files changed, 79 insertions, 48 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 {
diff --git a/internal/workflows/Containerfile b/internal/workflows/Containerfile
index eb858831..82ce8820 100644
--- a/internal/workflows/Containerfile
+++ b/internal/workflows/Containerfile
@@ -8,13 +8,16 @@ RUN add-apt-repository -y ppa:savoury1/pipewire && \
acl \
sway \
xwayland \
+ x11-xserver-utils \
xdg-dbus-proxy \
+ libnotify-bin \
pipewire \
pipewire-pulse \
wireplumber- \
pulseaudio-utils \
foot \
xterm \
+ grim \
fuse3 \
fsmark && \
apt-get clean && rm -rf /var/lib/apt/lists/*
diff --git a/internal/workflows/doc.go b/internal/workflows/doc.go
index 123bf7c1..e220ed67 100644
--- a/internal/workflows/doc.go
+++ b/internal/workflows/doc.go
@@ -38,6 +38,9 @@ On Alpine Linux, this is achieved by:
# Use any other user for rootless mode.
podman_user="act_runner"
+ # Required by cmd/hakurei test suite.
+ rc_ulimit="-r 49"
+
A symlink must then be created at /var/run/docker.sock pointing to the socket
owned by the unprivileged daemon. This should be done in a /etc/local.d script.
diff --git a/internal/workflows/step.go b/internal/workflows/step.go
index 5175d4d5..3458c0ea 100644
--- a/internal/workflows/step.go
+++ b/internal/workflows/step.go
@@ -58,15 +58,3 @@ func newTestsuite(name, prefix string) Step {
Run: prefix + "go run -tags=testsuite ./cmd/" + name,
}
}
-
-// newNixOSTest returns a step for running the named NixOS test.
-func newNixOSTest(name string) Step {
- return Step{
- Name: "Run NixOS test",
- Run: "nix build " +
- "--out-link result " +
- "--print-out-paths " +
- "--print-build-logs " +
- "./cmd/hakurei/testsuite#checks.x86_64-linux." + name,
- }
-}
diff --git a/internal/workflows/test.go b/internal/workflows/test.go
index 5ca795c6..b0819916 100644
--- a/internal/workflows/test.go
+++ b/internal/workflows/test.go
@@ -7,25 +7,27 @@ var _ = (&Workflow{
On: []any{"push"},
Jobs: Map[Job]{
- {"hakurei-legacy", Job{
- Name: "Hakurei (legacy)",
- On: "nix",
+ {"hakurei", Job{
+ Name: "Hakurei",
+ On: "rosa",
Steps: []Step{
checkout,
- newNixOSTest("hakurei"),
- newUploadArtifact("test output", "hakurei-vm-output"),
+ dist,
+ install,
+ newTestsuite("hakurei/testsuite", "unshare -n "),
},
}},
- {"hakurei-race-legacy", Job{
- Name: "Hakurei (legacy with race instrument)",
- On: "nix",
+ {"hakurei-race", Job{
+ Name: "Hakurei (with race instrument)",
+ On: "rosa",
Steps: []Step{
checkout,
- newNixOSTest("race"),
- newUploadArtifact("test output", "hakurei-race-vm-output"),
+ _dist,
+ install,
+ newTestsuite("hakurei/testsuite", "unshare -n "),
},
}},