notes: 2.3.0 -> 2.3.1 (#352950)
[NixPkgs.git] / nixos / tests / keyd.nix
blobbfc4558b64bb4727a4a4bf48b8d7c9de6b495c4f
1 # The test template is taken from the `./keymap.nix`
2 { system ? builtins.currentSystem
3 , config ? { }
4 , pkgs ? import ../.. { inherit system config; }
5 }:
7 with import ../lib/testing-python.nix { inherit system pkgs; };
9 let
10   readyFile = "/tmp/readerReady";
11   resultFile = "/tmp/readerResult";
13   testReader = pkgs.writeScript "test-input-reader" ''
14     rm -f ${resultFile} ${resultFile}.tmp
15     logger "testReader: START: Waiting for $1 characters, expecting '$2'."
16     touch ${readyFile}
17     read -r -N $1 chars
18     rm -f ${readyFile}
19     if [ "$chars" == "$2" ]; then
20       logger -s "testReader: PASS: Got '$2' as expected." 2>${resultFile}.tmp
21     else
22       logger -s "testReader: FAIL: Expected '$2' but got '$chars'." 2>${resultFile}.tmp
23     fi
24     # rename after the file is written to prevent a race condition
25     mv  ${resultFile}.tmp ${resultFile}
26   '';
29   mkKeyboardTest = name: { default, test }: with pkgs.lib; makeTest {
30     inherit name;
32     nodes.machine = {
33       services.keyd = {
34         enable = true;
35         keyboards = { inherit default; };
36       };
37     };
39     testScript = ''
40       import shlex
42       machine.wait_for_unit("keyd.service")
44       def run_test_case(cmd, test_case_name, inputs, expected):
45           with subtest(test_case_name):
46               assert len(inputs) == len(expected)
47               machine.execute("rm -f ${readyFile} ${resultFile}")
48               # set up process that expects all the keys to be entered
49               machine.succeed(
50                   "{} {} {} {} >&2 &".format(
51                       cmd,
52                       "${testReader}",
53                       len(inputs),
54                       shlex.quote("".join(expected)),
55                   )
56               )
57               # wait for reader to be ready
58               machine.wait_for_file("${readyFile}")
59               # send all keys
60               for key in inputs:
61                   machine.send_key(key)
62               # wait for result and check
63               machine.wait_for_file("${resultFile}")
64               machine.succeed("grep -q 'PASS:' ${resultFile}")
65       test = ${builtins.toJSON test}
66       run_test_case("openvt -sw --", "${name}", test["press"], test["expect"])
67     '';
68   };
71 pkgs.lib.mapAttrs mkKeyboardTest {
72   swap-ab_and_ctrl-as-shift = {
73     test.press = [ "a" "ctrl-b" "c" "alt_r-h" ];
74     test.expect = [ "b" "A" "c" "q" ];
76     default = {
77       settings.main = {
78         "a" = "b";
79         "b" = "a";
80         "control" = "oneshot(shift)";
81         "rightalt" = "layer(rightalt)";
82       };
83       extraConfig = ''
84         [rightalt:G]
85         h = q
86       '';
87     };
88   };