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) } } }