diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/testsuite/testsuite.go | 87 | ||||
| -rw-r--r-- | internal/workflows/Containerfile | 3 | ||||
| -rw-r--r-- | internal/workflows/doc.go | 3 | ||||
| -rw-r--r-- | internal/workflows/step.go | 12 | ||||
| -rw-r--r-- | internal/workflows/test.go | 22 |
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 "), }, }}, |
