From a160ebdef3d1e65713f5e0598f2c0c04408a6e3a Mon Sep 17 00:00:00 2001 From: rnhmjoj Date: Wed, 12 Mar 2025 13:08:30 +0100 Subject: [PATCH] nixos/tests/startx: test imperative setup --- nixos/tests/all-tests.nix | 2 +- nixos/tests/startx.nix | 260 ++++++++++++++++++++++++++------------ 2 files changed, 177 insertions(+), 85 deletions(-) diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index bec1dc19d8e6..8fd22251b90a 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1153,7 +1153,7 @@ in { systemd-userdbd = handleTest ./systemd-userdbd.nix {}; systemd-homed = handleTest ./systemd-homed.nix {}; systemtap = handleTest ./systemtap.nix {}; - startx = runTest ./startx.nix; + startx = import ./startx.nix { inherit pkgs runTest; }; taler = handleTest ./taler {}; tandoor-recipes = handleTest ./tandoor-recipes.nix {}; tandoor-recipes-script-name = handleTest ./tandoor-recipes-script-name.nix {}; diff --git a/nixos/tests/startx.nix b/nixos/tests/startx.nix index eb83d60997e3..51c38d0ecdd0 100644 --- a/nixos/tests/startx.nix +++ b/nixos/tests/startx.nix @@ -1,108 +1,200 @@ -{ lib, ... }: +{ pkgs, runTest }: { - name = "startx"; - meta.maintainers = with lib.maintainers; [ rnhmjoj ]; - nodes.machine = - { pkgs, ... }: - { - services.getty.autologinUser = "root"; + declarative = runTest { + name = "startx"; + meta.maintainers = with pkgs.lib.maintainers; [ rnhmjoj ]; - environment.systemPackages = with pkgs; [ - xdotool - catclock - ]; + nodes.machine = + { pkgs, ... }: + { + services.getty.autologinUser = "root"; - programs.bash.promptInit = "PS1='# '"; + environment.systemPackages = with pkgs; [ + xdotool + catclock + ]; - # startx+bspwm setup - services.xserver = { - enable = true; - windowManager.bspwm = { + programs.bash.promptInit = "PS1='# '"; + + # startx+bspwm setup + services.xserver = { enable = true; - configFile = pkgs.writeShellScript "bspwrc" '' - bspc config border_width 2 - bspc config window_gap 12 - bspc rule -a xclock state=floating sticky=on - ''; - sxhkd.configFile = pkgs.writeText "sxhkdrc" '' - # open a terminal - super + Return - urxvtc - # quit bspwm - super + alt + Escape - bspc quit - ''; - }; - displayManager.startx = { - enable = true; - generateScript = true; - extraCommands = '' - xrdb -load ~/.Xresources - xsetroot -solid '#343d46' - xsetroot -cursor_name trek - xclock & - ''; + windowManager.bspwm = { + enable = true; + configFile = pkgs.writeShellScript "bspwrc" '' + bspc config border_width 2 + bspc config window_gap 12 + bspc rule -a xclock state=floating sticky=on + ''; + sxhkd.configFile = pkgs.writeText "sxhkdrc" '' + # open a terminal + super + Return + urxvtc + # quit bspwm + super + alt + Escape + bspc quit + ''; + }; + displayManager.startx = { + enable = true; + generateScript = true; + extraCommands = '' + xrdb -load ~/.Xresources + 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 - security.polkit.enable = true; - services.urxvtd.enable = true; - programs.xss-lock.enable = true; - }; + testScript = '' + import textwrap - testScript = '' - import textwrap + sysu = "env XDG_RUNTIME_DIR=/run/user/0 systemctl --user"; + prompt = "# " - 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("Wait for the autologin"): - machine.wait_until_tty_matches("1", prompt) + with subtest("Setup dotfiles"): + machine.execute(textwrap.dedent(""" + cat < ~/.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"): - machine.execute(textwrap.dedent(""" - cat < ~/.Xresources + with subtest("Can start the X server"): + machine.send_chars("startx\n") + 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 < ~/.Xresources urxvt*foreground: #9b9081 urxvt*background: #181b20 urxvt*scrollBar: false urxvt*title: myterm - urxvt*geometry: 80x240+0+0 - xclock*geometry: 164x164+24+440 - EOF - """)) + urxvt*geometry: 20x20+40+40 + EOF + cat < ~/.twmrc + "Return" = meta : all : f.exec "urxvtc" + "Escape" = meta : all : f.quit + EOF + cat < ~/.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"): - machine.send_chars("startx\n") - machine.wait_for_x() - machine.wait_for_window("xclock") + with subtest("Can start the X server"): + machine.send_chars("startx\n") + machine.wait_for_x() - 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("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 interact with the WM"): + machine.wait_until_succeeds("pgrep twm") + # spawn a terminal + machine.send_key("alt-ret") + 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("Can stop the X server"): + # kill the WM + machine.send_key("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") + ''; + }; - 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") - ''; }