diff options
| -rw-r--r-- | cmd/hakurei/testsuite/sandbox/main.go | 2 | ||||
| -rw-r--r-- | internal/testsuite/testsuite.go | 54 | ||||
| -rw-r--r-- | internal/workflows/Containerfile | 27 |
3 files changed, 73 insertions, 10 deletions
diff --git a/cmd/hakurei/testsuite/sandbox/main.go b/cmd/hakurei/testsuite/sandbox/main.go index a85ec485..11c87857 100644 --- a/cmd/hakurei/testsuite/sandbox/main.go +++ b/cmd/hakurei/testsuite/sandbox/main.go @@ -293,7 +293,7 @@ func main() { if err != nil { log.Fatalf("test case %s: %v", name, err) } - }, true, false, &tc.Hakurei, + }, true, true, false, false, &tc.Hakurei, ) testsuite.MustCheckFilter( diff --git a/internal/testsuite/testsuite.go b/internal/testsuite/testsuite.go index fee4952c..7c198bba 100644 --- a/internal/testsuite/testsuite.go +++ b/internal/testsuite/testsuite.go @@ -10,6 +10,7 @@ import ( "crypto/sha512" "encoding/json" "errors" + "fmt" "io" "log" "os" @@ -413,7 +414,16 @@ func TerminateSway(cred *syscall.Credential) { // MustStartPipeWire starts a PipeWire server that is never explicitly // terminated. The test suite is terminated if the PipeWire server terminates. -func MustStartPipeWire(cred *syscall.Credential, dbusEnv string) { +func MustStartPipeWire(cred *syscall.Credential, dbusEnv string) (version string) { + version, _ = MustOutput( + context.Background(), nil, nil, 0, + "pipewire version", + "pipewire", "--version", + ) + _, version, _ = strings.Cut(version, "Compiled with libpipewire ") + _, version, _ = strings.Cut(version, "\nLinked with libpipewire") + version = strings.TrimSpace(version) + // this is never explicitly terminated _, done := MustStartWith( context.Background(), cred, quietServices, []string{ @@ -438,6 +448,15 @@ func MustStartPipeWire(cred *syscall.Credential, dbusEnv string) { "status", ) + Poll(50*time.Millisecond, cred, []string{ + XDGRuntimeEnv, + dbusEnv, + }, + "pw-cli", + "load-module", + "libpipewire-module-null-sink", + ) + _, _done := MustStartWith( context.Background(), cred, quietServices, []string{ XDGRuntimeEnv, @@ -452,6 +471,7 @@ func MustStartPipeWire(cred *syscall.Credential, dbusEnv string) { } log.Fatal("wireplumber terminated unexpectedly") }() + return } // MustScanFor continuously scans the proc filesystem and calls f for each entry @@ -478,15 +498,23 @@ func StartHakurei( dbusEnv string, processCommand func(cmd *exec.Cmd), onDone func(err error, output string), - scan, wait, verbose bool, + scan, wait, verbose, insecure bool, c *hst.Config, ) (p hst.State, pid int, err error) { s := store.New(check.MustAbs("/tmp/hakurei.0/state")) - hakureiFlags := "" + var hakureiFlags string if verbose { hakureiFlags += " -v" } + if insecure { + hakureiFlags += " --insecure" + } + + var notifySuffix string + if wait { + notifySuffix += " 1>&3" + } cmd := exec.CommandContext(ctx, "script", "/dev/null", @@ -494,7 +522,7 @@ func StartHakurei( "-qec", "hakurei"+hakureiFlags+" run "+ "--identifier-fd=5"+ - " 4 1>&3", + " 4"+notifySuffix, ) cmd.SysProcAttr = &syscall.SysProcAttr{ Pdeathsig: syscall.SIGTERM, @@ -552,6 +580,9 @@ func StartHakurei( var id hst.ID if _, err = io.ReadFull(ident, id[:]); err != nil { _, _ = notify.Close(), ident.Close() + if !scan && errors.Is(err, io.EOF) { + err = nil + } return } else if err = ident.Close(); err != nil { _ = notify.Close() @@ -579,7 +610,7 @@ func StartHakurei( if entry.ID == id { ok = true if _, err = entry.Load(&p, nil); err != nil { - log.Fatal(err) + return } break } @@ -588,7 +619,8 @@ func StartHakurei( log.Fatal(err) } if !ok { - log.Fatalf("instance %s is not present in store", id) + err = fmt.Errorf("instance %s is not present in store", id.String()) + return } var stat syscall.Stat_t @@ -658,7 +690,7 @@ func MustStartHakurei( cred *syscall.Credential, dbusEnv string, onDone func(err error, output string), - wait, verbose bool, + scan, wait, verbose, insecure bool, c *hst.Config, ) (p hst.State, pid int) { _ctx, cancel := context.WithCancel(ctx) @@ -669,10 +701,14 @@ func MustStartHakurei( nil, func(err error, output string) { defer cancel() onDone(err, output) - }, true, wait, verbose, c, + }, scan, wait, verbose, insecure, c, ) if err != nil { - log.Printf("cannot start hakurei container: %v", err) + log.Printf( + "(%s) cannot start hakurei container: %v", + c.Container.Hostname, + err, + ) cancel() } return diff --git a/internal/workflows/Containerfile b/internal/workflows/Containerfile index 3b1baeda..14bd5c2e 100644 --- a/internal/workflows/Containerfile +++ b/internal/workflows/Containerfile @@ -5,10 +5,37 @@ RUN add-apt-repository -y ppa:savoury1/pipewire && \ apt-get update && apt-get install -y \ msft-golang \ libmount-dev \ + acl \ sway \ xwayland \ xdg-dbus-proxy \ pipewire \ + pipewire-pulse \ + wireplumber- \ + pulseaudio-utils \ + foot \ + xterm \ fuse3 \ fsmark && \ apt-get clean && rm -rf /var/lib/apt/lists/* + +RUN VERSION='0.5.14' && \ + curl "https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/${VERSION}/wireplumber-${VERSION}.tar.bz2" | \ + tar -C /tmp -jx && \ + apt-get update && apt-get install -y \ + build-essential \ + meson \ + libpipewire-0.3-dev && \ + meson setup \ + -Dprefix=/usr \ + -Dbuildtype=release \ + "/tmp/wireplumber-${VERSION}" build && \ + meson compile -C build && \ + meson install -C build && \ + rm -rf build "/tmp/wireplumber-${VERSION}" && \ + apt-get remove -y \ + build-essential \ + meson \ + libpipewire-0.3-dev && \ + apt-get autoremove -y && \ + apt-get clean && rm -rf /var/lib/apt/lists/* |
