]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - test/TEST-21-SYSUSERS/test.sh
Merge pull request #15840 from Werkov/mkosi-opensuse
[thirdparty/systemd.git] / test / TEST-21-SYSUSERS / test.sh
index 73cbe10b69a0e66e15430f744f1f4b1506853a6e..527db85b072a9e6e0c242bf8a685d573e1fa58b1 100755 (executable)
@@ -1,20 +1,19 @@
-#!/bin/bash
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
+#!/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
+    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
+    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() {
@@ -24,97 +23,107 @@ preprocess() {
     # 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)
-    sed "s/SYSTEM_UID_MAX/${SYSTEM_UID_MAX}/g" "$in"
+    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
+        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
+        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 -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
+    # 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 "$@"