diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 9a059c30563c..74fee9c9055b 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -374,6 +374,7 @@ in collectd = runTest ./collectd.nix; commafeed = runTest ./commafeed.nix; connman = runTest ./connman.nix; + console = runTest ./console.nix; console-xkb-and-i18n = runTest ./console-xkb-and-i18n.nix; consul = runTest ./consul.nix; consul-template = runTest ./consul-template.nix; @@ -899,6 +900,7 @@ in llama-swap = runTest ./web-servers/llama-swap.nix; lldap = runTest ./lldap.nix; local-content-share = runTest ./local-content-share.nix; + locale = runTest ./locale.nix; localsend = runTest ./localsend.nix; locate = runTest ./locate.nix; login = runTest ./login.nix; diff --git a/nixos/tests/console.nix b/nixos/tests/console.nix new file mode 100644 index 000000000000..6403eb2bbac4 --- /dev/null +++ b/nixos/tests/console.nix @@ -0,0 +1,72 @@ +{ ... }: +{ + name = "console"; + meta.maintainers = [ ]; + + nodes = + let + # Temporary dirty workaround for nixpkgs/issues/286283 + # Point directly to pkgs.kbd (real files) rather than /etc/kbd/keymaps + # (which goes through consoleEnv's buildEnv and contains only symlinks). + # systemd-localed follows the directory symlink but not individual file + # symlinks inside it, so buildEnv-based paths yield no usable keymaps. + missingKeymapsWorkaround = + { pkgs, ... }: + { + systemd.tmpfiles.rules = [ + "L /usr/share/keymaps - - - - ${pkgs.kbd}/share/keymaps" + ]; + }; + in + { + node_static = + { ... }: + { + imports = [ missingKeymapsWorkaround ]; + console.keyMap = "lt"; + }; + + node_imperative = + { ... }: + { + imports = [ missingKeymapsWorkaround ]; + console.keyMap = "lt"; + i18n.imperativeLocale = true; + }; + }; + + testScript = + { ... }: + '' + node_static.wait_for_unit("dbus.socket") + + with subtest("static - declared keymap is reported by localectl"): + node_static.succeed("localectl status | grep -q 'VC Keymap: lt'") + + with subtest("static - keymap reverts to declared value after reboot"): + # Unlike localectl set-locale, vconsole_write_data() in systemd's + # localed-util.c writes to a hardcoded /etc/vconsole.conf path rather + # than respecting SYSTEMD_ETC_VCONSOLE_CONF, so the set-keymap call + # itself always succeeds. The static guarantee is that NixOS activation + # restores the symlink on reboot, reverting any runtime changes. + node_static.succeed("localectl set-keymap fr") + node_static.succeed("localectl status | grep -q 'VC Keymap: fr'") + node_static.shutdown() + node_static.wait_for_unit("dbus.socket") + node_static.succeed("localectl status | grep -q 'VC Keymap: lt'") + + node_imperative.wait_for_unit("dbus.socket") + + with subtest("imperative - declared keymap is reported by localectl on first boot"): + node_imperative.succeed("localectl status | grep -q 'VC Keymap: lt'") + + with subtest("imperative - localectl set-keymap changes the keymap"): + node_imperative.succeed("localectl set-keymap --no-convert fr") + node_imperative.succeed("localectl status | grep -q 'VC Keymap: fr'") + + with subtest("imperative - keymap change persists across reboot"): + node_imperative.shutdown() + node_imperative.wait_for_unit("dbus.socket") + node_imperative.succeed("localectl status | grep -q 'VC Keymap: fr'") + ''; +} diff --git a/nixos/tests/locale.nix b/nixos/tests/locale.nix new file mode 100644 index 000000000000..6c1ef5e3724f --- /dev/null +++ b/nixos/tests/locale.nix @@ -0,0 +1,53 @@ +{ ... }: +{ + name = "imperative-locale"; + meta.maintainers = [ ]; + + nodes = { + node_static = + { ... }: + { + i18n = { + defaultLocale = "lt_LT.UTF-8"; + extraLocales = [ "en_US.UTF-8/UTF-8" ]; + }; + }; + + node_imperative = + { ... }: + { + i18n = { + defaultLocale = "lt_LT.UTF-8"; + imperativeLocale = true; + extraLocales = [ "en_US.UTF-8/UTF-8" ]; + }; + }; + }; + + testScript = + { ... }: + '' + node_static.wait_for_unit("dbus.socket") + + with subtest("static - declared locale is reported by localectl"): + node_static.succeed("localectl status | grep -q 'System Locale: LANG=lt_LT.UTF-8'") + + with subtest("static - localectl set-locale is blocked"): + node_static.fail("localectl set-locale LANG=en_US.UTF-8") + node_static.succeed("localectl status | grep -q 'System Locale: LANG=lt_LT.UTF-8'") + + node_imperative.wait_for_unit("dbus.socket") + + with subtest("imperative - declared locale is reported by localectl on first boot"): + node_imperative.succeed("localectl status | grep -q 'System Locale: LANG=lt_LT.UTF-8'") + + with subtest("imperative - localectl set-locale changes the locale"): + node_imperative.succeed("localectl set-locale LANG=en_US.UTF-8") + node_imperative.succeed("localectl status | grep -q 'System Locale: LANG=en_US.UTF-8'") + + with subtest("imperative - locale change persists across reboot"): + node_imperative.shutdown() + node_imperative.wait_for_unit("dbus.socket") + node_imperative.succeed("localectl status | grep -q 'System Locale: LANG=en_US.UTF-8'") + ''; +}