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