All this test does is manipulate text files in a subdir specified with --testroot.
It can be a normal unittest without the overhead of creating a machine image.
As a bonus, also test the .standalone version.
substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
+substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
substs.set('RC_LOCAL_PATH', get_option('rc-local'))
substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
conf.set10(name, have)
endforeach
+enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
+
foreach tuple : [['nss-mymachines', 'machined'],
['nss-resolve', 'resolve']]
want = get_option(tuple[0])
install_rpath : rootlibexecdir,
install : true)
-if conf.get('ENABLE_SYSUSERS') == 1
- public_programs += executable(
+if enable_sysusers
+ exe = executable(
'systemd-sysusers',
'src/sysusers/sysusers.c',
include_directories : includes,
install_rpath : rootlibexecdir,
install : true,
install_dir : rootbindir)
+ public_programs += exe
+
+ if want_tests != 'false'
+ test('test-sysusers',
+ test_sysusers_sh,
+ # https://github.com/mesonbuild/meson/issues/2681
+ args : exe.full_path())
+ endif
if have_standalone_binaries
- public_programs += executable(
+ exe = executable(
'systemd-sysusers.standalone',
'src/sysusers/sysusers.c',
include_directories : includes,
libjournal_client],
install : true,
install_dir : rootbindir)
+ public_programs += exe
+
+ if want_tests != 'false'
+ test('test-sysusers.standalone',
+ test_sysusers_sh,
+ # https://github.com/mesonbuild/meson/issues/2681
+ args : exe.full_path())
+ endif
endif
endif
in_files = ['basic.conf']
-enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
-
foreach file : in_files
gen = configure_file(
input : file + '.in',
+++ /dev/null
-../TEST-01-BASIC/Makefile
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/env bash
-set -e
-TEST_DESCRIPTION="Sysuser-related tests"
-IMAGE_NAME="sysusers"
-. $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
- [[ -e /etc/login.defs ]] && login_defs_file="/etc/login.defs" || login_defs_file="/usr/etc/login.defs"
- SYSTEM_UID_MAX=$(awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' $login_defs_file)
- SYSTEM_GID_MAX=$(awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' $login_defs_file)
-
- # 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>&1 | 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 "$@"
############################################################
+test_sysusers_dir = join_paths(meson.current_source_dir(), 'test-sysusers')
+
+test_sysusers_sh = configure_file(
+ input : 'test-sysusers.sh.in',
+ output : 'test-sysusers.sh',
+ configuration : substs)
+if install_tests and conf.get('ENABLE_SYSUSERS') == 1
+ install_data(test_sysusers_sh,
+ install_dir : testsdir)
+ install_subdir('test-sysusers',
+ install_dir : testdata_dir)
+endif
+
+############################################################
+
rule_syntax_check_py = find_program('rule-syntax-check.py')
if want_tests != 'false'
test('rule-syntax-check',
--- /dev/null
+#!/usr/bin/env bash
+set -e
+
+SYSUSERS="${1:-systemd-sysusers}"
+
+[ -e "$(dirname $0)/../systemd-runtest.env" ] && . "$(dirname $0)/../systemd-runtest.env"
+SYSTEMD_TEST_DATA=${SYSTEMD_TEST_DATA:-@SYSTEMD_TEST_DATA@}
+SOURCE=$SYSTEMD_TEST_DATA/test-sysusers
+
+TESTDIR=$(mktemp --tmpdir --directory "test-sysusers.XXXXXXXXXX")
+trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE
+
+prepare_testdir() {
+ mkdir -p $TESTDIR/etc/sysusers.d/
+ mkdir -p $TESTDIR/usr/lib/sysusers.d/
+ 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() {
+ sed -e "s/SYSTEM_UID_MAX/@SYSTEM_UID_MAX@/g" \
+ -e "s/SYSTEM_GID_MAX/@SYSTEM_GID_MAX@/g" \
+ -e "s#NOLOGIN#@NOLOGIN@#g" "$1"
+}
+
+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
+}
+
+rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/*
+
+# happy tests
+for f in $SOURCE/test-*.input; do
+ echo "*** Running $f"
+ prepare_testdir ${f%.input}
+ cp $f $TESTDIR/usr/lib/sysusers.d/test.conf
+ $SYSUSERS --root=$TESTDIR
+
+ compare $f ""
+done
+
+for f in $SOURCE/test-*.input; do
+ echo "*** Running $f on stdin"
+ prepare_testdir ${f%.input}
+ touch $TESTDIR/etc/sysusers.d/test.conf
+ cat $f | $SYSUSERS --root=$TESTDIR -
+
+ compare $f "on stdin"
+done
+
+for f in $SOURCE/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 | $SYSUSERS --root=$TESTDIR --replace=/etc/sysusers.d/test.conf -
+ # this should be ignored
+ cat $SOURCE/test-1.input | $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
+$SYSUSERS --root=$TESTDIR --inline \
+ "u u1 222 - - /bin/zsh" \
+ "g g1 111"
+
+compare $SOURCE/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
+$SYSUSERS --root=$TESTDIR \
+ --inline \
+ --replace=/etc/sysusers.d/confuse.conf \
+ "u u1 222 - - /bin/zsh" \
+ "g g1 111"
+
+compare $SOURCE/inline "(--inline --replace=…)"
+
+rm -f $TESTDIR/etc/sysusers.d/* $TESTDIR/usr/lib/sysusers.d/*
+
+# tests for error conditions
+for f in $SOURCE/unhappy-*.input; do
+ echo "*** Running test $f"
+ prepare_testdir ${f%.input}
+ cp $f $TESTDIR/usr/lib/sysusers.d/test.conf
+ $SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 > $TESTDIR/err
+ if ! diff -u $TESTDIR/err ${f%.*}.expected-err; then
+ echo "**** Unexpected error output for $f"
+ cat $TESTDIR/err
+ exit 1
+ fi
+done