Skip to content

Commit 1539732

Browse files
committed
shadow: Add test
1 parent 0597dcb commit 1539732

3 files changed

Lines changed: 102 additions & 2 deletions

File tree

nixos/tests/all-tests.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ in
340340
scala = handleTest ./scala.nix {};
341341
sddm = handleTest ./sddm.nix {};
342342
service-runner = handleTest ./service-runner.nix {};
343+
shadow = handleTest ./shadow.nix {};
343344
shadowsocks = handleTest ./shadowsocks {};
344345
shattered-pixel-dungeon = handleTest ./shattered-pixel-dungeon.nix {};
345346
shiori = handleTest ./shiori.nix {};

nixos/tests/shadow.nix

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
let
2+
password1 = "foobar";
3+
password2 = "helloworld";
4+
password3 = "bazqux";
5+
in import ./make-test-python.nix ({ pkgs, ... }: {
6+
name = "shadow";
7+
meta = with pkgs.stdenv.lib.maintainers; { maintainers = [ nequissimus ]; };
8+
9+
nodes.shadow = { pkgs, ... }: {
10+
environment.systemPackages = [ pkgs.shadow ];
11+
12+
users = {
13+
mutableUsers = true;
14+
users.emma = {
15+
password = password1;
16+
shell = pkgs.bash;
17+
};
18+
users.layla = {
19+
password = password2;
20+
shell = pkgs.shadow;
21+
};
22+
};
23+
};
24+
25+
testScript = ''
26+
shadow.wait_for_unit("multi-user.target")
27+
shadow.wait_until_succeeds("pgrep -f 'agetty.*tty1'")
28+
29+
with subtest("Normal login"):
30+
shadow.send_key("alt-f2")
31+
shadow.wait_until_succeeds(f"[ $(fgconsole) = 2 ]")
32+
shadow.wait_for_unit(f"getty@tty2.service")
33+
shadow.wait_until_succeeds(f"pgrep -f 'agetty.*tty2'")
34+
shadow.wait_until_tty_matches(2, "login: ")
35+
shadow.send_chars("emma\n")
36+
shadow.wait_until_tty_matches(2, "login: emma")
37+
shadow.wait_until_succeeds("pgrep login")
38+
shadow.send_chars("${password1}\n")
39+
shadow.send_chars("whoami > /tmp/1\n")
40+
shadow.wait_for_file("/tmp/1")
41+
assert "emma" in shadow.succeed("cat /tmp/1")
42+
43+
with subtest("Change password"):
44+
shadow.send_key("alt-f3")
45+
shadow.wait_until_succeeds(f"[ $(fgconsole) = 3 ]")
46+
shadow.wait_for_unit(f"getty@tty3.service")
47+
shadow.wait_until_succeeds(f"pgrep -f 'agetty.*tty3'")
48+
shadow.wait_until_tty_matches(3, "login: ")
49+
shadow.send_chars("emma\n")
50+
shadow.wait_until_tty_matches(3, "login: emma")
51+
shadow.wait_until_succeeds("pgrep login")
52+
shadow.send_chars("${password1}\n")
53+
shadow.send_chars("passwd\n")
54+
shadow.sleep(2)
55+
shadow.send_chars("${password1}\n")
56+
shadow.sleep(2)
57+
shadow.send_chars("${password3}\n")
58+
shadow.sleep(2)
59+
shadow.send_chars("${password3}\n")
60+
shadow.sleep(2)
61+
shadow.send_key("alt-f4")
62+
shadow.wait_until_succeeds(f"[ $(fgconsole) = 4 ]")
63+
shadow.wait_for_unit(f"getty@tty4.service")
64+
shadow.wait_until_succeeds(f"pgrep -f 'agetty.*tty4'")
65+
shadow.wait_until_tty_matches(4, "login: ")
66+
shadow.send_chars("emma\n")
67+
shadow.wait_until_tty_matches(4, "login: emma")
68+
shadow.wait_until_succeeds("pgrep login")
69+
shadow.send_chars("${password1}\n")
70+
shadow.wait_until_tty_matches(4, "Login incorrect")
71+
shadow.wait_until_tty_matches(4, "login:")
72+
shadow.send_chars("emma\n")
73+
shadow.wait_until_tty_matches(4, "login: emma")
74+
shadow.wait_until_succeeds("pgrep login")
75+
shadow.send_chars("${password3}\n")
76+
shadow.send_chars("whoami > /tmp/2\n")
77+
shadow.wait_for_file("/tmp/2")
78+
assert "emma" in shadow.succeed("cat /tmp/2")
79+
80+
with subtest("Groups"):
81+
assert "foobar" not in shadow.succeed("groups emma")
82+
shadow.succeed("groupadd foobar")
83+
shadow.succeed("usermod -a -G foobar emma")
84+
assert "foobar" in shadow.succeed("groups emma")
85+
86+
with subtest("nologin shell"):
87+
shadow.send_key("alt-f5")
88+
shadow.wait_until_succeeds(f"[ $(fgconsole) = 5 ]")
89+
shadow.wait_for_unit(f"getty@tty5.service")
90+
shadow.wait_until_succeeds(f"pgrep -f 'agetty.*tty5'")
91+
shadow.wait_until_tty_matches(5, "login: ")
92+
shadow.send_chars("layla\n")
93+
shadow.wait_until_tty_matches(5, "login: layla")
94+
shadow.wait_until_succeeds("pgrep login")
95+
shadow.send_chars("${password2}\n")
96+
shadow.wait_until_tty_matches(5, "login:")
97+
'';
98+
})

pkgs/os-specific/linux/shadow/default.nix

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{ stdenv, fetchpatch, fetchFromGitHub, autoreconfHook, libxslt, libxml2
2-
, docbook_xml_dtd_45, docbook_xsl, itstool, flex, bison
1+
{ stdenv, nixosTests, fetchpatch, fetchFromGitHub, autoreconfHook, libxslt
2+
, libxml2 , docbook_xml_dtd_45, docbook_xsl, itstool, flex, bison
33
, pam ? null, glibcCross ? null
44
}:
55

@@ -86,5 +86,6 @@ stdenv.mkDerivation rec {
8686

8787
passthru = {
8888
shellPath = "/bin/nologin";
89+
tests = { inherit (nixosTests) shadow; };
8990
};
9091
}

0 commit comments

Comments
 (0)