mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-15 18:23:09 +00:00
296e7f92cd
The keyd package already exists, but without a systemd service. Keyd requires write access to /var/run to create its socket. Currently the directory it uses can be changed with an environment variable, but the keyd repo state suggests that this may turn into a compile-time option. with that set, and some supplementary groups added, we can run the service under DynamicUser. Co-authored-by: pennae <82953136+pennae@users.noreply.github.com>
83 lines
2.4 KiB
Nix
83 lines
2.4 KiB
Nix
# The test template is taken from the `./keymap.nix`
|
|
{ system ? builtins.currentSystem
|
|
, config ? { }
|
|
, pkgs ? import ../.. { inherit system config; }
|
|
}:
|
|
|
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
|
|
|
let
|
|
readyFile = "/tmp/readerReady";
|
|
resultFile = "/tmp/readerResult";
|
|
|
|
testReader = pkgs.writeScript "test-input-reader" ''
|
|
rm -f ${resultFile} ${resultFile}.tmp
|
|
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}.tmp
|
|
else
|
|
logger -s "testReader: FAIL: Expected '$2' but got '$chars'." 2>${resultFile}.tmp
|
|
fi
|
|
# rename after the file is written to prevent a race condition
|
|
mv ${resultFile}.tmp ${resultFile}
|
|
'';
|
|
|
|
|
|
mkKeyboardTest = name: { settings, test }: with pkgs.lib; makeTest {
|
|
inherit name;
|
|
|
|
nodes.machine = {
|
|
services.keyd = {
|
|
enable = true;
|
|
inherit settings;
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
import shlex
|
|
|
|
machine.wait_for_unit("keyd.service")
|
|
|
|
def run_test_case(cmd, test_case_name, inputs, expected):
|
|
with subtest(test_case_name):
|
|
assert len(inputs) == len(expected)
|
|
machine.execute("rm -f ${readyFile} ${resultFile}")
|
|
# set up process that expects all the keys to be entered
|
|
machine.succeed(
|
|
"{} {} {} {} >&2 &".format(
|
|
cmd,
|
|
"${testReader}",
|
|
len(inputs),
|
|
shlex.quote("".join(expected)),
|
|
)
|
|
)
|
|
# wait for reader to be ready
|
|
machine.wait_for_file("${readyFile}")
|
|
# send all keys
|
|
for key in inputs:
|
|
machine.send_key(key)
|
|
# wait for result and check
|
|
machine.wait_for_file("${resultFile}")
|
|
machine.succeed("grep -q 'PASS:' ${resultFile}")
|
|
test = ${builtins.toJSON test}
|
|
run_test_case("openvt -sw --", "${name}", test["press"], test["expect"])
|
|
'';
|
|
};
|
|
|
|
in
|
|
pkgs.lib.mapAttrs mkKeyboardTest {
|
|
swap-ab_and_ctrl-as-shift = {
|
|
test.press = [ "a" "ctrl-b" "c" ];
|
|
test.expect = [ "b" "A" "c" ];
|
|
|
|
settings.main = {
|
|
"a" = "b";
|
|
"b" = "a";
|
|
"control" = "oneshot(shift)";
|
|
};
|
|
};
|
|
}
|