From fa5d67862cc71b3961efc0cee43894dd1f42fe89 Mon Sep 17 00:00:00 2001 From: OPNA2608 Date: Thu, 8 Aug 2024 01:00:10 +0200 Subject: [PATCH] tests/lomiri: Start splitting into multiple sub-tests Because ARM hardware is starting to have serious issues with completing everything, due to - A seemingly harmless Lomiri crash & restart early on eating up some time (adding more RAM seemed to have helped with that?), and - Every OCR usually taking multiple minutes to complete So start splitting them up into parts - greeter, for testing just the greeter - desktop, for general app stuff - desktop-ayatana-indicators, for checking indicators (OCR-heavy & especially slow) Currently passing on my hardware, but might need to be split up more in the future. --- nixos/tests/lomiri.nix | 172 +++++++++++++++--- .../lomiri/applications/lomiri/default.nix | 4 +- 2 files changed, 154 insertions(+), 22 deletions(-) diff --git a/nixos/tests/lomiri.nix b/nixos/tests/lomiri.nix index f925665f1f9f..5231d7879203 100644 --- a/nixos/tests/lomiri.nix +++ b/nixos/tests/lomiri.nix @@ -6,10 +6,10 @@ let password = "foobar"; in { - desktop = makeTest ( + greeter = makeTest ( { pkgs, lib, ... }: { - name = "lomiri"; + name = "lomiri-greeter"; meta = { maintainers = lib.teams.lomiri.members; @@ -20,12 +20,84 @@ in { imports = [ ./common/user-account.nix ]; + virtualisation.memorySize = 2047; + + users.users.${user} = { + inherit description password; + }; + + services.desktopManager.lomiri.enable = lib.mkForce true; + services.displayManager.defaultSession = lib.mkForce "lomiri"; + + # Help with OCR + fonts.packages = [ pkgs.inconsolata ]; + }; + + enableOCR = true; + + testScript = + { nodes, ... }: + '' + start_all() + machine.wait_for_unit("multi-user.target") + + # Lomiri in greeter mode should work & be able to start a session + with subtest("lomiri greeter works"): + machine.wait_for_unit("display-manager.service") + machine.wait_until_succeeds("pgrep -u lightdm -f 'lomiri --mode=greeter'") + + # Start page shows current time + machine.wait_for_text(r"(AM|PM)") + machine.screenshot("lomiri_greeter_launched") + + # Advance to login part + machine.send_key("ret") + machine.wait_for_text("${description}") + machine.screenshot("lomiri_greeter_login") + + # Login + machine.send_chars("${password}\n") + machine.wait_until_succeeds("pgrep -u ${user} -f 'lomiri --mode=full-shell'") + + # Output rendering from Lomiri has started when it starts printing performance diagnostics + machine.wait_for_console_text("Last frame took") + # Look for datetime's clock, one of the last elements to load + machine.wait_for_text(r"(AM|PM)") + machine.screenshot("lomiri_launched") + ''; + } + ); + + desktop = makeTest ( + { pkgs, lib, ... }: + { + name = "lomiri-desktop"; + + meta = { + maintainers = lib.teams.lomiri.members; + }; + + nodes.machine = + { config, ... }: + { + imports = [ + ./common/auto.nix + ./common/user-account.nix + ]; + + virtualisation.memorySize = 2047; + users.users.${user} = { inherit description password; # polkit agent test extraGroups = [ "wheel" ]; }; + test-support.displayManager.auto = { + enable = true; + inherit user; + }; + # To control mouse via scripting programs.ydotool.enable = true; @@ -174,26 +246,9 @@ in start_all() machine.wait_for_unit("multi-user.target") - # Lomiri in greeter mode should work & be able to start a session - with subtest("lomiri greeter works"): - machine.wait_for_unit("display-manager.service") - machine.wait_until_succeeds("pgrep -u lightdm -f 'lomiri --mode=greeter'") - - # Start page shows current time - machine.wait_for_text(r"(AM|PM)") - machine.screenshot("lomiri_greeter_launched") - - # Advance to login part - machine.send_key("ret") - machine.wait_for_text("${description}") - machine.screenshot("lomiri_greeter_login") - - # Login - machine.send_chars("${password}\n") - machine.wait_until_succeeds("pgrep -u ${user} -f 'lomiri --mode=full-shell'") - # The session should start, and not be stuck in i.e. a crash loop with subtest("lomiri starts"): + machine.wait_until_succeeds("pgrep -u ${user} -f 'lomiri --mode=full-shell'") # Output rendering from Lomiri has started when it starts printing performance diagnostics machine.wait_for_console_text("Last frame took") # Look for datetime's clock, one of the last elements to load @@ -306,6 +361,81 @@ in machine.sleep(2) # sleep a tiny bit so morph can close & the focus can return to LSS machine.send_key("alt-f4") + ''; + } + ); + + desktop-ayatana-indicators = makeTest ( + { pkgs, lib, ... }: + { + name = "lomiri-desktop-ayatana-indicators"; + + meta = { + maintainers = lib.teams.lomiri.members; + }; + + nodes.machine = + { config, ... }: + { + imports = [ + ./common/auto.nix + ./common/user-account.nix + ]; + + virtualisation.memorySize = 2047; + + users.users.${user} = { + inherit description password; + }; + + test-support.displayManager.auto = { + enable = true; + inherit user; + }; + + # To control mouse via scripting + programs.ydotool.enable = true; + + services.desktopManager.lomiri.enable = lib.mkForce true; + services.displayManager.defaultSession = lib.mkForce "lomiri"; + + # Help with OCR + fonts.packages = [ pkgs.inconsolata ]; + }; + + enableOCR = true; + + testScript = + { nodes, ... }: + '' + def mouse_click(xpos, ypos): + """ + Move the mouse to a screen location and hit left-click. + """ + + # Need to reset to top-left, --absolute doesn't work? + machine.execute("ydotool mousemove -- -10000 -10000") + machine.sleep(2) + + # Move + machine.execute(f"ydotool mousemove -- {xpos} {ypos}") + machine.sleep(2) + + # Click (C0 - left button: down & up) + machine.execute("ydotool click 0xC0") + machine.sleep(2) + + start_all() + machine.wait_for_unit("multi-user.target") + + # The session should start, and not be stuck in i.e. a crash loop + with subtest("lomiri starts"): + machine.wait_until_succeeds("pgrep -u ${user} -f 'lomiri --mode=full-shell'") + # Output rendering from Lomiri has started when it starts printing performance diagnostics + machine.wait_for_console_text("Last frame took") + # Look for datetime's clock, one of the last elements to load + machine.wait_for_text(r"(AM|PM)") + machine.screenshot("lomiri_launched") # The ayatana indicators are an important part of the experience, and they hold the only graphical way of exiting the session. # There's a test app we could use that also displays their contents, but it's abit inconsistent. @@ -357,8 +487,8 @@ in mouse_click(720, 280) # "Log Out" mouse_click(400, 240) # confirm logout machine.wait_until_fails("pgrep -u ${user} -f 'lomiri --mode=full-shell'") - machine.wait_until_succeeds("pgrep -u lightdm -f 'lomiri --mode=greeter'") ''; } ); + } diff --git a/pkgs/desktops/lomiri/applications/lomiri/default.nix b/pkgs/desktops/lomiri/applications/lomiri/default.nix index cd2d9eeed7db..a1f8803a4f36 100644 --- a/pkgs/desktops/lomiri/applications/lomiri/default.nix +++ b/pkgs/desktops/lomiri/applications/lomiri/default.nix @@ -262,7 +262,9 @@ stdenv.mkDerivation (finalAttrs: { ''; passthru = { - tests.lomiri = nixosTests.lomiri; + tests = { + inherit (nixosTests.lomiri) greeter desktop desktop-ayatana-indicators; + }; updateScript = gitUpdater { }; greeter = linkFarm "lomiri-greeter" [ {