aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd/app/app_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/app/app_test.go')
-rw-r--r--cmd/app/app_test.go152
1 files changed, 152 insertions, 0 deletions
diff --git a/cmd/app/app_test.go b/cmd/app/app_test.go
new file mode 100644
index 00000000..df17f781
--- /dev/null
+++ b/cmd/app/app_test.go
@@ -0,0 +1,152 @@
+package main
+
+import (
+ "reflect"
+ "strings"
+ "testing"
+
+ "hakurei.app/check"
+ "hakurei.app/fhs"
+ "hakurei.app/hst"
+)
+
+func TestParse(t *testing.T) {
+ t.Parallel()
+
+ base := fhs.AbsProc.Append("nonexistent")
+ testCases := []struct {
+ name string
+ data string
+ want *hst.Config
+ err error
+ }{
+ {"com.discordapp.Discord", `8
+exec Discord --ozone-platform-hint=wayland
+
+gpu
+wayland
+dbus
+system_bus
+pipewire
+userns
+net
+mapuid
+
+share_runtime
+share_tmpdir
+
+group media_rw
+env ELECTRON_TRASH=gio
+rw "/sdcard"
+; remove before reusing
+ro "/bin\x00/.hakurei/bin"
+
+talk org.kde.StatusNotifierWatcher
+talk com.canonical.AppMenu.Registrar
+talk com.canonical.indicator.application
+talk com.canonical.Unity
+`, &hst.Config{
+ Identity: 8,
+ ID: "com.discordapp.Discord",
+ Enablements: new(hst.EWayland | hst.EDBus | hst.EPipeWire),
+ Groups: []string{"media_rw"},
+
+ SessionBus: &hst.BusConfig{
+ Talk: []string{
+ "org.kde.StatusNotifierWatcher",
+ "com.canonical.AppMenu.Registrar",
+ "com.canonical.indicator.application",
+ "com.canonical.Unity",
+ },
+ Own: []string{
+ "com.discordapp.Discord.*",
+ "org.mpris.MediaPlayer2.com.discordapp.Discord.*",
+ },
+ Filter: true,
+ },
+ SystemBus: &hst.BusConfig{Filter: true},
+
+ Container: &hst.ContainerConfig{
+ Env: map[string]string{
+ "ELECTRON_TRASH": "gio",
+ },
+ Filesystem: []hst.FilesystemConfigJSON{
+ {FilesystemConfig: &hst.FSOverlay{
+ Target: fhs.AbsRoot,
+ Lower: []*check.Absolute{
+ base.Append("template", "initial"),
+ base.Append("template", "upper"),
+ },
+ }},
+ {FilesystemConfig: &hst.FSBind{
+ Target: hst.AbsPrivateTmp.Append("home"),
+ Source: base.Append("state", "com.discordapp.Discord"),
+ Write: true,
+ Ensure: true,
+ }},
+
+ {FilesystemConfig: &hst.FSEphemeral{
+ Target: fhs.AbsVar.Append("tmp"),
+ Write: true,
+ Perm: 01777,
+ }},
+
+ {FilesystemConfig: &hst.FSBind{Source: fhs.AbsSys.Append("block")}},
+ {FilesystemConfig: &hst.FSBind{Source: fhs.AbsSys.Append("bus")}},
+ {FilesystemConfig: &hst.FSBind{Source: fhs.AbsSys.Append("class")}},
+ {FilesystemConfig: &hst.FSBind{Source: fhs.AbsSys.Append("dev")}},
+ {FilesystemConfig: &hst.FSBind{Source: fhs.AbsSys.Append("devices")}},
+
+ {FilesystemConfig: &hst.FSBind{
+ Source: check.MustAbs("/sdcard"),
+ Write: true,
+ }},
+ {FilesystemConfig: &hst.FSBind{
+ Target: check.MustAbs("/.hakurei/bin"),
+ Source: check.MustAbs("/bin"),
+ }},
+
+ {FilesystemConfig: &hst.FSBind{
+ Source: fhs.AbsDev.Append("dri"),
+ Device: true,
+ Optional: true,
+ }},
+ },
+
+ Username: "chronos",
+ Shell: fhs.AbsRoot.Append("bin", "zsh"),
+ Home: hst.AbsPrivateTmp.Append("home"),
+ Path: fhs.AbsRoot.Append("bin", "zsh"),
+ Args: []string{
+ "zsh", "-c",
+ "exec Discord --ozone-platform-hint=wayland",
+ },
+
+ Flags: hst.FUserns | hst.FHostNet | hst.FMapRealUID |
+ hst.FShareRuntime | hst.FShareTmpdir,
+ },
+ }, nil},
+ }
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ got, err := parse(
+ tc.name,
+ base,
+ strings.NewReader(tc.data),
+ )
+
+ if !reflect.DeepEqual(err, tc.err) {
+ t.Errorf("parse: error = %v, want %v", err, tc.err)
+ }
+ if err != nil {
+ return
+ }
+
+ if !reflect.DeepEqual(got, tc.want) {
+ t.Errorf("parse: %#v, want %#v", got, tc.want)
+ }
+ })
+ }
+}