summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorSarah Brofeldt <sbrofeldt@gmail.com>2018-04-24 11:49:53 +0200
committerGitHub <noreply@github.com>2018-04-24 11:49:53 +0200
commit65abd2e63f1f2888202018977c43e6efdc7175e4 (patch)
tree3f2b31cf577c912da35c9067122f2bab8a2b7e76 /nixos
parent023543ca9c8e30ce38461ac5f72aa1179f2ca841 (diff)
parent84a6e18947fe961e97173f031318cd6111a43949 (diff)
downloadnixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar.gz
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar.bz2
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar.lz
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar.xz
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.tar.zst
nixpkgs-65abd2e63f1f2888202018977c43e6efdc7175e4.zip
Merge pull request #39400 from xeji/improve-keymap-tests
nixos/tests/keymap: improve keymap tests
Diffstat (limited to 'nixos')
-rw-r--r--nixos/tests/keymap.nix96
1 files changed, 43 insertions, 53 deletions
diff --git a/nixos/tests/keymap.nix b/nixos/tests/keymap.nix
index caa5f7107c2..abff90d5047 100644
--- a/nixos/tests/keymap.nix
+++ b/nixos/tests/keymap.nix
@@ -3,46 +3,34 @@
 with import ../lib/testing.nix { inherit system; };
 
 let
+  readyFile  = "/tmp/readerReady";
+  resultFile = "/tmp/readerResult";
+
   testReader = pkgs.writeScript "test-input-reader" ''
     #!${pkgs.stdenv.shell}
-    readInput() {
-      touch /tmp/reader.ready
-      echo "Waiting for '$1' to be typed"
-      read -r -n1 c
-      if [ "$c" = "$2" ]; then
-        echo "SUCCESS: Got back '$c' as expected."
-        echo 0 >&2
-      else
-        echo "FAIL: Expected '$2' but got '$c' instead."
-        echo 1 >&2
-      fi
-    }
-
-    main() {
-      error=0
-      while [ $# -gt 0 ]; do
-        ret="$((readInput "$2" "$3" | systemd-cat -t "$1") 2>&1)"
-        if [ $ret -ne 0 ]; then error=1; fi
-        shift 3
-      done
-      return $error
-    }
-
-    main "$@"; echo -n $? > /tmp/reader.exit
+    rm -f ${resultFile}
+    logger "testReader: START: Waiting for $1 characters, expecting '$2'."
+    touch ${readyFile}
+    read -r -N $1 chars
+    rm -f ${readyFile}
+
+    if [ "$chars" == "$2" ]; then
+      logger -s "testReader: PASS: Got '$2' as expected." 2>${resultFile}
+    else
+      logger -s "testReader: FAIL: Expected '$2' but got '$chars'." 2>${resultFile}
+    fi
   '';
 
-  mkReaderInput = testname: { qwerty, expect }: with pkgs.lib; let
-    lq = length qwerty;
-    le = length expect;
-    msg = "`qwerty' (${lq}) and `expect' (${le}) lists"
-        + " need to be of the same length!";
-    result = flatten (zipListsWith (a: b: [testname a b]) qwerty expect);
-  in if lq != le then throw msg else result;
 
   mkKeyboardTest = layout: { extraConfig ? {}, tests }: with pkgs.lib; let
-    readerInput = flatten (mapAttrsToList mkReaderInput tests);
+    combinedTests = foldAttrs (acc: val: acc ++ val) [] (builtins.attrValues tests);
     perlStr = val: "'${escape ["'" "\\"] val}'";
-    perlReaderInput = concatMapStringsSep ", " perlStr readerInput;
+    lq = length combinedTests.qwerty;
+    le = length combinedTests.expect;
+    msg = "length mismatch between qwerty (${toString lq}) and expect (${toString le}) lists!";
+    send   = concatMapStringsSep ", " perlStr combinedTests.qwerty;
+    expect = if (lq == le) then concatStrings combinedTests.expect else throw msg;
+
   in makeTest {
     name = "keymap-${layout}";
 
@@ -50,38 +38,40 @@ let
     machine.i18n.consoleKeyMap = mkOverride 900 layout;
     machine.services.xserver.layout = mkOverride 900 layout;
     machine.imports = [ ./common/x11.nix extraConfig ];
-    machine.services.xserver.displayManager.slim.enable = true;
 
     testScript = ''
-      sub waitCatAndDelete ($) {
-        return $machine->succeed(
-          "for i in \$(seq 600); do if [ -e '$_[0]' ]; then ".
-          "cat '$_[0]' && rm -f '$_[0]' && exit 0; ".
-          "fi; sleep 0.1; done; echo timed out after 60 seconds >&2; exit 1"
-        );
-      };
 
       sub mkTest ($$) {
         my ($desc, $cmd) = @_;
 
-        my @testdata = (${perlReaderInput});
-        my $shellTestdata = join ' ', map { "'".s/'/'\\'''/gr."'" } @testdata;
-
         subtest $desc, sub {
-          $machine->succeed("$cmd ${testReader} $shellTestdata &");
-          while (my ($testname, $qwerty, $expect) = splice(@testdata, 0, 3)) {
-            waitCatAndDelete "/tmp/reader.ready";
-            $machine->sendKeys($qwerty);
-          };
-          my $exitcode = waitCatAndDelete "/tmp/reader.exit";
-          die "tests for $desc failed" if $exitcode ne 0;
+          # prepare and start testReader
+          $machine->execute("rm -f ${readyFile} ${resultFile}");
+          $machine->succeed("$cmd ${testReader} ${toString le} ".q(${escapeShellArg expect} & ));
+
+          if ($desc eq "Xorg keymap") {
+            # make sure the xterm window is open and has focus
+            $machine->waitForWindow(qr/testterm/);
+            $machine->succeed("${pkgs.xdotool}/bin/xdotool search --name testterm windowactivate --sync");
+          }
+
+          # wait for reader to be ready
+          $machine->waitForFile("${readyFile}");
+          $machine->sleep(1);
+
+          # send all keys
+          foreach ((${send})) { $machine->sendKeys($_); };
+
+          # wait for result and check
+          $machine->waitForFile("${resultFile}");
+          $machine->succeed("grep -q 'PASS:' ${resultFile}");
         };
-      }
+      };
 
       $machine->waitForX;
 
       mkTest "VT keymap", "openvt -sw --";
-      mkTest "Xorg keymap", "DISPLAY=:0 xterm -fullscreen -e";
+      mkTest "Xorg keymap", "DISPLAY=:0 xterm -title testterm -fullscreen -e";
     '';
   };