2 # SPDX-License-Identifier: LGPL-2.1-or-later
5 SYSUSERS
="${1:-systemd-sysusers}"
7 # shellcheck disable=SC1090
8 [ -e "$(dirname "$0")/../systemd-runtest.env" ] && .
"$(dirname "$0")/../systemd-runtest.env"
9 SYSTEMD_TEST_DATA
=${SYSTEMD_TEST_DATA:-@SYSTEMD_TEST_DATA@}
10 SOURCE
=$SYSTEMD_TEST_DATA/test-sysusers
12 TESTDIR
=$
(mktemp
--tmpdir --directory "test-sysusers.XXXXXXXXXX")
13 # shellcheck disable=SC2064
14 trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE
17 mkdir
-p "$TESTDIR/etc/sysusers.d/"
18 mkdir
-p "$TESTDIR/usr/lib/sysusers.d/"
19 rm -f "$TESTDIR"/etc
/*{passwd
,group
,shadow
}
20 for i
in $1.initial-
{passwd
,group
,shadow
}; do
21 test -f "$i" && cp "$i" "$TESTDIR/etc/${i#*.initial-}"
26 # shellcheck disable=SC2050
27 [ @SYSTEM_UID_MAX@
-lt @SYSTEM_GID_MAX@
] && system_guid_max
=@SYSTEM_UID_MAX@ || system_guid_max
=@SYSTEM_GID_MAX@
30 m
=${2:-$system_guid_max}
32 # shellcheck disable=SC2140
33 sed -e "s/SYSTEM_UGID_MAX/$m/g;
34 s#NOLOGIN#@NOLOGIN@#g" "$1"
38 if ! diff -u "$TESTDIR/etc/passwd" <(preprocess
"$1.expected-passwd" "$3"); then
39 echo >&2 "**** Unexpected output for $f $2"
43 if ! diff -u "$TESTDIR/etc/group" <(preprocess
"$1.expected-group" "$3"); then
44 echo >&2 "**** Unexpected output for $f $2"
49 rm -f "$TESTDIR"/etc
/sysusers.d
/* "$TESTDIR"/usr
/lib
/sysusers.d
/*
52 for f
in $
(find "$SOURCE"/test-
*.input |
sort -V); do
54 prepare_testdir
"${f%.input}"
55 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
56 $SYSUSERS --root="$TESTDIR"
61 for f
in $
(find "$SOURCE"/test-
*.input |
sort -V); do
62 echo "*** Running $f on stdin"
63 prepare_testdir
"${f%.input}"
64 touch "$TESTDIR/etc/sysusers.d/test.conf"
65 $SYSUSERS --root="$TESTDIR" - <"$f"
67 compare
"${f%.*}" "on stdin"
70 for f
in $
(find "$SOURCE"/test-
*.input |
sort -V); do
71 echo "*** Running $f on stdin with --replace"
72 prepare_testdir
"${f%.input}"
73 touch "$TESTDIR/etc/sysusers.d/test.conf"
74 # this overrides test.conf which is masked on disk
75 $SYSUSERS --root="$TESTDIR" --replace=/etc
/sysusers.d
/test.conf
- <"$f"
76 # this should be ignored
77 $SYSUSERS --root="$TESTDIR" --replace=/usr
/lib
/sysusers.d
/test.conf
- <"$SOURCE/test-1.input"
79 compare
"${f%.*}" "on stdin with --replace"
83 echo "*** Testing --inline"
84 prepare_testdir
"$SOURCE/inline"
85 # copy a random file to make sure it is ignored
86 cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
87 $SYSUSERS --root="$TESTDIR" --inline \
88 "u u1 222 - - /bin/zsh" \
91 compare
"$SOURCE/inline" "(--inline)"
94 echo "*** Testing --inline with --replace"
95 prepare_testdir
"$SOURCE/inline"
96 # copy a random file to make sure it is ignored
97 cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
98 $SYSUSERS --root="$TESTDIR" \
100 --replace=/etc
/sysusers.d
/confuse.conf \
101 "u u1 222 - - /bin/zsh" \
104 compare
"$SOURCE/inline" "(--inline --replace=…)"
106 echo "*** Testing --inline with no /etc"
107 rm -rf "${TESTDIR:?}/etc"
108 $SYSUSERS --root="$TESTDIR" --inline \
109 "u u1 222 - - /bin/zsh" \
112 compare
"$SOURCE/inline" "(--inline)"
114 rm -f "$TESTDIR"/etc
/sysusers.d
/* "$TESTDIR"/usr
/lib
/sysusers.d
/*
116 cat >"$TESTDIR/etc/login.defs" <<EOF
135 for f
in $
(find "$SOURCE"/test-
*.input |
sort -V); do
136 echo "*** Running $f (with login.defs)"
137 prepare_testdir
"${f%.input}"
138 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
139 $SYSUSERS --root="$TESTDIR"
141 # shellcheck disable=SC2050
142 [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@
= 1 ] && bound
=555 || bound
=$system_guid_max
143 compare
"${f%.*}" "(with login.defs)" "$bound"
146 rm -f "$TESTDIR"/etc
/sysusers.d
/* "$TESTDIR"/usr
/lib
/sysusers.d
/*
148 mv "$TESTDIR/etc/login.defs" "$TESTDIR/etc/login.defs.moved"
149 ln -s ..
/..
/..
/..
/..
/etc
/login.defs.moved
"$TESTDIR/etc/login.defs"
151 for f
in $
(find "$SOURCE"/test-
*.input |
sort -V); do
152 echo "*** Running $f (with login.defs symlinked)"
153 prepare_testdir
"${f%.input}"
154 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
155 $SYSUSERS --root="$TESTDIR"
157 # shellcheck disable=SC2050
158 [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@
= 1 ] && bound
=555 || bound
=$system_guid_max
159 compare
"${f%.*}" "(with login.defs symlinked)" "$bound"
162 rm -f "$TESTDIR"/etc
/sysusers.d
/* "$TESTDIR"/usr
/lib
/sysusers.d
/*
164 # tests for error conditions
165 for f
in $
(find "$SOURCE"/unhappy-
*.input |
sort -V); do
166 echo "*** Running test $f"
167 prepare_testdir
"${f%.input}"
168 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
169 SYSTEMD_LOG_LEVEL
=info
$SYSUSERS --root="$TESTDIR" 2>&1 |
tail -n1 |
sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err"
170 if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err"; then
171 echo >&2 "**** Unexpected error output for $f"
172 cat >&2 "$TESTDIR/err"