1# Mutable users tests.
2
3import ./make-test-python.nix ({ pkgs, ...} : {
4 name = "mutable-users";
5 meta = with pkgs.lib.maintainers; {
6 maintainers = [ gleber ];
7 };
8
9 nodes = {
10 machine = { ... }: {
11 users.mutableUsers = false;
12 };
13 mutable = { ... }: {
14 users.mutableUsers = true;
15 users.users.dry-test.isNormalUser = true;
16 };
17 };
18
19 testScript = {nodes, ...}: let
20 immutableSystem = nodes.machine.config.system.build.toplevel;
21 mutableSystem = nodes.mutable.config.system.build.toplevel;
22 in ''
23 machine.start()
24 machine.wait_for_unit("default.target")
25
26 # Machine starts in immutable mode. Add a user and test if reactivating
27 # configuration removes the user.
28 with subtest("Machine in immutable mode"):
29 assert "foobar" not in machine.succeed("cat /etc/passwd")
30 machine.succeed("sudo useradd foobar")
31 assert "foobar" in machine.succeed("cat /etc/passwd")
32 machine.succeed(
33 "${immutableSystem}/bin/switch-to-configuration test"
34 )
35 assert "foobar" not in machine.succeed("cat /etc/passwd")
36
37 # In immutable mode passwd is not wrapped, while in mutable mode it is
38 # wrapped.
39 with subtest("Password is wrapped in mutable mode"):
40 assert "/run/current-system/" in machine.succeed("which passwd")
41 machine.succeed(
42 "${mutableSystem}/bin/switch-to-configuration test"
43 )
44 assert "/run/wrappers/" in machine.succeed("which passwd")
45
46 with subtest("dry-activation does not change files"):
47 machine.succeed('test -e /home/dry-test') # home was created
48 machine.succeed('rm -rf /home/dry-test')
49
50 files_to_check = ['/etc/group',
51 '/etc/passwd',
52 '/etc/shadow',
53 '/etc/subuid',
54 '/etc/subgid',
55 '/var/lib/nixos/uid-map',
56 '/var/lib/nixos/gid-map',
57 '/var/lib/nixos/declarative-groups',
58 '/var/lib/nixos/declarative-users'
59 ]
60 expected_hashes = {}
61 expected_stats = {}
62 for file in files_to_check:
63 expected_hashes[file] = machine.succeed(f"sha256sum {file}")
64 expected_stats[file] = machine.succeed(f"stat {file}")
65
66 machine.succeed("/run/current-system/bin/switch-to-configuration dry-activate")
67
68 machine.fail('test -e /home/dry-test') # home was not recreated
69 for file in files_to_check:
70 assert machine.succeed(f"sha256sum {file}") == expected_hashes[file]
71 assert machine.succeed(f"stat {file}") == expected_stats[file]
72 '';
73})