aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initdaemon_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-12-08 06:35:36 +0900
committerOphestra <cat@gensokyo.uk>2025-12-08 07:21:04 +0900
commit357cfcddeea14d6babacf7ae8f77e0bad7b24ee5 (patch)
treeeaad515e98541dd3e3f6d0bdfc5f54d360463f48 /container/initdaemon_test.go
parent6bf245cf1b8d5e30c051bb6295533d287cb4eda6 (diff)
container: start daemons within container
This is useful for daemons internal to the container. The only current use case is pipewire-pulse. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/initdaemon_test.go')
-rw-r--r--container/initdaemon_test.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/container/initdaemon_test.go b/container/initdaemon_test.go
new file mode 100644
index 00000000..5ab834db
--- /dev/null
+++ b/container/initdaemon_test.go
@@ -0,0 +1,102 @@
+package container
+
+import (
+ "os"
+ "testing"
+
+ "hakurei.app/container/check"
+ "hakurei.app/container/stub"
+)
+
+func TestDaemonOp(t *testing.T) {
+ t.Parallel()
+
+ checkSimple(t, "DaemonOp.late", []simpleTestCase{
+ {"success", func(k *kstub) error {
+ state := setupState{Params: &Params{Env: []string{"\x00"}}, Context: t.Context(), Msg: k}
+ return (&DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ Args: []string{"-v"},
+ }).late(&state, k)
+ }, stub.Expect{Calls: []stub.Call{
+ call("isVerbose", stub.ExpectArgs{}, true, nil),
+ call("verbosef", stub.ExpectArgs{"starting %s", []any{`daemon providing "/run/user/1971/pulse/native"`}}, nil, nil),
+ call("start", stub.ExpectArgs{"/run/current-system/sw/bin/pipewire-pulse", []string{"/run/current-system/sw/bin/pipewire-pulse", "-v"}, []string{"\x00"}, "/"}, &os.Process{Pid: 0xcafe}, nil),
+ call("New", stub.ExpectArgs{}, nil, nil),
+ call("stat", stub.ExpectArgs{"/run/user/1971/pulse/native"}, isDirFi(false), os.ErrNotExist),
+ call("stat", stub.ExpectArgs{"/run/user/1971/pulse/native"}, isDirFi(false), os.ErrNotExist),
+ call("stat", stub.ExpectArgs{"/run/user/1971/pulse/native"}, isDirFi(false), os.ErrNotExist),
+ call("stat", stub.ExpectArgs{"/run/user/1971/pulse/native"}, isDirFi(false), nil),
+ call("verbosef", stub.ExpectArgs{"daemon process %d ready", []any{0xcafe}}, nil, nil),
+ }, Tracks: []stub.Expect{{Calls: []stub.Call{
+ call("wait", stub.ExpectArgs{"/run/current-system/sw/bin/pipewire-pulse", []string{"/run/current-system/sw/bin/pipewire-pulse", "-v"}, []string{"\x00"}, "/"}, uintptr(stub.PanicExit), nil),
+ }}}}, nil},
+ })
+
+ checkOpsValid(t, []opValidTestCase{
+ {"nil", (*DaemonOp)(nil), false},
+ {"zero", new(DaemonOp), false},
+ {"valid", &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ Args: []string{"-v"},
+ }, true},
+ })
+
+ checkOpsBuilder(t, []opsBuilderTestCase{
+ {"pipewire-pulse", new(Ops).Daemon(
+ check.MustAbs("/run/user/1971/pulse/native"),
+ check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"), "-v",
+ ), Ops{
+ &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ Args: []string{"-v"},
+ },
+ }},
+ })
+
+ checkOpIs(t, []opIsTestCase{
+ {"zero", new(DaemonOp), new(DaemonOp), false},
+
+ {"args differs", &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ Args: []string{"-v"},
+ }, &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, false},
+
+ {"path differs", &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire"),
+ }, &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, false},
+
+ {"target differs", &DaemonOp{
+ Target: check.MustAbs("/run/user/65534/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, false},
+
+ {"equals", &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ Path: check.MustAbs("/run/current-system/sw/bin/pipewire-pulse"),
+ }, true},
+ })
+
+ checkOpMeta(t, []opMetaTestCase{
+ {"pipewire-pulse", &DaemonOp{
+ Target: check.MustAbs("/run/user/1971/pulse/native"),
+ }, zeroString, `daemon providing "/run/user/1971/pulse/native"`},
+ })
+}