1package launcher
2
3import (
4 "context"
5 "net"
6 "os"
7 "path/filepath"
8 "strings"
9 "testing"
10 "time"
11
12 "github.com/bnema/neferwl/internal/logging"
13)
14
15// The session commands run with the child environment and the right
16// arguments; the scripts on PATH record them.
17func TestExportSession(t *testing.T) {
18 dir := t.TempDir()
19 out := filepath.Join(dir, "calls")
20 script := "#!/bin/sh\necho \"${0##*/} $* $WAYLAND_DISPLAY\" >> " + out + "\n"
21 for _, name := range []string{"dbus-update-activation-environment", "systemctl"} {
22 if err := os.WriteFile(filepath.Join(dir, name), []byte(script), 0o755); err != nil {
23 t.Fatal(err)
24 }
25 }
26 env := []string{"PATH=" + dir, "WAYLAND_DISPLAY=wayland-9"}
27 ctx := context.Background()
28 ExportSession(ctx, env, logging.For(ctx, "launcher"))
29 UnexportSession(env, logging.For(ctx, "launcher"))
30 data, err := os.ReadFile(out)
31 if err != nil {
32 t.Fatal(err)
33 }
34 want := "dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE wayland-9\n" +
35 "systemctl --user unset-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE wayland-9\n"
36 if string(data) != want {
37 t.Fatalf("calls:\n%s", data)
38 }
39 // Missing tools are skipped, not fatal.
40 ExportSession(ctx, []string{"PATH=" + t.TempDir()}, logging.For(ctx, "launcher"))
41 if strings.Count(string(data), "\n") != 2 {
42 t.Fatal(string(data))
43 }
44}
45
46func TestNotifyReady(t *testing.T) {
47 ctx := context.Background()
48 log := logging.For(ctx, "launcher")
49 NotifyReady("", log)
50 path := filepath.Join(t.TempDir(), "notify")
51 listener, err := net.ListenUnixgram("unixgram", &net.UnixAddr{Name: path, Net: "unixgram"})
52 if err != nil {
53 t.Fatal(err)
54 }
55 defer listener.Close()
56 NotifyReady(path, log)
57 if err := listener.SetReadDeadline(time.Now().Add(time.Second)); err != nil {
58 t.Fatal(err)
59 }
60 buf := make([]byte, 64)
61 n, _, err := listener.ReadFromUnix(buf)
62 if err != nil {
63 t.Fatal(err)
64 }
65 if string(buf[:n]) != "READY=1" {
66 t.Fatalf("notification: %q", buf[:n])
67 }
68}