aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/dbus_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-10-08 04:57:22 +0900
committerOphestra <cat@gensokyo.uk>2025-10-08 04:57:22 +0900
commit9b507715d42f74c3f18fe817c2464abfca1b0182 (patch)
treec3d8ee5ef6809aaf3174bd6ecb00b8115261897e /hst/dbus_test.go
parent12ab7ea3b465a130933efd9e7fe044f3636dc6ed (diff)
hst/dbus: validate interface strings
This is relocated to hst to validate early. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'hst/dbus_test.go')
-rw-r--r--hst/dbus_test.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/hst/dbus_test.go b/hst/dbus_test.go
new file mode 100644
index 00000000..8b04494b
--- /dev/null
+++ b/hst/dbus_test.go
@@ -0,0 +1,109 @@
+package hst_test
+
+import (
+ "reflect"
+ "slices"
+ "testing"
+
+ "hakurei.app/container"
+ "hakurei.app/hst"
+)
+
+func TestBadInterfaceError(t *testing.T) {
+ testCases := []struct {
+ name string
+ err error
+ want string
+ }{
+ {"nil", (*hst.BadInterfaceError)(nil), "<nil>"},
+ {"session", &hst.BadInterfaceError{Interface: "\x00", Segment: "session"},
+ `bad interface string "\x00" in session bus configuration`},
+ {"system", &hst.BadInterfaceError{Interface: "\x01", Segment: "system"},
+ `bad interface string "\x01" in system bus configuration`},
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ if gotError := tc.err.Error(); gotError != tc.want {
+ t.Errorf("Error: %s, want %s", gotError, tc.want)
+ }
+ if gotMessage, ok := container.GetErrorMessage(tc.err); !ok {
+ t.Error("GetErrorMessage: ok = false")
+ } else if gotMessage != tc.want {
+ t.Errorf("GetErrorMessage: %s, want %s", gotMessage, tc.want)
+ }
+ })
+ }
+}
+
+func TestBusConfigInterfaces(t *testing.T) {
+ testCases := []struct {
+ name string
+ c *hst.BusConfig
+ cutoff int
+ want []string
+ }{
+ {"nil", nil, 0, nil},
+ {"all", &hst.BusConfig{
+ See: []string{"see"}, Talk: []string{"talk"}, Own: []string{"own"},
+ Call: map[string]string{"call": "unreachable"},
+ Broadcast: map[string]string{"broadcast": "unreachable"},
+ }, 0, []string{"see", "talk", "own", "call", "broadcast"}},
+
+ {"all cutoff", &hst.BusConfig{
+ See: []string{"see"}, Talk: []string{"talk"}, Own: []string{"own"},
+ Call: map[string]string{"call": "unreachable"},
+ Broadcast: map[string]string{"broadcast": "unreachable"},
+ }, 3, []string{"see", "talk", "own"}},
+
+ {"cutoff see", &hst.BusConfig{See: []string{"see"}}, 1, []string{"see"}},
+ {"cutoff talk", &hst.BusConfig{Talk: []string{"talk"}}, 1, []string{"talk"}},
+ {"cutoff own", &hst.BusConfig{Own: []string{"own"}}, 1, []string{"own"}},
+ {"cutoff call", &hst.BusConfig{Call: map[string]string{"call": "unreachable"}}, 1, []string{"call"}},
+ {"cutoff broadcast", &hst.BusConfig{Broadcast: map[string]string{"broadcast": "unreachable"}}, 1, []string{"broadcast"}},
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ var got []string
+ if tc.cutoff > 0 {
+ var i int
+ got = make([]string, 0, tc.cutoff)
+ for v := range tc.c.Interfaces {
+ i++
+ got = append(got, v)
+ if i == tc.cutoff {
+ break
+ }
+ }
+ } else {
+ got = slices.Collect(tc.c.Interfaces)
+ }
+
+ if !slices.Equal(got, tc.want) {
+ t.Errorf("Interfaces: %q, want %q", got, tc.want)
+ }
+ })
+ }
+}
+
+func TestBusConfigCheckInterfaces(t *testing.T) {
+ testCases := []struct {
+ name string
+ c *hst.BusConfig
+ err error
+ }{
+ {"nil", nil, nil},
+ {"zero", &hst.BusConfig{See: []string{""}},
+ &hst.BadInterfaceError{Interface: "", Segment: "zero"}},
+ {"suffix", &hst.BusConfig{See: []string{".*"}},
+ &hst.BadInterfaceError{Interface: ".*", Segment: "suffix"}},
+ {"valid suffix", &hst.BusConfig{See: []string{"..*"}}, nil},
+ {"valid", &hst.BusConfig{See: []string{"."}}, nil},
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ if err := tc.c.CheckInterfaces(tc.name); !reflect.DeepEqual(err, tc.err) {
+ t.Errorf("CheckInterfaces: error = %#v, want %#v", err, tc.err)
+ }
+ })
+ }
+}