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