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}