aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cmd/hakurei/testsuite/sandbox/main.go2
-rw-r--r--internal/testsuite/testsuite.go54
-rw-r--r--internal/workflows/Containerfile27
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/*