at 17.09-beta 4.9 kB view raw
1{ system ? builtins.currentSystem 2, pkgs ? import ../.. { inherit system; } 3, channelMap ? { 4 stable = pkgs.chromium; 5 beta = pkgs.chromiumBeta; 6 dev = pkgs.chromiumDev; 7 } 8}: 9 10with import ../lib/testing.nix { inherit system; }; 11with pkgs.lib; 12 13mapAttrs (channel: chromiumPkg: makeTest rec { 14 name = "chromium-${channel}"; 15 meta = with pkgs.stdenv.lib.maintainers; { 16 maintainers = [ aszlig ]; 17 }; 18 19 enableOCR = true; 20 21 machine.imports = [ ./common/user-account.nix ./common/x11.nix ]; 22 machine.virtualisation.memorySize = 2047; 23 machine.services.xserver.displayManager.auto.user = "alice"; 24 machine.environment.systemPackages = [ chromiumPkg ]; 25 26 startupHTML = pkgs.writeText "chromium-startup.html" '' 27 <!DOCTYPE html> 28 <html> 29 <head> 30 <meta charset="UTF-8"> 31 <title>Chromium startup notifier</title> 32 </head> 33 <body onload="javascript:document.title='startup done'"> 34 <img src="file://${pkgs.fetchurl { 35 url = "http://nixos.org/logo/nixos-hex.svg"; 36 sha256 = "0wxpp65npdw2cg8m0cxc9qff1sb3b478cxpg1741d8951g948rg8"; 37 }}" /> 38 </body> 39 </html> 40 ''; 41 42 testScript = let 43 xdo = name: text: let 44 xdoScript = pkgs.writeText "${name}.xdo" text; 45 in "${pkgs.xdotool}/bin/xdotool '${xdoScript}'"; 46 in '' 47 # Run as user alice 48 sub ru ($) { 49 my $esc = $_[0] =~ s/'/'\\${"'"}'/gr; 50 return "su - alice -c '$esc'"; 51 } 52 53 sub createNewWin { 54 $machine->nest("creating a new Chromium window", sub { 55 $machine->execute(ru "${xdo "new-window" '' 56 search --onlyvisible --name "startup done" 57 windowfocus --sync 58 windowactivate --sync 59 ''}"); 60 $machine->execute(ru "${xdo "new-window" '' 61 key Ctrl+n 62 ''}"); 63 }); 64 } 65 66 sub closeWin { 67 Machine::retry sub { 68 $machine->execute(ru "${xdo "close-window" '' 69 search --onlyvisible --name "new tab" 70 windowfocus --sync 71 windowactivate --sync 72 ''}"); 73 $machine->execute(ru "${xdo "close-window" '' 74 key Ctrl+w 75 ''}"); 76 for (1..20) { 77 my ($status, $out) = $machine->execute(ru "${xdo "wait-for-close" '' 78 search --onlyvisible --name "new tab" 79 ''}"); 80 return 1 if $status != 0; 81 $machine->sleep(1); 82 } 83 } 84 } 85 86 sub waitForNewWin { 87 my $ret = 0; 88 $machine->nest("waiting for new Chromium window to appear", sub { 89 for (1..20) { 90 my ($status, $out) = $machine->execute(ru "${xdo "wait-for-window" '' 91 search --onlyvisible --name "new tab" 92 windowfocus --sync 93 windowactivate --sync 94 ''}"); 95 if ($status == 0) { 96 $ret = 1; 97 last; 98 } 99 $machine->sleep(1); 100 } 101 }); 102 return $ret; 103 } 104 105 sub createAndWaitForNewWin { 106 for (1..3) { 107 createNewWin; 108 return 1 if waitForNewWin; 109 } 110 die "new window didn't appear within 60 seconds"; 111 } 112 113 sub testNewWin { 114 my ($desc, $code) = @_; 115 createAndWaitForNewWin; 116 subtest($desc, $code); 117 closeWin; 118 } 119 120 $machine->waitForX; 121 122 my $url = "file://${startupHTML}"; 123 $machine->execute(ru "ulimit -c unlimited; chromium \"$url\" & disown"); 124 $machine->waitForText(qr/startup done/); 125 $machine->waitUntilSucceeds(ru "${xdo "check-startup" '' 126 search --sync --onlyvisible --name "startup done" 127 # close first start help popup 128 key -delay 1000 Escape 129 windowfocus --sync 130 windowactivate --sync 131 ''}"); 132 133 createAndWaitForNewWin; 134 $machine->screenshot("empty_windows"); 135 closeWin; 136 137 $machine->screenshot("startup_done"); 138 139 testNewWin "check sandbox", sub { 140 $machine->succeed(ru "${xdo "type-url" '' 141 search --sync --onlyvisible --name "new tab" 142 windowfocus --sync 143 type --delay 1000 "chrome://sandbox" 144 ''}"); 145 146 $machine->succeed(ru "${xdo "submit-url" '' 147 search --sync --onlyvisible --name "new tab" 148 windowfocus --sync 149 key --delay 1000 Return 150 ''}"); 151 152 $machine->screenshot("sandbox_info"); 153 154 $machine->succeed(ru "${xdo "submit-url" '' 155 search --sync --onlyvisible --name "sandbox status" 156 windowfocus --sync 157 ''}"); 158 $machine->succeed(ru "${xdo "submit-url" '' 159 key --delay 1000 Ctrl+a Ctrl+c 160 ''}"); 161 162 my $clipboard = $machine->succeed(ru "${pkgs.xclip}/bin/xclip -o"); 163 die "sandbox not working properly: $clipboard" 164 unless $clipboard =~ /namespace sandbox.*yes/mi 165 && $clipboard =~ /pid namespaces.*yes/mi 166 && $clipboard =~ /network namespaces.*yes/mi 167 && $clipboard =~ /seccomp.*sandbox.*yes/mi 168 && $clipboard =~ /you are adequately sandboxed/mi; 169 }; 170 171 $machine->shutdown; 172 ''; 173}) channelMap