From 8c52061b1fce2036b70836e5dcdfcf4b702dd405 Mon Sep 17 00:00:00 2001 From: Michael Weiss Date: Fri, 9 Jul 2021 19:04:04 +0200 Subject: [PATCH 1/2] nixos/tests/chromium: Refactor launching the browser process It should now be more flexible and less error-prone. --- nixos/tests/chromium.nix | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/nixos/tests/chromium.nix b/nixos/tests/chromium.nix index c17d1953894c..06d92cd0c037 100644 --- a/nixos/tests/chromium.nix +++ b/nixos/tests/chromium.nix @@ -63,8 +63,8 @@ mapAttrs (channel: chromiumPkg: makeTest rec { return "su - ${user} -c " + shlex.quote(cmd) - def get_browser_call(): - """Returns the name of the browser binary as well as CLI options.""" + def launch_browser(): + """Launches the web browser with the correct options.""" # Determine the name of the binary: pname = "${getName chromiumPkg.name}" if pname.find("chromium") != -1: @@ -76,12 +76,19 @@ mapAttrs (channel: chromiumPkg: makeTest rec { else: # For google-chrome-beta and as fallback: binary = pname # Add optional CLI options: - options = "" + options = [] major_version = "${versions.major (getVersion chromiumPkg.name)}" if major_version > "91": # To avoid a GPU crash: - options += "--use-gl=angle --use-angle=swiftshader" - return f"{binary} {options}" + options += ["--use-gl=angle", "--use-angle=swiftshader"] + options.append("file://${startupHTML}") + # Launch the process: + machine.succeed(ru(f'ulimit -c unlimited; {binary} {shlex.join(options)} & disown')) + if binary.startswith("google-chrome"): + # Need to click away the first window: + machine.wait_for_text("Make Google Chrome the default browser") + machine.screenshot("google_chrome_default_browser_prompt") + machine.send_key("ret") def create_new_win(): @@ -142,14 +149,7 @@ mapAttrs (channel: chromiumPkg: makeTest rec { machine.wait_for_x() - url = "file://${startupHTML}" - machine.succeed(ru(f'ulimit -c unlimited; {get_browser_call()} "{url}" & disown')) - - if get_browser_call().startswith("google-chrome"): - # Need to click away the first window: - machine.wait_for_text("Make Google Chrome the default browser") - machine.screenshot("google_chrome_default_browser_prompt") - machine.send_key("ret") + launch_browser() machine.wait_for_text("startup done") machine.wait_until_succeeds( From c33015a0c94777261ef054a3d7dacd53e744ceea Mon Sep 17 00:00:00 2001 From: Michael Weiss Date: Sat, 10 Jul 2021 10:25:38 +0200 Subject: [PATCH 2/2] nixos/tests/chromium: Print the content of chrome://{sandbox,gpu} This can be very useful when running the test headless or e.g. when looking at Hydra logs. Especially the chrome://gpu content contains a lot of interesting information. I also decided to refactor the test_new_win() function to avoid duplicate code and rely less on xdo. --- nixos/tests/chromium.nix | 73 +++++++++++++++------------------------- 1 file changed, 27 insertions(+), 46 deletions(-) diff --git a/nixos/tests/chromium.nix b/nixos/tests/chromium.nix index 06d92cd0c037..d2a8f276f120 100644 --- a/nixos/tests/chromium.nix +++ b/nixos/tests/chromium.nix @@ -30,7 +30,10 @@ mapAttrs (channel: chromiumPkg: makeTest rec { machine.imports = [ ./common/user-account.nix ./common/x11.nix ]; machine.virtualisation.memorySize = 2047; machine.test-support.displayManager.auto.user = user; - machine.environment.systemPackages = [ chromiumPkg ]; + machine.environment = { + systemPackages = [ chromiumPkg ]; + variables."XAUTHORITY" = "/home/alice/.Xauthority"; + }; startupHTML = pkgs.writeText "chromium-startup.html" '' @@ -139,10 +142,25 @@ mapAttrs (channel: chromiumPkg: makeTest rec { @contextmanager - def test_new_win(description): + def test_new_win(description, url, window_name): create_new_win() + machine.wait_for_window("New Tab") + machine.send_chars(f"{url}\n") + machine.wait_for_window(window_name) + machine.screenshot(description) + machine.succeed( + ru( + "${xdo "copy-all" '' + key --delay 1000 Ctrl+a Ctrl+c + ''}" + ) + ) + clipboard = machine.succeed( + ru("${pkgs.xclip}/bin/xclip -o") + ) + print(f"{description} window content:\n{clipboard}") with machine.nested(description): - yield + yield clipboard # Close the newly created window: machine.send_key("ctrl-w") @@ -172,49 +190,7 @@ mapAttrs (channel: chromiumPkg: makeTest rec { machine.screenshot("startup_done") - with test_new_win("check sandbox"): - machine.succeed( - ru( - "${xdo "type-url" '' - search --sync --onlyvisible --name "New Tab" - windowfocus --sync - type --delay 1000 "chrome://sandbox" - ''}" - ) - ) - - machine.succeed( - ru( - "${xdo "submit-url" '' - search --sync --onlyvisible --name "New Tab" - windowfocus --sync - key --delay 1000 Return - ''}" - ) - ) - - machine.screenshot("sandbox_info") - - machine.succeed( - ru( - "${xdo "find-window" '' - search --sync --onlyvisible --name "Sandbox Status" - windowfocus --sync - ''}" - ) - ) - machine.succeed( - ru( - "${xdo "copy-sandbox-info" '' - key --delay 1000 Ctrl+a Ctrl+c - ''}" - ) - ) - - clipboard = machine.succeed( - ru("${pkgs.xclip}/bin/xclip -o") - ) - + with test_new_win("sandbox_info", "chrome://sandbox", "Sandbox Status") as clipboard: filters = [ "layer 1 sandbox.*namespace", "pid namespaces.*yes", @@ -261,6 +237,11 @@ mapAttrs (channel: chromiumPkg: makeTest rec { machine.screenshot("after_copy_from_chromium") + + with test_new_win("gpu_info", "chrome://gpu", "chrome://gpu"): + pass + + machine.shutdown() ''; }) channelMap