nixos/tests/startx: test imperative setup

This commit is contained in:
rnhmjoj 2025-03-12 13:08:30 +01:00
parent a2e29f2fe3
commit a160ebdef3
No known key found for this signature in database
GPG Key ID: BFBAF4C975F76450
2 changed files with 177 additions and 85 deletions

View File

@ -1153,7 +1153,7 @@ in {
systemd-userdbd = handleTest ./systemd-userdbd.nix {}; systemd-userdbd = handleTest ./systemd-userdbd.nix {};
systemd-homed = handleTest ./systemd-homed.nix {}; systemd-homed = handleTest ./systemd-homed.nix {};
systemtap = handleTest ./systemtap.nix {}; systemtap = handleTest ./systemtap.nix {};
startx = runTest ./startx.nix; startx = import ./startx.nix { inherit pkgs runTest; };
taler = handleTest ./taler {}; taler = handleTest ./taler {};
tandoor-recipes = handleTest ./tandoor-recipes.nix {}; tandoor-recipes = handleTest ./tandoor-recipes.nix {};
tandoor-recipes-script-name = handleTest ./tandoor-recipes-script-name.nix {}; tandoor-recipes-script-name = handleTest ./tandoor-recipes-script-name.nix {};

View File

@ -1,108 +1,200 @@
{ lib, ... }: { pkgs, runTest }:
{ {
name = "startx";
meta.maintainers = with lib.maintainers; [ rnhmjoj ];
nodes.machine = declarative = runTest {
{ pkgs, ... }: name = "startx";
{ meta.maintainers = with pkgs.lib.maintainers; [ rnhmjoj ];
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [ nodes.machine =
xdotool { pkgs, ... }:
catclock {
]; services.getty.autologinUser = "root";
programs.bash.promptInit = "PS1='# '"; environment.systemPackages = with pkgs; [
xdotool
catclock
];
# startx+bspwm setup programs.bash.promptInit = "PS1='# '";
services.xserver = {
enable = true; # startx+bspwm setup
windowManager.bspwm = { services.xserver = {
enable = true; enable = true;
configFile = pkgs.writeShellScript "bspwrc" '' windowManager.bspwm = {
bspc config border_width 2 enable = true;
bspc config window_gap 12 configFile = pkgs.writeShellScript "bspwrc" ''
bspc rule -a xclock state=floating sticky=on bspc config border_width 2
''; bspc config window_gap 12
sxhkd.configFile = pkgs.writeText "sxhkdrc" '' bspc rule -a xclock state=floating sticky=on
# open a terminal '';
super + Return sxhkd.configFile = pkgs.writeText "sxhkdrc" ''
urxvtc # open a terminal
# quit bspwm super + Return
super + alt + Escape urxvtc
bspc quit # quit bspwm
''; super + alt + Escape
}; bspc quit
displayManager.startx = { '';
enable = true; };
generateScript = true; displayManager.startx = {
extraCommands = '' enable = true;
xrdb -load ~/.Xresources generateScript = true;
xsetroot -solid '#343d46' extraCommands = ''
xsetroot -cursor_name trek xrdb -load ~/.Xresources
xclock & xsetroot -solid '#343d46'
''; xsetroot -cursor_name trek
xclock &
'';
};
}; };
# enable some user services
security.polkit.enable = true;
services.urxvtd.enable = true;
programs.xss-lock.enable = true;
}; };
# enable some user services testScript = ''
security.polkit.enable = true; import textwrap
services.urxvtd.enable = true;
programs.xss-lock.enable = true;
};
testScript = '' sysu = "env XDG_RUNTIME_DIR=/run/user/0 systemctl --user";
import textwrap prompt = "# "
sysu = "env XDG_RUNTIME_DIR=/run/user/0 systemctl --user"; with subtest("Wait for the autologin"):
prompt = "# " machine.wait_until_tty_matches("1", prompt)
with subtest("Wait for the autologin"): with subtest("Setup dotfiles"):
machine.wait_until_tty_matches("1", prompt) machine.execute(textwrap.dedent("""
cat <<EOF > ~/.Xresources
urxvt*foreground: #9b9081
urxvt*background: #181b20
urxvt*scrollBar: false
urxvt*title: myterm
urxvt*geometry: 80x240+0+0
xclock*geometry: 164x164+24+440
EOF
"""))
with subtest("Setup dotfiles"): with subtest("Can start the X server"):
machine.execute(textwrap.dedent(""" machine.send_chars("startx\n")
cat <<EOF > ~/.Xresources machine.wait_for_x()
machine.wait_for_window("xclock")
with subtest("Graphical services are running"):
machine.succeed(f"{sysu} is-active graphical-session.target")
machine.succeed(f"{sysu} is-active urxvtd")
machine.succeed(f"{sysu} is-active xss-lock")
with subtest("Can interact with the WM"):
machine.wait_until_succeeds("pgrep sxhkd")
machine.wait_until_succeeds("pgrep bspwm")
# spawn some terminals
machine.send_key("meta_l-ret", delay=0.5)
machine.send_key("meta_l-ret", delay=0.5)
machine.send_key("meta_l-ret", delay=0.5)
# Note: this tests that resources have beeen loaded
machine.wait_for_window("myterm")
machine.screenshot("screenshot.png")
with subtest("Can stop the X server"):
# kill the WM
machine.send_key("meta_l-alt-esc")
machine.wait_until_tty_matches("1", prompt)
with subtest("Graphical session has stopped"):
machine.fail(f"{sysu} is-active graphical-session.target")
machine.fail(f"{sysu} is-active urxvtd")
machine.fail(f"{sysu} is-active xss-lock")
'';
};
imperative = runTest {
name = "startx-imperative";
meta.maintainers = with pkgs.lib.maintainers; [ rnhmjoj ];
nodes.machine =
{ pkgs, ... }:
{
services.getty.autologinUser = "root";
programs.bash.promptInit = "PS1='# '";
# startx+twm setup
services.xserver = {
enable = true;
windowManager.twm.enable = true;
displayManager.startx.enable = true;
displayManager.startx.generateScript = false;
};
# enable some user services
security.polkit.enable = true;
services.urxvtd.enable = true;
programs.xss-lock.enable = true;
};
testScript = ''
import textwrap
sysu = "env XDG_RUNTIME_DIR=/run/user/0 systemctl --user";
prompt = "# "
with subtest("Wait for the autologin"):
machine.wait_until_tty_matches("1", prompt)
with subtest("Setup dotfiles"):
machine.execute(textwrap.dedent("""
cat <<EOF > ~/.Xresources
urxvt*foreground: #9b9081 urxvt*foreground: #9b9081
urxvt*background: #181b20 urxvt*background: #181b20
urxvt*scrollBar: false urxvt*scrollBar: false
urxvt*title: myterm urxvt*title: myterm
urxvt*geometry: 80x240+0+0 urxvt*geometry: 20x20+40+40
xclock*geometry: 164x164+24+440 EOF
EOF cat <<EOF > ~/.twmrc
""")) "Return" = meta : all : f.exec "urxvtc"
"Escape" = meta : all : f.quit
EOF
cat <<EOF > ~/.xinitrc
xrdb -load ~/.Xresources
xsetroot -solid '#343d46'
xsetroot -cursor_name trek
# start user services
systemctl --user import-environment DISPLAY XDG_SESSION_ID
systemctl --user start nixos-fake-graphical-session.target
# run the window manager
twm
# stop services and all subprocesses
systemctl --user stop nixos-fake-graphical-session.target
EOF
"""))
with subtest("Can start the X server"): with subtest("Can start the X server"):
machine.send_chars("startx\n") machine.send_chars("startx\n")
machine.wait_for_x() machine.wait_for_x()
machine.wait_for_window("xclock")
with subtest("Graphical services are running"): with subtest("Graphical services are running"):
machine.succeed(f"{sysu} is-active graphical-session.target") machine.succeed(f"{sysu} is-active graphical-session.target")
machine.succeed(f"{sysu} is-active urxvtd") machine.succeed(f"{sysu} is-active urxvtd")
machine.succeed(f"{sysu} is-active xss-lock") machine.succeed(f"{sysu} is-active xss-lock")
with subtest("Can interact with the WM"): with subtest("Can interact with the WM"):
machine.wait_until_succeeds("pgrep sxhkd") machine.wait_until_succeeds("pgrep twm")
machine.wait_until_succeeds("pgrep bspwm") # spawn a terminal
# spawn some terminals machine.send_key("alt-ret")
machine.send_key("meta_l-ret", delay=0.5) machine.wait_for_window("myterm")
machine.send_key("meta_l-ret", delay=0.5) machine.screenshot("screenshot.png")
machine.send_key("meta_l-ret", delay=0.5)
# Note: this tests that resources have beeen loaded
machine.wait_for_window("myterm")
machine.screenshot("screenshot.png")
with subtest("Can stop the X server"): with subtest("Can stop the X server"):
# kill the WM # kill the WM
machine.send_key("meta_l-alt-esc") machine.send_key("alt-esc")
machine.wait_until_tty_matches("1", prompt) machine.wait_until_tty_matches("1", prompt)
with subtest("Graphical session has stopped"):
machine.fail(f"{sysu} is-active graphical-session.target")
machine.fail(f"{sysu} is-active urxvtd")
machine.fail(f"{sysu} is-active xss-lock")
'';
};
with subtest("Graphical session has stopped"):
machine.fail(f"{sysu} is-active graphical-session.target")
machine.fail(f"{sysu} is-active urxvtd")
machine.fail(f"{sysu} is-active xss-lock")
'';
} }