All checks were successful
Test / Create distribution (push) Successful in 34s
Test / Sandbox (push) Successful in 2m11s
Test / Hakurei (push) Successful in 3m12s
Test / Hpkg (push) Successful in 4m0s
Test / Hakurei (race detector) (push) Successful in 5m20s
Test / Sandbox (race detector) (push) Successful in 2m11s
Test / Flake checks (push) Successful in 1m31s
This allows holding a xdg-dbus-proxy configuration without importing system/dbus. It also makes more sense in the project structure since the config struct is part of the hst API however the rest of the implementation is not. Signed-off-by: Ophestra <cat@gensokyo.uk>
215 lines
6.2 KiB
Go
215 lines
6.2 KiB
Go
package dbus_test
|
|
|
|
import (
|
|
"hakurei.app/hst"
|
|
)
|
|
|
|
const (
|
|
sampleHostPath = "/tmp/bus"
|
|
sampleHostAddr = "unix:path=" + sampleHostPath
|
|
sampleBindPath = "/tmp/proxied_bus"
|
|
)
|
|
|
|
var samples = []dbusTestCase{
|
|
{
|
|
"org.chromium.Chromium", &hst.BusConfig{
|
|
See: nil,
|
|
Talk: []string{"org.freedesktop.Notifications", "org.freedesktop.FileManager1", "org.freedesktop.ScreenSaver",
|
|
"org.freedesktop.secrets", "org.kde.kwalletd5", "org.kde.kwalletd6", "org.gnome.SessionManager"},
|
|
Own: []string{"org.chromium.Chromium.*", "org.mpris.MediaPlayer2.org.chromium.Chromium.*",
|
|
"org.mpris.MediaPlayer2.chromium.*"},
|
|
Call: map[string]string{"org.freedesktop.portal.*": "*"},
|
|
Broadcast: map[string]string{"org.freedesktop.portal.*": "@/org/freedesktop/portal/*"},
|
|
Log: false,
|
|
Filter: true,
|
|
}, false, false,
|
|
[2]string{sampleHostAddr, sampleBindPath},
|
|
[]string{
|
|
sampleHostAddr,
|
|
sampleBindPath,
|
|
"--filter",
|
|
"--talk=org.freedesktop.Notifications",
|
|
"--talk=org.freedesktop.FileManager1",
|
|
"--talk=org.freedesktop.ScreenSaver",
|
|
"--talk=org.freedesktop.secrets",
|
|
"--talk=org.kde.kwalletd5",
|
|
"--talk=org.kde.kwalletd6",
|
|
"--talk=org.gnome.SessionManager",
|
|
"--own=org.chromium.Chromium.*",
|
|
"--own=org.mpris.MediaPlayer2.org.chromium.Chromium.*",
|
|
"--own=org.mpris.MediaPlayer2.chromium.*",
|
|
"--call=org.freedesktop.portal.*=*",
|
|
"--broadcast=org.freedesktop.portal.*=@/org/freedesktop/portal/*",
|
|
},
|
|
},
|
|
{
|
|
"org.chromium.Chromium+", &hst.BusConfig{
|
|
See: nil,
|
|
Talk: []string{"org.bluez", "org.freedesktop.Avahi", "org.freedesktop.UPower"},
|
|
Own: nil,
|
|
Call: nil,
|
|
Broadcast: nil,
|
|
Log: false,
|
|
Filter: true,
|
|
}, false, false,
|
|
[2]string{sampleHostAddr, sampleBindPath},
|
|
[]string{
|
|
sampleHostAddr,
|
|
sampleBindPath,
|
|
"--filter",
|
|
"--talk=org.bluez",
|
|
"--talk=org.freedesktop.Avahi",
|
|
"--talk=org.freedesktop.UPower",
|
|
},
|
|
},
|
|
|
|
{
|
|
"dev.vencord.Vesktop", &hst.BusConfig{
|
|
See: nil,
|
|
Talk: []string{"org.freedesktop.Notifications", "org.kde.StatusNotifierWatcher"},
|
|
Own: []string{"dev.vencord.Vesktop.*", "org.mpris.MediaPlayer2.dev.vencord.Vesktop.*"},
|
|
Call: map[string]string{"org.freedesktop.portal.*": "*"},
|
|
Broadcast: map[string]string{"org.freedesktop.portal.*": "@/org/freedesktop/portal/*"},
|
|
Log: false,
|
|
Filter: true,
|
|
}, false, false,
|
|
[2]string{sampleHostAddr, sampleBindPath},
|
|
[]string{
|
|
sampleHostAddr,
|
|
sampleBindPath,
|
|
"--filter",
|
|
"--talk=org.freedesktop.Notifications",
|
|
"--talk=org.kde.StatusNotifierWatcher",
|
|
"--own=dev.vencord.Vesktop.*",
|
|
"--own=org.mpris.MediaPlayer2.dev.vencord.Vesktop.*",
|
|
"--call=org.freedesktop.portal.*=*",
|
|
"--broadcast=org.freedesktop.portal.*=@/org/freedesktop/portal/*"},
|
|
},
|
|
|
|
{
|
|
"uk.gensokyo.CrashTestDummy", &hst.BusConfig{
|
|
See: []string{"uk.gensokyo.CrashTestDummy1"},
|
|
Talk: []string{"org.freedesktop.Notifications"},
|
|
Own: []string{"uk.gensokyo.CrashTestDummy.*", "org.mpris.MediaPlayer2.uk.gensokyo.CrashTestDummy.*"},
|
|
Call: map[string]string{"org.freedesktop.portal.*": "*"},
|
|
Broadcast: map[string]string{"org.freedesktop.portal.*": "@/org/freedesktop/portal/*"},
|
|
Log: true,
|
|
Filter: true,
|
|
}, false, false,
|
|
[2]string{sampleHostAddr, sampleBindPath},
|
|
[]string{
|
|
sampleHostAddr,
|
|
sampleBindPath,
|
|
"--filter",
|
|
"--see=uk.gensokyo.CrashTestDummy1",
|
|
"--talk=org.freedesktop.Notifications",
|
|
"--own=uk.gensokyo.CrashTestDummy.*",
|
|
"--own=org.mpris.MediaPlayer2.uk.gensokyo.CrashTestDummy.*",
|
|
"--call=org.freedesktop.portal.*=*",
|
|
"--broadcast=org.freedesktop.portal.*=@/org/freedesktop/portal/*",
|
|
"--log"},
|
|
},
|
|
{
|
|
"uk.gensokyo.CrashTestDummy1", &hst.BusConfig{
|
|
See: []string{"uk.gensokyo.CrashTestDummy"},
|
|
Talk: []string{"org.freedesktop.Notifications"},
|
|
Own: []string{"uk.gensokyo.CrashTestDummy1.*", "org.mpris.MediaPlayer2.uk.gensokyo.CrashTestDummy1.*"},
|
|
Call: map[string]string{"org.freedesktop.portal.*": "*"},
|
|
Broadcast: map[string]string{"org.freedesktop.portal.*": "@/org/freedesktop/portal/*"},
|
|
Log: true,
|
|
Filter: true,
|
|
}, false, true,
|
|
[2]string{sampleHostAddr, sampleBindPath},
|
|
[]string{
|
|
sampleHostAddr,
|
|
sampleBindPath,
|
|
"--filter",
|
|
"--see=uk.gensokyo.CrashTestDummy",
|
|
"--talk=org.freedesktop.Notifications",
|
|
"--own=uk.gensokyo.CrashTestDummy1.*",
|
|
"--own=org.mpris.MediaPlayer2.uk.gensokyo.CrashTestDummy1.*",
|
|
"--call=org.freedesktop.portal.*=*",
|
|
"--broadcast=org.freedesktop.portal.*=@/org/freedesktop/portal/*",
|
|
"--log"},
|
|
},
|
|
}
|
|
|
|
type dbusTestCase struct {
|
|
id string
|
|
c *hst.BusConfig
|
|
wantErr bool
|
|
wantErrF bool
|
|
bus [2]string
|
|
want []string
|
|
}
|
|
|
|
var (
|
|
testCasesExt = func() []dbusTestCase {
|
|
testCases := make([]dbusTestCase, len(samples)*2)
|
|
for i := range samples {
|
|
testCases[i] = samples[i]
|
|
|
|
fi := &testCases[len(samples)+i]
|
|
*fi = samples[i]
|
|
|
|
// create null-injected test cases
|
|
fi.wantErr = true
|
|
injectNulls := func(t *[]string) {
|
|
f := make([]string, len(*t))
|
|
for i := range f {
|
|
f[i] = "\x00" + (*t)[i] + "\x00"
|
|
}
|
|
*t = f
|
|
}
|
|
|
|
fi.c = new(hst.BusConfig)
|
|
*fi.c = *samples[i].c
|
|
injectNulls(&fi.c.See)
|
|
injectNulls(&fi.c.Talk)
|
|
injectNulls(&fi.c.Own)
|
|
}
|
|
return testCases
|
|
}()
|
|
|
|
testCasePairs = func() map[string][2]dbusTestCase {
|
|
// enumerate test case pairs
|
|
var pc int
|
|
for _, tc := range samples {
|
|
if tc.id != "" {
|
|
pc++
|
|
}
|
|
}
|
|
pairs := make(map[string][2]dbusTestCase, pc)
|
|
for i, tc := range testCasesExt {
|
|
if tc.id == "" {
|
|
continue
|
|
}
|
|
|
|
// skip already enumerated system bus test
|
|
if tc.id[len(tc.id)-1] == '+' {
|
|
continue
|
|
}
|
|
|
|
ftp := [2]dbusTestCase{tc}
|
|
|
|
// system proxy tests always place directly after its user counterpart with id ending in +
|
|
if i+1 < len(testCasesExt) && testCasesExt[i+1].id[len(testCasesExt[i+1].id)-1] == '+' {
|
|
// attach system bus config
|
|
ftp[1] = testCasesExt[i+1]
|
|
|
|
// check for misplaced/mismatching tests
|
|
if ftp[0].wantErr != ftp[1].wantErr || ftp[0].id+"+" != ftp[1].id {
|
|
panic("mismatching session/system pairing")
|
|
}
|
|
}
|
|
|
|
k := tc.id
|
|
if tc.wantErr {
|
|
k = "malformed_" + k
|
|
}
|
|
pairs[k] = ftp
|
|
}
|
|
return pairs
|
|
}()
|
|
)
|