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