diff options
author | Pol Dellaiera <pol.dellaiera@protonmail.com> | 2024-06-16 10:18:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-16 10:18:26 +0200 |
commit | 22279cafcc88c77d21c89dbbde8108a8f2f10178 (patch) | |
tree | c8610b5602c82c4831a4677418e91792bcd05b5c /nixos/tests | |
parent | 31ec299d8002a473dafd6de000f61b61972e67da (diff) | |
parent | 408406c2ff06f30c52106dc2a6b93ab6ca691d1e (diff) |
Merge pull request #317138 from l0b0/ydotool-group
nixos/ydotool: Make group configurable
Diffstat (limited to 'nixos/tests')
-rw-r--r-- | nixos/tests/ydotool.nix | 257 |
1 files changed, 163 insertions, 94 deletions
diff --git a/nixos/tests/ydotool.nix b/nixos/tests/ydotool.nix index 818ac6f2d50de..45e3d27adeb49 100644 --- a/nixos/tests/ydotool.nix +++ b/nixos/tests/ydotool.nix @@ -1,115 +1,184 @@ -import ./make-test-python.nix ( - { pkgs, lib, ... }: - let - textInput = "This works."; - inputBoxText = "Enter input"; - inputBox = pkgs.writeShellScript "zenity-input" '' - ${lib.getExe pkgs.gnome.zenity} --entry --text '${inputBoxText}:' > /tmp/output & - ''; - in - { - name = "ydotool"; - - meta = { - maintainers = with lib.maintainers; [ - OPNA2608 - quantenzitrone - ]; - }; +{ + system ? builtins.currentSystem, + config ? { }, + pkgs ? import ../.. { inherit system config; }, + lib ? pkgs.lib, +}: +let + makeTest = import ./make-test-python.nix; + textInput = "This works."; + inputBoxText = "Enter input"; + inputBox = pkgs.writeShellScript "zenity-input" '' + ${lib.getExe pkgs.gnome.zenity} --entry --text '${inputBoxText}:' > /tmp/output & + ''; + asUser = '' + def as_user(cmd: str): + """ + Return a shell command for running a shell command as a specific user. + """ + return f"sudo -u alice -i {cmd}" + ''; +in +{ + headless = makeTest { + name = "headless"; - nodes = { - headless = - { config, ... }: - { - imports = [ ./common/user-account.nix ]; + enableOCR = true; - users.users.alice.extraGroups = [ "ydotool" ]; + nodes.machine = { + imports = [ ./common/user-account.nix ]; - programs.ydotool.enable = true; + users.users.alice.extraGroups = [ "ydotool" ]; - services.getty.autologinUser = "alice"; - }; + programs.ydotool.enable = true; - x11 = - { config, ... }: - { - imports = [ - ./common/user-account.nix - ./common/auto.nix - ./common/x11.nix - ]; + services.getty.autologinUser = "alice"; + }; - users.users.alice.extraGroups = [ "ydotool" ]; + testScript = + asUser + + '' + start_all() - programs.ydotool.enable = true; + machine.wait_for_unit("multi-user.target") + machine.wait_for_text("alice") + machine.succeed(as_user("ydotool type 'echo ${textInput} > /tmp/output'")) # text input + machine.succeed(as_user("ydotool key 28:1 28:0")) # text input + machine.screenshot("headless_input") + machine.wait_for_file("/tmp/output") + machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input + ''; - test-support.displayManager.auto = { - enable = true; - user = "alice"; - }; + meta.maintainers = with lib.maintainers; [ + OPNA2608 + quantenzitrone + ]; + }; - services.xserver.windowManager.dwm.enable = true; - services.displayManager.defaultSession = lib.mkForce "none+dwm"; - }; + x11 = makeTest { + name = "x11"; - wayland = - { config, ... }: - { - imports = [ ./common/user-account.nix ]; + enableOCR = true; - services.cage = { - enable = true; - user = "alice"; - }; + nodes.machine = { + imports = [ + ./common/user-account.nix + ./common/auto.nix + ./common/x11.nix + ]; - programs.ydotool.enable = true; + users.users.alice.extraGroups = [ "ydotool" ]; - services.cage.program = inputBox; - }; + programs.ydotool.enable = true; + + test-support.displayManager.auto = { + enable = true; + user = "alice"; + }; + + services.xserver.windowManager.dwm.enable = true; + services.displayManager.defaultSession = lib.mkForce "none+dwm"; }; + testScript = + asUser + + '' + start_all() + + machine.wait_for_x() + machine.execute(as_user("${inputBox}")) + machine.wait_for_text("${inputBoxText}") + machine.succeed(as_user("ydotool type '${textInput}'")) # text input + machine.screenshot("x11_input") + machine.succeed(as_user("ydotool mousemove -a 400 110")) # mouse input + machine.succeed(as_user("ydotool click 0xC0")) # mouse input + machine.wait_for_file("/tmp/output") + machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input + ''; + + meta.maintainers = with lib.maintainers; [ + OPNA2608 + quantenzitrone + ]; + }; + + wayland = makeTest { + name = "wayland"; + enableOCR = true; - testScript = - { nodes, ... }: - '' - def as_user(cmd: str): - """ - Return a shell command for running a shell command as a specific user. - """ - return f"sudo -u alice -i {cmd}" + nodes.machine = { + imports = [ ./common/user-account.nix ]; + + services.cage = { + enable = true; + user = "alice"; + }; + + programs.ydotool.enable = true; + + services.cage.program = inputBox; + }; + + testScript = '' + start_all() + + machine.wait_for_unit("graphical.target") + machine.wait_for_text("${inputBoxText}") + machine.succeed("ydotool type '${textInput}'") # text input + machine.screenshot("wayland_input") + machine.succeed("ydotool mousemove -a 100 100") # mouse input + machine.succeed("ydotool click 0xC0") # mouse input + machine.wait_for_file("/tmp/output") + machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input + ''; + + meta.maintainers = with lib.maintainers; [ + OPNA2608 + quantenzitrone + ]; + }; + + customGroup = + let + name = "customGroup"; + nodeName = "${name}Node"; + insideGroupUsername = "ydotool-user"; + outsideGroupUsername = "other-user"; + groupName = "custom-group"; + in + makeTest { + inherit name; + + nodes."${nodeName}" = { + programs.ydotool = { + enable = true; + group = groupName; + }; + + users.users = { + "${insideGroupUsername}" = { + isNormalUser = true; + extraGroups = [ groupName ]; + }; + "${outsideGroupUsername}".isNormalUser = true; + }; + }; + testScript = '' start_all() - # Headless - headless.wait_for_unit("multi-user.target") - headless.wait_for_text("alice") - headless.succeed(as_user("ydotool type 'echo ${textInput} > /tmp/output'")) # text input - headless.succeed(as_user("ydotool key 28:1 28:0")) # text input - headless.screenshot("headless_input") - headless.wait_for_file("/tmp/output") - headless.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input - - # X11 - x11.wait_for_x() - x11.execute(as_user("${inputBox}")) - x11.wait_for_text("${inputBoxText}") - x11.succeed(as_user("ydotool type '${textInput}'")) # text input - x11.screenshot("x11_input") - x11.succeed(as_user("ydotool mousemove -a 400 110")) # mouse input - x11.succeed(as_user("ydotool click 0xC0")) # mouse input - x11.wait_for_file("/tmp/output") - x11.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input - - # Wayland - wayland.wait_for_unit("graphical.target") - wayland.wait_for_text("${inputBoxText}") - wayland.succeed("ydotool type '${textInput}'") # text input - wayland.screenshot("wayland_input") - wayland.succeed("ydotool mousemove -a 100 100") # mouse input - wayland.succeed("ydotool click 0xC0") # mouse input - wayland.wait_for_file("/tmp/output") - wayland.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input + # Wait for service to start + ${nodeName}.wait_for_unit("multi-user.target") + ${nodeName}.wait_for_unit("ydotoold.service") + + # Verify that user with the configured group can use the service + ${nodeName}.succeed("sudo --login --user=${insideGroupUsername} ydotool type 'Hello, World!'") + + # Verify that user without the configured group can't use the service + ${nodeName}.fail("sudo --login --user=${outsideGroupUsername} ydotool type 'Hello, World!'") ''; - } -) + + meta.maintainers = with lib.maintainers; [ l0b0 ]; + }; +} |