diff options
Diffstat (limited to 'cmd/app/app_test.go')
| -rw-r--r-- | cmd/app/app_test.go | 152 |
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) + } + }) + } +} |
