]>
Commit | Line | Data |
---|---|---|
bd7e6aa7 ZJS |
1 | #!/usr/bin/env bash |
2 | set -e | |
3 | ||
4 | SYSUSERS="${1:-systemd-sysusers}" | |
5 | ||
6 | [ -e "$(dirname $0)/../systemd-runtest.env" ] && . "$(dirname $0)/../systemd-runtest.env" | |
7 | SYSTEMD_TEST_DATA=${SYSTEMD_TEST_DATA:-@SYSTEMD_TEST_DATA@} | |
8 | SOURCE=$SYSTEMD_TEST_DATA/test-sysusers | |
9 | ||
10 | TESTDIR=$(mktemp --tmpdir --directory "test-sysusers.XXXXXXXXXX") | |
11 | trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE | |
12 | ||
13 | prepare_testdir() { | |
14 | mkdir -p $TESTDIR/etc/sysusers.d/ | |
15 | mkdir -p $TESTDIR/usr/lib/sysusers.d/ | |
16 | rm -f $TESTDIR/etc/*{passwd,group,shadow} | |
17 | for i in $1.initial-{passwd,group,shadow}; do | |
18 | test -f $i && cp $i $TESTDIR/etc/${i#*.initial-} | |
19 | done | |
20 | return 0 | |
21 | } | |
22 | ||
aa25270c ZJS |
23 | [ @SYSTEM_UID_MAX@ -lt @SYSTEM_GID_MAX@ ] && system_guid_max=@SYSTEM_UID_MAX@ || system_guid_max=@SYSTEM_GID_MAX@ |
24 | ||
bd7e6aa7 | 25 | preprocess() { |
aa25270c ZJS |
26 | m=${2:-$system_guid_max} |
27 | ||
28 | sed -e "s/SYSTEM_UGID_MAX/$m/g; | |
29 | s#NOLOGIN#@NOLOGIN@#g" "$1" | |
bd7e6aa7 ZJS |
30 | } |
31 | ||
32 | compare() { | |
aa25270c | 33 | if ! diff -u $TESTDIR/etc/passwd <(preprocess $1.expected-passwd $3); then |
044df624 | 34 | echo "**** Unexpected output for $f $2" |
bd7e6aa7 ZJS |
35 | exit 1 |
36 | fi | |
37 | ||
aa25270c | 38 | if ! diff -u $TESTDIR/etc/group <(preprocess $1.expected-group $3); then |
bd7e6aa7 ZJS |
39 | echo "**** Unexpected output for $f $2" |
40 | exit 1 | |
41 | fi | |
42 | } | |
43 | ||
44 | rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* | |
45 | ||
46 | # happy tests | |
69a7c5fb | 47 | for f in $(ls -1 $SOURCE/test-*.input | sort -V); do |
bd7e6aa7 ZJS |
48 | echo "*** Running $f" |
49 | prepare_testdir ${f%.input} | |
50 | cp $f $TESTDIR/usr/lib/sysusers.d/test.conf | |
51 | $SYSUSERS --root=$TESTDIR | |
52 | ||
044df624 | 53 | compare ${f%.*} "" |
bd7e6aa7 ZJS |
54 | done |
55 | ||
69a7c5fb | 56 | for f in $(ls -1 $SOURCE/test-*.input | sort -V); do |
bd7e6aa7 ZJS |
57 | echo "*** Running $f on stdin" |
58 | prepare_testdir ${f%.input} | |
59 | touch $TESTDIR/etc/sysusers.d/test.conf | |
60 | cat $f | $SYSUSERS --root=$TESTDIR - | |
61 | ||
044df624 | 62 | compare ${f%.*} "on stdin" |
bd7e6aa7 ZJS |
63 | done |
64 | ||
69a7c5fb | 65 | for f in $(ls -1 $SOURCE/test-*.input | sort -V); do |
bd7e6aa7 ZJS |
66 | echo "*** Running $f on stdin with --replace" |
67 | prepare_testdir ${f%.input} | |
68 | touch $TESTDIR/etc/sysusers.d/test.conf | |
69 | # this overrides test.conf which is masked on disk | |
70 | cat $f | $SYSUSERS --root=$TESTDIR --replace=/etc/sysusers.d/test.conf - | |
71 | # this should be ignored | |
72 | cat $SOURCE/test-1.input | $SYSUSERS --root=$TESTDIR --replace=/usr/lib/sysusers.d/test.conf - | |
73 | ||
044df624 | 74 | compare ${f%.*} "on stdin with --replace" |
bd7e6aa7 ZJS |
75 | done |
76 | ||
77 | # test --inline | |
78 | echo "*** Testing --inline" | |
044df624 | 79 | prepare_testdir $SOURCE/inline |
bd7e6aa7 ZJS |
80 | # copy a random file to make sure it is ignored |
81 | cp $f $TESTDIR/etc/sysusers.d/confuse.conf | |
82 | $SYSUSERS --root=$TESTDIR --inline \ | |
83 | "u u1 222 - - /bin/zsh" \ | |
84 | "g g1 111" | |
85 | ||
86 | compare $SOURCE/inline "(--inline)" | |
87 | ||
88 | # test --replace | |
89 | echo "*** Testing --inline with --replace" | |
044df624 | 90 | prepare_testdir $SOURCE/inline |
bd7e6aa7 ZJS |
91 | # copy a random file to make sure it is ignored |
92 | cp $f $TESTDIR/etc/sysusers.d/confuse.conf | |
93 | $SYSUSERS --root=$TESTDIR \ | |
94 | --inline \ | |
95 | --replace=/etc/sysusers.d/confuse.conf \ | |
96 | "u u1 222 - - /bin/zsh" \ | |
97 | "g g1 111" | |
98 | ||
99 | compare $SOURCE/inline "(--inline --replace=…)" | |
100 | ||
101 | rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* | |
102 | ||
aa25270c ZJS |
103 | cat >$TESTDIR/etc/login.defs <<EOF |
104 | SYS_UID_MIN abcd | |
105 | SYS_UID_MAX abcd | |
106 | SYS_GID_MIN abcd | |
107 | SYS_GID_MAX abcd | |
108 | SYS_UID_MIN 401 | |
109 | SYS_UID_MAX 555 | |
110 | SYS_GID_MIN 405 | |
111 | SYS_GID_MAX 666 | |
112 | SYS_UID_MIN abcd | |
113 | SYS_UID_MAX abcd | |
114 | SYS_GID_MIN abcd | |
115 | SYS_GID_MAX abcd | |
116 | SYS_UID_MIN999 | |
117 | SYS_UID_MAX999 | |
118 | SYS_GID_MIN999 | |
119 | SYS_GID_MAX999 | |
120 | EOF | |
121 | ||
122 | for f in $(ls -1 $SOURCE/test-*.input | sort -V); do | |
123 | echo "*** Running $f (with login.defs)" | |
124 | prepare_testdir ${f%.input} | |
125 | cp $f $TESTDIR/usr/lib/sysusers.d/test.conf | |
126 | $SYSUSERS --root=$TESTDIR | |
127 | ||
128 | [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max | |
129 | compare ${f%.*} "(with login.defs)" $bound | |
130 | done | |
131 | ||
132 | rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* | |
133 | ||
134 | mv $TESTDIR/etc/login.defs $TESTDIR/etc/login.defs.moved | |
135 | ln -s ../../../../../etc/login.defs.moved $TESTDIR/etc/login.defs | |
136 | ||
137 | for f in $(ls -1 $SOURCE/test-*.input | sort -V); do | |
138 | echo "*** Running $f (with login.defs symlinked)" | |
139 | prepare_testdir ${f%.input} | |
140 | cp $f $TESTDIR/usr/lib/sysusers.d/test.conf | |
141 | $SYSUSERS --root=$TESTDIR | |
142 | ||
143 | [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max | |
144 | compare ${f%.*} "(with login.defs symlinked)" $bound | |
145 | done | |
146 | ||
147 | rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* | |
148 | ||
bd7e6aa7 | 149 | # tests for error conditions |
69a7c5fb | 150 | for f in $(ls -1 $SOURCE/unhappy-*.input | sort -V); do |
bd7e6aa7 ZJS |
151 | echo "*** Running test $f" |
152 | prepare_testdir ${f%.input} | |
153 | cp $f $TESTDIR/usr/lib/sysusers.d/test.conf | |
154 | $SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 > $TESTDIR/err | |
155 | if ! diff -u $TESTDIR/err ${f%.*}.expected-err; then | |
156 | echo "**** Unexpected error output for $f" | |
157 | cat $TESTDIR/err | |
158 | exit 1 | |
159 | fi | |
160 | done |