| #!/usr/bin/env bash |
| set -e |
| TEST_DESCRIPTION="Sysuser-related tests" |
| |
| . $TEST_BASE_DIR/test-functions |
| |
| test_setup() { |
| mkdir -p $TESTDIR/etc/sysusers.d $TESTDIR/usr/lib/sysusers.d $TESTDIR/tmp |
| } |
| |
| prepare_testdir() { |
| rm -f $TESTDIR/etc/*{passwd,group,shadow} |
| for i in $1.initial-{passwd,group,shadow}; do |
| test -f $i && cp $i $TESTDIR/etc/${i#*.initial-} |
| done |
| return 0 |
| } |
| |
| preprocess() { |
| in="$1" |
| |
| # see meson.build how to extract this. gcc -E was used before to |
| # get this value from config.h, however the autopkgtest fails with |
| # it |
| SYSTEM_UID_MAX=$(awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' /etc/login.defs) |
| SYSTEM_GID_MAX=$(awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' /etc/login.defs) |
| |
| # we can't rely on config.h to get the nologin path, as autopkgtest |
| # uses pre-compiled binaries, so extract it from the systemd-sysusers |
| # binary which we are about to execute |
| NOLOGIN=$(strings $(type -p systemd-sysusers) | grep nologin) |
| |
| sed -e "s/SYSTEM_UID_MAX/${SYSTEM_UID_MAX}/g" \ |
| -e "s/SYSTEM_GID_MAX/${SYSTEM_GID_MAX}/g" \ |
| -e "s#NOLOGIN#${NOLOGIN}#g" "$in" |
| } |
| |
| compare() { |
| if ! diff -u $TESTDIR/etc/passwd <(preprocess ${1%.*}.expected-passwd); then |
| echo "**** Unexpected output for $f" |
| exit 1 |
| fi |
| |
| if ! diff -u $TESTDIR/etc/group <(preprocess ${1%.*}.expected-group); then |
| echo "**** Unexpected output for $f $2" |
| exit 1 |
| fi |
| } |
| |
| test_run() { |
| # ensure our build of systemd-sysusers is run |
| PATH=${BUILD_DIR}:$PATH |
| |
| rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* |
| |
| # happy tests |
| for f in test-*.input; do |
| echo "*** Running $f" |
| prepare_testdir ${f%.input} |
| cp $f $TESTDIR/usr/lib/sysusers.d/test.conf |
| systemd-sysusers --root=$TESTDIR |
| |
| compare $f "" |
| done |
| |
| for f in test-*.input; do |
| echo "*** Running $f on stdin" |
| prepare_testdir ${f%.input} |
| touch $TESTDIR/etc/sysusers.d/test.conf |
| cat $f | systemd-sysusers --root=$TESTDIR - |
| |
| compare $f "on stdin" |
| done |
| |
| for f in test-*.input; do |
| echo "*** Running $f on stdin with --replace" |
| prepare_testdir ${f%.input} |
| touch $TESTDIR/etc/sysusers.d/test.conf |
| # this overrides test.conf which is masked on disk |
| cat $f | systemd-sysusers --root=$TESTDIR --replace=/etc/sysusers.d/test.conf - |
| # this should be ignored |
| cat test-1.input | systemd-sysusers --root=$TESTDIR --replace=/usr/lib/sysusers.d/test.conf - |
| |
| compare $f "on stdin with --replace" |
| done |
| |
| # test --inline |
| echo "*** Testing --inline" |
| prepare_testdir |
| # copy a random file to make sure it is ignored |
| cp $f $TESTDIR/etc/sysusers.d/confuse.conf |
| systemd-sysusers --root=$TESTDIR --inline \ |
| "u u1 222 - - /bin/zsh" \ |
| "g g1 111" |
| |
| compare inline "(--inline)" |
| |
| # test --replace |
| echo "*** Testing --inline with --replace" |
| prepare_testdir |
| # copy a random file to make sure it is ignored |
| cp $f $TESTDIR/etc/sysusers.d/confuse.conf |
| systemd-sysusers --root=$TESTDIR \ |
| --inline \ |
| --replace=/etc/sysusers.d/confuse.conf \ |
| "u u1 222 - - /bin/zsh" \ |
| "g g1 111" |
| |
| compare inline "(--inline --replace=…)" |
| |
| rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/* |
| |
| # tests for error conditions |
| for f in unhappy-*.input; do |
| echo "*** Running test $f" |
| prepare_testdir ${f%.input} |
| cp $f $TESTDIR/usr/lib/sysusers.d/test.conf |
| systemd-sysusers --root=$TESTDIR 2> /dev/null |
| journalctl --sync |
| journalctl -t systemd-sysusers -o cat | tail -n1 > $TESTDIR/tmp/err |
| if ! diff -u $TESTDIR/tmp/err ${f%.*}.expected-err; then |
| echo "**** Unexpected error output for $f" |
| cat $TESTDIR/tmp/err |
| exit 1 |
| fi |
| done |
| } |
| |
| do_test "$@" |