]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test/TEST-21-SYSUSERS: turn into a unit test
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 26 Sep 2020 09:58:24 +0000 (11:58 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 1 Oct 2020 15:52:51 +0000 (17:52 +0200)
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.

61 files changed:
meson.build
sysusers.d/meson.build
test/TEST-21-SYSUSERS/Makefile [deleted symlink]
test/TEST-21-SYSUSERS/test.sh [deleted file]
test/meson.build
test/test-sysusers.sh.in [new file with mode: 0755]
test/test-sysusers/inline.expected-group [moved from test/TEST-21-SYSUSERS/inline.expected-group with 100% similarity]
test/test-sysusers/inline.expected-passwd [moved from test/TEST-21-SYSUSERS/inline.expected-passwd with 100% similarity]
test/test-sysusers/test-1.expected-group [moved from test/TEST-21-SYSUSERS/test-1.expected-group with 100% similarity]
test/test-sysusers/test-1.expected-passwd [moved from test/TEST-21-SYSUSERS/test-1.expected-passwd with 100% similarity]
test/test-sysusers/test-1.input [moved from test/TEST-21-SYSUSERS/test-1.input with 100% similarity]
test/test-sysusers/test-10.expected-group [moved from test/TEST-21-SYSUSERS/test-10.expected-group with 100% similarity]
test/test-sysusers/test-10.expected-passwd [moved from test/TEST-21-SYSUSERS/test-10.expected-passwd with 100% similarity]
test/test-sysusers/test-10.input [moved from test/TEST-21-SYSUSERS/test-10.input with 100% similarity]
test/test-sysusers/test-11.expected-group [moved from test/TEST-21-SYSUSERS/test-11.expected-group with 100% similarity]
test/test-sysusers/test-11.expected-passwd [moved from test/TEST-21-SYSUSERS/test-11.expected-passwd with 100% similarity]
test/test-sysusers/test-11.initial-group [moved from test/TEST-21-SYSUSERS/test-11.initial-group with 100% similarity]
test/test-sysusers/test-11.initial-passwd [moved from test/TEST-21-SYSUSERS/test-11.initial-passwd with 100% similarity]
test/test-sysusers/test-11.input [moved from test/TEST-21-SYSUSERS/test-11.input with 100% similarity]
test/test-sysusers/test-12.expected-group [moved from test/TEST-21-SYSUSERS/test-12.expected-group with 100% similarity]
test/test-sysusers/test-12.expected-passwd [moved from test/TEST-21-SYSUSERS/test-12.expected-passwd with 100% similarity]
test/test-sysusers/test-12.initial-group [moved from test/TEST-21-SYSUSERS/test-12.initial-group with 100% similarity]
test/test-sysusers/test-12.initial-passwd [moved from test/TEST-21-SYSUSERS/test-12.initial-passwd with 100% similarity]
test/test-sysusers/test-12.input [moved from test/TEST-21-SYSUSERS/test-12.input with 100% similarity]
test/test-sysusers/test-13.expected-group [moved from test/TEST-21-SYSUSERS/test-13.expected-group with 100% similarity]
test/test-sysusers/test-13.expected-passwd [moved from test/TEST-21-SYSUSERS/test-13.expected-passwd with 100% similarity]
test/test-sysusers/test-13.input [moved from test/TEST-21-SYSUSERS/test-13.input with 100% similarity]
test/test-sysusers/test-14.expected-group [moved from test/TEST-21-SYSUSERS/test-14.expected-group with 100% similarity]
test/test-sysusers/test-14.expected-passwd [moved from test/TEST-21-SYSUSERS/test-14.expected-passwd with 100% similarity]
test/test-sysusers/test-14.initial-group [moved from test/TEST-21-SYSUSERS/test-14.initial-group with 100% similarity]
test/test-sysusers/test-14.input [moved from test/TEST-21-SYSUSERS/test-14.input with 100% similarity]
test/test-sysusers/test-2.expected-group [moved from test/TEST-21-SYSUSERS/test-2.expected-group with 100% similarity]
test/test-sysusers/test-2.expected-passwd [moved from test/TEST-21-SYSUSERS/test-2.expected-passwd with 100% similarity]
test/test-sysusers/test-2.input [moved from test/TEST-21-SYSUSERS/test-2.input with 100% similarity]
test/test-sysusers/test-3.expected-group [moved from test/TEST-21-SYSUSERS/test-3.expected-group with 100% similarity]
test/test-sysusers/test-3.expected-passwd [moved from test/TEST-21-SYSUSERS/test-3.expected-passwd with 100% similarity]
test/test-sysusers/test-3.input [moved from test/TEST-21-SYSUSERS/test-3.input with 100% similarity]
test/test-sysusers/test-4.expected-group [moved from test/TEST-21-SYSUSERS/test-4.expected-group with 100% similarity]
test/test-sysusers/test-4.expected-passwd [moved from test/TEST-21-SYSUSERS/test-4.expected-passwd with 100% similarity]
test/test-sysusers/test-4.input [moved from test/TEST-21-SYSUSERS/test-4.input with 100% similarity]
test/test-sysusers/test-5.expected-group [moved from test/TEST-21-SYSUSERS/test-5.expected-group with 100% similarity]
test/test-sysusers/test-5.expected-passwd [moved from test/TEST-21-SYSUSERS/test-5.expected-passwd with 100% similarity]
test/test-sysusers/test-5.input [moved from test/TEST-21-SYSUSERS/test-5.input with 100% similarity]
test/test-sysusers/test-6.expected-group [moved from test/TEST-21-SYSUSERS/test-6.expected-group with 100% similarity]
test/test-sysusers/test-6.expected-passwd [moved from test/TEST-21-SYSUSERS/test-6.expected-passwd with 100% similarity]
test/test-sysusers/test-6.input [moved from test/TEST-21-SYSUSERS/test-6.input with 100% similarity]
test/test-sysusers/test-7.expected-group [moved from test/TEST-21-SYSUSERS/test-7.expected-group with 100% similarity]
test/test-sysusers/test-7.expected-passwd [moved from test/TEST-21-SYSUSERS/test-7.expected-passwd with 100% similarity]
test/test-sysusers/test-7.input [moved from test/TEST-21-SYSUSERS/test-7.input with 100% similarity]
test/test-sysusers/test-8.expected-group [moved from test/TEST-21-SYSUSERS/test-8.expected-group with 100% similarity]
test/test-sysusers/test-8.expected-passwd [moved from test/TEST-21-SYSUSERS/test-8.expected-passwd with 100% similarity]
test/test-sysusers/test-8.input [moved from test/TEST-21-SYSUSERS/test-8.input with 100% similarity]
test/test-sysusers/test-9.expected-group [moved from test/TEST-21-SYSUSERS/test-9.expected-group with 100% similarity]
test/test-sysusers/test-9.expected-passwd [moved from test/TEST-21-SYSUSERS/test-9.expected-passwd with 100% similarity]
test/test-sysusers/test-9.input [moved from test/TEST-21-SYSUSERS/test-9.input with 100% similarity]
test/test-sysusers/unhappy-1.expected-err [moved from test/TEST-21-SYSUSERS/unhappy-1.expected-err with 100% similarity]
test/test-sysusers/unhappy-1.input [moved from test/TEST-21-SYSUSERS/unhappy-1.input with 100% similarity]
test/test-sysusers/unhappy-2.expected-err [moved from test/TEST-21-SYSUSERS/unhappy-2.expected-err with 100% similarity]
test/test-sysusers/unhappy-2.input [moved from test/TEST-21-SYSUSERS/unhappy-2.input with 100% similarity]
test/test-sysusers/unhappy-3.expected-err [moved from test/TEST-21-SYSUSERS/unhappy-3.expected-err with 100% similarity]
test/test-sysusers/unhappy-3.input [moved from test/TEST-21-SYSUSERS/unhappy-3.input with 100% similarity]

index 0a065fa3e54c11b788184f3cdc44c2b8fa5e699d..3bec86db813a6a7e3331f7d16481dd20e4a36185 100644 (file)
@@ -299,6 +299,7 @@ substs.set('CERTIFICATEROOT',                                 get_option('certif
 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)
@@ -1468,6 +1469,8 @@ foreach term : ['analyze',
         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])
@@ -2962,8 +2965,8 @@ public_programs += executable(
         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,
@@ -2971,9 +2974,17 @@ if conf.get('ENABLE_SYSUSERS') == 1
                 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,
@@ -2984,6 +2995,14 @@ if conf.get('ENABLE_SYSUSERS') == 1
                                      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
 
index eb99957e2f970daa952a2aeaa8cabea73556cbef..146f922bed0ec1dd0579a62c4039cba2dacc9ddb 100644 (file)
@@ -2,8 +2,6 @@
 
 in_files = ['basic.conf']
 
-enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
-
 foreach file : in_files
         gen = configure_file(
                 input : file + '.in',
diff --git a/test/TEST-21-SYSUSERS/Makefile b/test/TEST-21-SYSUSERS/Makefile
deleted file mode 120000 (symlink)
index e9f93b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/TEST-21-SYSUSERS/test.sh b/test/TEST-21-SYSUSERS/test.sh
deleted file mode 100755 (executable)
index 3b37f7e..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/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 "$@"
index 5d9fb5ab50925757e09af03f0f066dfd84033ded..5656abdf72a97df0277d351c9313aba86eb67789 100644 (file)
@@ -58,6 +58,21 @@ test_network_generator_conversion_sh = find_program('test-network-generator-conv
 
 ############################################################
 
+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',
diff --git a/test/test-sysusers.sh.in b/test/test-sysusers.sh.in
new file mode 100755 (executable)
index 0000000..ac07c21
--- /dev/null
@@ -0,0 +1,111 @@
+#!/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