python312Packages.dissect-extfs: 3.11 -> 3.12
[NixPkgs.git] / nixos / tests / ayatana-indicators.nix
blob8d134e1af2eecc383643d001d3a737224acf81f2
1 { pkgs, lib, ... }:
2 let
3   user = "alice";
4 in
6   name = "ayatana-indicators";
8   meta = {
9     maintainers = lib.teams.lomiri.members;
10   };
12   nodes.machine =
13     { config, ... }:
14     {
15       imports = [
16         ./common/auto.nix
17         ./common/user-account.nix
18       ];
20       test-support.displayManager.auto = {
21         enable = true;
22         inherit user;
23       };
25       services.xserver = {
26         enable = true;
27         desktopManager.mate.enable = true;
28       };
29       services.displayManager.defaultSession = lib.mkForce "mate";
31       services.ayatana-indicators = {
32         enable = true;
33         packages =
34           with pkgs;
35           [
36             ayatana-indicator-bluetooth
37             ayatana-indicator-datetime
38             ayatana-indicator-display
39             ayatana-indicator-messages
40             ayatana-indicator-power
41             ayatana-indicator-session
42             ayatana-indicator-sound
43           ]
44           ++ (with pkgs.lomiri; [
45             lomiri-indicator-network
46             telephony-service
47           ]);
48       };
50       # Setup needed by some indicators
52       services.accounts-daemon.enable = true; # messages
54       # Lomiri-ish setup for Lomiri indicators
55       # TODO move into a Lomiri module, once the package set is far enough for the DE to start
57       networking.networkmanager.enable = true; # lomiri-network-indicator
58       # TODO potentially urfkill for lomiri-network-indicator?
60       services.dbus.packages = with pkgs.lomiri; [ libusermetrics ];
62       environment.systemPackages = with pkgs.lomiri; [ lomiri-schemas ];
64       services.telepathy.enable = true;
66       users.users.usermetrics = {
67         group = "usermetrics";
68         home = "/var/lib/usermetrics";
69         createHome = true;
70         isSystemUser = true;
71       };
73       users.groups.usermetrics = { };
74     };
76   # TODO session indicator starts up in a semi-broken state, but works fine after a restart. maybe being started before graphical session is truly up & ready?
77   testScript =
78     { nodes, ... }:
79     let
80       runCommandOverServiceList = list: command: lib.strings.concatMapStringsSep "\n" command list;
82       runCommandOverAyatanaIndicators = runCommandOverServiceList
83         nodes.machine.systemd.user.targets.ayatana-indicators.wants;
85       runCommandOverLomiriIndicators = runCommandOverServiceList nodes.machine.systemd.user.targets.lomiri-indicators.wants;
86     in
87     ''
88       start_all()
89       machine.wait_for_x()
91       # Desktop environment should reach graphical-session.target
92       machine.wait_for_unit("graphical-session.target", "${user}")
94       # MATE relies on XDG autostart to bring up the indicators.
95       # Not sure *when* XDG autostart fires them up, and awaiting pgrep success seems to misbehave?
96       machine.sleep(10)
98       # Now check if all indicators were brought up successfully, and kill them for later
99     ''
100     + (runCommandOverAyatanaIndicators (
101       service:
102       let
103         serviceExec = builtins.replaceStrings [ "." ] [ "-" ] service;
104       in
105       ''
106         machine.wait_until_succeeds("pgrep -u ${user} -f ${serviceExec}")
107         machine.succeed("pkill -f ${serviceExec}")
108       ''
109     ))
110     + ''
112       # Ayatana target is the preferred way of starting up indicators on SystemD session, the graphical session is responsible for starting this if it supports them.
113       # Mate currently doesn't do this, so start it manually for checking (https://github.com/mate-desktop/mate-indicator-applet/issues/63)
114       machine.systemctl("start ayatana-indicators.target", "${user}")
115       machine.wait_for_unit("ayatana-indicators.target", "${user}")
117       # Let all indicator services do their startups, potential post-launch crash & restart cycles so we can properly check for failures
118       # Not sure if there's a better way of awaiting this without false-positive potential
119       machine.sleep(10)
121       # Now check if all indicator services were brought up successfully
122     ''
123     + runCommandOverAyatanaIndicators (service: ''
124       machine.wait_for_unit("${service}", "${user}")
125     '')
126     + ''
127       # Stop the target
128       machine.systemctl("stop ayatana-indicators.target", "${user}")
130       # Let all indicator services do their shutdowns
131       # Not sure if there's a better way of awaiting this without false-positive potential
132       machine.sleep(10)
134       # Lomiri uses a different target, which launches a slightly different set of indicators
135       machine.systemctl("start lomiri-indicators.target", "${user}")
136       machine.wait_for_unit("lomiri-indicators.target", "${user}")
138       # Let all indicator services do their startups, potential post-launch crash & restart cycles so we can properly check for failures
139       # Not sure if there's a better way of awaiting this without false-positive potential
140       machine.sleep(10)
142       # Now check if all indicator services were brought up successfully
143     ''
144     + runCommandOverLomiriIndicators (service: ''
145       machine.wait_for_unit("${service}", "${user}")
146     '');