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