From d83ad09f1df7fed81ee3e52e4e443ead62ebee3b Mon Sep 17 00:00:00 2001 From: OPNA2608 Date: Wed, 5 Feb 2025 19:33:50 +0100 Subject: [PATCH] nixosTests.lomiri: Split big indicator test into multiple per-indicator ones --- nixos/tests/lomiri.nix | 302 +++++++++++------- .../lomiri/applications/lomiri/default.nix | 10 +- 2 files changed, 183 insertions(+), 129 deletions(-) diff --git a/nixos/tests/lomiri.nix b/nixos/tests/lomiri.nix index 8227da8ef511..e967dac84681 100644 --- a/nixos/tests/lomiri.nix +++ b/nixos/tests/lomiri.nix @@ -160,6 +160,121 @@ let mouse_click(20, 30) ''; + + makeIndicatorTest = + { + name, + left, + ocr, + extraCheck ? null, + + titleOcr, + }: + + makeTest ( + { pkgs, lib, ... }: + { + name = "lomiri-desktop-ayatana-indicator-${name}"; + + 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"; + + # Not setting wallpaper, as it breaks indicator OCR(?) + }; + + enableOCR = true; + + testScript = + { nodes, ... }: + sharedTestFunctions + + '' + 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 + 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. + mouse_click(735, 0) # the cog in the top-right, for the session indicator + wait_for_text(${titleOcr}) + machine.screenshot("indicators_open") + + # Indicator order within the menus *should* be fixed based on per-indicator order setting + # Session is the one we clicked, but it might not be the one we want to test right now. + # Go as far left as necessary. + ${lib.strings.replicate left "machine.send_key(\"left\")\n"} + + with subtest("ayatana indicator session works"): + wait_for_text(r"(${lib.strings.concatStringsSep "|" ocr})") + machine.screenshot("indicator_${name}") + '' + + lib.optionalString (extraCheck != null) extraCheck; + } + ); + + makeIndicatorTests = + { + titles, + details, + }: + let + titleOcr = "r\"(${builtins.concatStringsSep "|" titles})\""; + in + builtins.listToAttrs ( + builtins.map ( + { + name, + left, + ocr, + extraCheck ? null, + }: + { + name = "desktop-ayatana-indicator-${name}"; + value = makeIndicatorTest { + inherit + name + left + ocr + extraCheck + titleOcr + ; + }; + } + ) details + ); in { greeter = makeTest ( @@ -563,126 +678,6 @@ in } ); - 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 ]; - - environment.systemPackages = with pkgs; [ qt5.qttools ]; - - # Not setting wallpaper, as it breaks indicator OCR(?) - }; - - enableOCR = true; - - testScript = - { nodes, ... }: - sharedTestFunctions - + '' - 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 - 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. - with subtest("ayatana indicators work"): - mouse_click(735, 0) # the cog in the top-right, for the session indicator - wait_for_text(r"(Notifications|Rotation|Battery|Sound|Time|Date|System)") - machine.screenshot("indicators_open") - - # Indicator order within the menus *should* be fixed based on per-indicator order setting - # Session is the one we clicked, but the last we should test (logout). Go as far left as we can test. - machine.send_key("left") - machine.send_key("left") - machine.send_key("left") - machine.send_key("left") - machine.send_key("left") - machine.send_key("left") - # Notifications are usually empty, nothing to check there - - with subtest("ayatana indicator display works"): - # We start on this, don't go right - wait_for_text("Lock") - machine.screenshot("indicators_display") - - with subtest("ayatana indicator bluetooth works"): - machine.send_key("right") - wait_for_text("Bluetooth settings") - machine.screenshot("indicators_bluetooth") - - with subtest("lomiri indicator network works"): - machine.send_key("right") - wait_for_text(r"(Flight|Wi-Fi)") - machine.screenshot("indicators_network") - - with subtest("ayatana indicator sound works"): - machine.send_key("right") - wait_for_text(r"(Silent|Volume)") - machine.screenshot("indicators_sound") - - with subtest("ayatana indicator power works"): - machine.send_key("right") - wait_for_text(r"(Charge|Battery settings)") - machine.screenshot("indicators_power") - - with subtest("ayatana indicator datetime works"): - machine.send_key("right") - wait_for_text("Time and Date Settings") - machine.screenshot("indicators_timedate") - - with subtest("ayatana indicator session works"): - machine.send_key("right") - wait_for_text("Log Out") - machine.screenshot("indicators_session") - - # We should be able to log out and return to the greeter - mouse_click(720, 280) # "Log Out" - mouse_click(400, 240) # confirm logout - machine.wait_until_fails("pgrep -u ${user} -f 'lomiri --mode=full-shell'") - ''; - } - ); - keymap = let pwInput = "qwerty"; @@ -803,3 +798,70 @@ in } ); } +// makeIndicatorTests { + titles = [ + "Notifications" # messages + "Rotation" # display + "Battery" # power + "Sound" # sound + "Time" # datetime + "Date" # datetime + "System" # session + ]; + details = [ + # messages normally has no contents + ({ + name = "display"; + left = 6; + ocr = [ "Lock" ]; + }) + ({ + name = "bluetooth"; + left = 5; + ocr = [ "Bluetooth" ]; + }) + ({ + name = "network"; + left = 4; + ocr = [ + "Flight" + "Wi-Fi" + ]; + }) + ({ + name = "sound"; + left = 3; + ocr = [ + "Silent" + "Volume" + ]; + }) + ({ + name = "power"; + left = 2; + ocr = [ + "Charge" + "Battery" + ]; + }) + ({ + name = "datetime"; + left = 1; + ocr = [ + "Time" + "Date" + ]; + }) + ({ + name = "session"; + left = 0; + ocr = [ "Log Out" ]; + extraCheck = '' + # We should be able to log out and return to the greeter + mouse_click(720, 280) # "Log Out" + mouse_click(400, 240) # confirm logout + machine.wait_until_fails("pgrep -u ${user} -f 'lomiri --mode=full-shell'") + ''; + }) + ]; +} diff --git a/pkgs/desktops/lomiri/applications/lomiri/default.nix b/pkgs/desktops/lomiri/applications/lomiri/default.nix index 9f25a3aebc04..31366ae745c1 100644 --- a/pkgs/desktops/lomiri/applications/lomiri/default.nix +++ b/pkgs/desktops/lomiri/applications/lomiri/default.nix @@ -273,15 +273,7 @@ stdenv.mkDerivation (finalAttrs: { passthru = { etcLayoutsFile = "lomiri/keymaps"; - tests = { - inherit (nixosTests.lomiri) - greeter - desktop-basics - desktop-appinteractions - desktop-ayatana-indicators - keymap - ; - }; + tests = nixosTests.lomiri; updateScript = gitUpdater { }; greeter = linkFarm "lomiri-greeter" [ {