diff --git a/nixos/release.nix b/nixos/release.nix
index ddb0b495a91..83594629226 100644
--- a/nixos/release.nix
+++ b/nixos/release.nix
@@ -236,6 +236,7 @@ in rec {
tests.avahi = callTest tests/avahi.nix {};
tests.bittorrent = callTest tests/bittorrent.nix {};
tests.blivet = callTest tests/blivet.nix {};
+ tests.chromium = callTest tests/chromium.nix {};
tests.cjdns = callTest tests/cjdns.nix {};
tests.containers = callTest tests/containers.nix {};
tests.firefox = callTest tests/firefox.nix {};
diff --git a/nixos/tests/chromium.nix b/nixos/tests/chromium.nix
new file mode 100644
index 00000000000..71fa1e5268f
--- /dev/null
+++ b/nixos/tests/chromium.nix
@@ -0,0 +1,157 @@
+import ./make-test.nix ({ pkgs, ... }: rec {
+ name = "chromium";
+
+ machine.imports = [ ./common/x11.nix ];
+
+ startupHTML = pkgs.writeText "chromium-startup.html" ''
+
+
+
+
+ Chromium startup notifier
+
+
+
+
+
+ '';
+
+ testScript = let
+ xdo = name: text: let
+ xdoScript = pkgs.writeText "${name}.xdo" text;
+ in "${pkgs.xdotool}/bin/xdotool '${xdoScript}'";
+ in ''
+ sub createNewWin {
+ $machine->nest("creating a new Chromium window", sub {
+ $machine->execute("${xdo "new-window" ''
+ search --onlyvisible --name "startup done"
+ windowfocus --sync
+ windowactivate --sync
+ key Ctrl+n
+ ''}");
+ });
+ }
+
+ sub closeWin {
+ Machine::retry sub {
+ $machine->execute("${xdo "close-window" ''
+ search --onlyvisible --name "new tab"
+ windowfocus --sync
+ windowactivate --sync
+ key Ctrl+w
+ ''}");
+ for (1..20) {
+ my ($status, $out) = $machine->execute("${xdo "wait-for-close" ''
+ search --onlyvisible --name "new tab"
+ ''}");
+ return 1 if $status != 0;
+ $machine->sleep(1);
+ }
+ }
+ }
+
+ sub waitForNewWin {
+ my $ret = 0;
+ $machine->nest("waiting for new Chromium window to appear", sub {
+ for (1..20) {
+ my ($status, $out) = $machine->execute("${xdo "wait-for-window" ''
+ search --onlyvisible --name "new tab"
+ windowfocus --sync
+ windowactivate --sync
+ ''}");
+ if ($status == 0) {
+ $ret = 1;
+ last;
+ }
+ $machine->sleep(1);
+ }
+ });
+ return $ret;
+ }
+
+ sub createAndWaitForNewWin {
+ for (1..3) {
+ createNewWin;
+ return 1 if waitForNewWin;
+ }
+ die "new window didn't appear within 60 seconds";
+ }
+
+ sub testNewWin {
+ my ($desc, $code) = @_;
+ createAndWaitForNewWin;
+ subtest($desc, $code);
+ closeWin;
+ }
+
+ sub chromiumTest {
+ my ($channel, $pkg, $code) = @_;
+ $machine->waitForX;
+
+ my $url = "file://${startupHTML}";
+ my $args = "--user-data-dir=/tmp/chromium-$channel";
+ $machine->execute(
+ "ulimit -c unlimited; ".
+ "$pkg/bin/chromium $args \"$url\" & disown"
+ );
+ $machine->waitUntilSucceeds("${xdo "check-startup" ''
+ search --sync --onlyvisible --name "startup done"
+ # close first start help popup
+ key Escape
+ windowfocus --sync
+ windowactivate --sync
+ ''}");
+
+ createAndWaitForNewWin;
+ $machine->screenshot($channel."_emptywin");
+ closeWin;
+
+ $machine->screenshot($channel."_startup_done");
+
+ subtest("Chromium $channel", $code);
+
+ $machine->shutdown;
+ }
+
+ for (
+ ["stable", "${pkgs.chromium}"],
+ ["beta", "${pkgs.chromiumBeta}"],
+ ["dev", "${pkgs.chromiumDev}"]
+ ) {
+ my ($channel, $pkg) = @$_;
+ chromiumTest $channel, $pkg, sub {
+ testNewWin "check sandbox", sub {
+ $machine->succeed("${xdo "type-url" ''
+ search --sync --onlyvisible --name "new tab"
+ windowfocus --sync
+ type --delay 1000 "chrome://sandbox"
+ ''}");
+
+ $machine->succeed("${xdo "submit-url" ''
+ search --sync --onlyvisible --name "new tab"
+ windowfocus --sync
+ key --delay 1000 Return
+ ''}");
+
+ $machine->screenshot($channel."_sandbox");
+
+ $machine->succeed("${xdo "submit-url" ''
+ search --sync --onlyvisible --name "sandbox status"
+ windowfocus --sync
+ key --delay 1000 Ctrl+a Ctrl+c
+ ''}");
+
+ my $clipboard = $machine->succeed("${pkgs.xclip}/bin/xclip -o");
+ die "sandbox not working properly: $clipboard"
+ unless $clipboard =~ /suid sandbox.*yes/mi
+ && $clipboard =~ /pid namespaces.*yes/mi
+ && $clipboard =~ /network namespaces.*yes/mi
+ && $clipboard =~ /seccomp.*sandbox.*yes/mi;
+ };
+ };
+ }
+ '';
+})