Both are official packages already on both workstations, started once by dex from an XDG autostart entry (the client's own, the package's). The modules declare the package, add no second start, own none of the apps' files, and give the mesh status, log, restart and check.
127 lines
4.4 KiB
Go
127 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func newApplet(t *testing.T, running bool) *fake {
|
|
f := newFake(t)
|
|
f.write("/etc/xdg/autostart/blueman.desktop", "[Desktop Entry]\nName=Blueman Applet\nExec=blueman-applet\nType=Application\n")
|
|
if running {
|
|
f.proc(3859, 1000, appletComm, []string{"/usr/bin/python", "/usr/bin/blueman-applet"}, "session-c1.scope")
|
|
f.proc(4084, 1000, trayComm, []string{"/usr/bin/python", "/usr/bin/blueman-tray"}, "session-c1.scope")
|
|
}
|
|
f.answer = func(name string, args []string) Output {
|
|
call := name + " " + strings.Join(args, " ")
|
|
switch {
|
|
case name == "pacman":
|
|
return Output{Stdout: "blueman 2.4.6-2\n"}
|
|
case name == "gsettings":
|
|
return Output{Stdout: "['!NetUsage', 'DhcpClient']\n"}
|
|
case strings.HasSuffix(call, " QueryPlugins"):
|
|
return Output{Stdout: `{"type":"as","data":[["StatusIcon","AuthAgent","PowerManager"]]}`}
|
|
case strings.HasSuffix(call, " QueryAvailablePlugins"):
|
|
return Output{Stdout: `{"type":"as","data":[["StatusIcon","AuthAgent","PowerManager","NetUsage"]]}`}
|
|
case strings.HasSuffix(call, " GetBluetoothStatus"):
|
|
return Output{Stdout: `{"type":"b","data":[true]}`}
|
|
case name == "systemctl" && len(args) > 1 && args[0] == "is-active":
|
|
return Output{Stdout: "active\n"}
|
|
}
|
|
return Output{}
|
|
}
|
|
return f
|
|
}
|
|
|
|
func TestStatusAsksTheRunningAppletAndNeverStartsIt(t *testing.T) {
|
|
f := newApplet(t, true)
|
|
s, err := f.Status()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if s.Installed != "2.4.6-2" || len(s.Applet) != 1 || len(s.Tray) != 1 || !s.StartedBy.Starts || s.Bluetooth == nil || !*s.Bluetooth {
|
|
t.Fatalf("%+v", s)
|
|
}
|
|
if strings.Join(s.Plugins.Loaded, ",") != "AuthAgent,PowerManager,StatusIcon" || strings.Join(s.Plugins.NotLoaded, ",") != "NetUsage" ||
|
|
strings.Join(s.Plugins.Switched, ",") != "!NetUsage,DhcpClient" {
|
|
t.Fatalf("%+v", s.Plugins)
|
|
}
|
|
for _, c := range f.calls {
|
|
if strings.HasPrefix(c, "busctl") && !strings.Contains(c, "--auto-start=no") {
|
|
t.Fatalf("a bus call that could start the applet: %s", c)
|
|
}
|
|
}
|
|
|
|
stopped := newApplet(t, false)
|
|
s, err = stopped.Status()
|
|
if err != nil || s.Unanswered != "the applet is not running" || len(s.Applet) != 0 || s.Bluetooth != nil {
|
|
t.Fatalf("%+v %v", s, err)
|
|
}
|
|
if stopped.called("busctl") {
|
|
t.Fatalf("asked the bus with no applet running: %q", stopped.calls)
|
|
}
|
|
}
|
|
|
|
func TestSettingsListsAreReadAsGSettingsPrintsThem(t *testing.T) {
|
|
for in, want := range map[string]string{"@as []\n": "", "['a']": "a", "['!a', 'b']\n": "!a,b"} {
|
|
if got := strings.Join(gvariantStrings(in), ","); got != want {
|
|
t.Errorf("%q: %q, not %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRestartEndsAppletAndTrayAndStartsTheApplet(t *testing.T) {
|
|
f := newApplet(t, true)
|
|
if _, err := f.Restart(); err == nil || !strings.Contains(err.Error(), "no graphical session") {
|
|
t.Fatalf("without a desktop: %v", err)
|
|
}
|
|
f.desktopSession()
|
|
f.onStart = func(argv []string) { f.proc(9100, 1000, appletComm, argv, "app.slice/"+restartAs+".service") }
|
|
a, err := f.Restart()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(a.Ended) != 2 || len(a.Running) != 1 || a.Running[0].PID != 9100 || a.Running[0].Command != appletBin {
|
|
t.Fatalf("%+v", a)
|
|
}
|
|
if !f.called("systemd-run --user --collect --quiet --unit=" + restartAs + " --setenv=DISPLAY=:1") {
|
|
t.Fatalf("%q", f.calls)
|
|
}
|
|
}
|
|
|
|
func TestCheckPassesThePackagesOneStartAndNamesEveryOther(t *testing.T) {
|
|
f := newApplet(t, true)
|
|
f.desktopSession()
|
|
c, err := f.Check()
|
|
if err != nil || !c.OK || len(c.Starts) != 1 || c.Starts[0] != "XDG autostart: /etc/xdg/autostart/blueman.desktop" {
|
|
t.Fatalf("%+v %v", c, err)
|
|
}
|
|
|
|
f.write(testHome+"/.config/i3/config", "exec --no-startup-id blueman-applet\n")
|
|
f.write(testHome+"/.config/autostart/blueman.desktop", "[Desktop Entry]\nExec=blueman-applet\nHidden=true\n")
|
|
f.proc(3860, 1000, appletComm, []string{"blueman-applet"}, "session-c1.scope")
|
|
f.answer = func(name string, args []string) Output {
|
|
switch name {
|
|
case "pacman":
|
|
return Output{Code: 1}
|
|
case "systemctl":
|
|
return Output{Stdout: "inactive\n", Code: 3}
|
|
case "dex":
|
|
return Output{Code: 127, Err: ErrNotInstalled}
|
|
}
|
|
return Output{}
|
|
}
|
|
c, _ = f.Check()
|
|
var all []string
|
|
for _, x := range c.Findings {
|
|
all = append(all, x.What)
|
|
}
|
|
got := strings.Join(all, "\n")
|
|
for _, want := range []string{"not installed", "does not start with the session (Hidden=true)", "dex", "a second start: ~/.config/i3/config:1",
|
|
"bluetooth.service", "2 applets run"} {
|
|
if !strings.Contains(got, want) {
|
|
t.Errorf("no finding %q in\n%s", want, got)
|
|
}
|
|
}
|
|
}
|