nixpkgs/nixos/tests/gnome.nix
Jan Tojnar 98d2e797e8 nixos/tests/gnome: Do not use autostart and switch to kgx
Starting terminal with autostart makes it harder to control when it is activated.
This reverts commit 7aaf526225.

Unfortunately, we cannot simply just go back since that would fail
as mentioned in the reverted commit.
It appears that this is due to the app not being able to find DISPLAY,
since switching to a different terminal emulator will complain:

    (kgx:1612): Gtk-WARNING **: 01:12:49.988: cannot open display: :0.0

Let’s use D-Bus activation rather than executing the program through su.
That will hopefully take care of all the necessary environment variables.

And since GNOME Terminal does not support D-Bus activation for the app,
let’s switch to GNOME Console. It probably makes sense anyway,
as it is the default terminal emulator.

Also let’s unify the WMClass detection a bit. Though, weirdly,
the WMClass differs on Wayland.
2023-04-06 04:19:08 +02:00

93 lines
3.0 KiB
Nix

import ./make-test-python.nix ({ pkgs, lib, ...} : {
name = "gnome";
meta = with lib; {
maintainers = teams.gnome.members;
};
nodes.machine =
{ ... }:
{ imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.xserver.displayManager = {
gdm.enable = true;
gdm.debug = true;
autoLogin = {
enable = true;
user = "alice";
};
};
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
systemd.user.services = {
"org.gnome.Shell@wayland" = {
serviceConfig = {
ExecStart = [
# Clear the list before overriding it.
""
# Eval API is now internal so Shell needs to run in unsafe mode.
# TODO: improve test driver so that it supports openqa-like manipulation
# that would allow us to drop this mess.
"${pkgs.gnome.gnome-shell}/bin/gnome-shell --unsafe-mode"
];
};
};
};
};
testScript = { nodes, ... }: let
# Keep line widths somewhat managable
user = nodes.machine.config.users.users.alice;
uid = toString user.uid;
bus = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus";
gdbus = "${bus} gdbus";
su = command: "su - ${user.name} -c '${command}'";
# Call javascript in gnome shell, returns a tuple (success, output), where
# `success` is true if the dbus call was successful and output is what the
# javascript evaluates to.
eval = "call --session -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval";
# False when startup is done
startingUp = su "${gdbus} ${eval} Main.layoutManager._startingUp";
# Start Console
launchConsole = su "${bus} gapplication launch org.gnome.Console";
# Hopefully Console's wm class
wmClass = su "${gdbus} ${eval} global.display.focus_window.wm_class";
in ''
with subtest("Login to GNOME with GDM"):
# wait for gdm to start
machine.wait_for_unit("display-manager.service")
# wait for the wayland server
machine.wait_for_file("/run/user/${uid}/wayland-0")
# wait for alice to be logged in
machine.wait_for_unit("default.target", "${user.name}")
# check that logging in has given the user ownership of devices
assert "alice" in machine.succeed("getfacl -p /dev/snd/timer")
with subtest("Wait for GNOME Shell"):
# correct output should be (true, 'false')
machine.wait_until_succeeds(
"${startingUp} | grep -q 'true,..false'"
)
with subtest("Open Console"):
machine.succeed(
"${launchConsole}"
)
# correct output should be (true, '"org.gnome.Console"')
machine.wait_until_succeeds(
"${wmClass} | grep -q 'true,...org.gnome.Console'"
)
machine.sleep(20)
machine.screenshot("screen")
'';
})