From 6933334a0d98b65f502abea4183f74275f11a50c Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Wed, 26 Jul 2023 06:30:37 +0900
Subject: [PATCH] test-fstab-generator: extract core part as a function

No functional change, preparation for later commits.

(cherry picked from commit 7f8c67c9965a5f70a6c1592db4f5339f4851a5de)

Related: #2190226
---
 test/test-fstab-generator.sh | 184 ++++++++++++++++++-----------------
 1 file changed, 96 insertions(+), 88 deletions(-)

diff --git a/test/test-fstab-generator.sh b/test/test-fstab-generator.sh
index 68c9d0631e..d5844b8c3f 100755
--- a/test/test-fstab-generator.sh
+++ b/test/test-fstab-generator.sh
@@ -1,10 +1,10 @@
 #!/usr/bin/env bash
 # SPDX-License-Identifier: LGPL-2.1-or-later
-set -e
+set -eux
 shopt -s nullglob
 shopt -s globstar
 
-if [[ -n "$1" ]]; then
+if [[ -n "${1:-}" ]]; then
     generator=$1
 elif [[ -x /usr/lib/systemd/system-generators/systemd-fstab-generator ]]; then
     generator=/usr/lib/systemd/system-generators/systemd-fstab-generator
@@ -19,97 +19,105 @@ src="$(dirname "$0")/testdata/test-fstab-generator"
 # fsck(8) is located in /usr/sbin on Debian
 PATH=$PATH:/usr/sbin
 
-for f in "$src"/test-*.input; do
-    echo "*** Running $f"
-
-    (
-        out=$(mktemp --tmpdir --directory "test-fstab-generator.XXXXXXXXXX")
-        # shellcheck disable=SC2064
-        trap "rm -rf '$out'" EXIT INT QUIT PIPE
-
-        exp="${f%.input}.expected"
-        if [[ "${f##*/}" =~ swap ]] && systemd-detect-virt --container >/dev/null; then
-            exp="${exp}.container"
-        fi
-
-        if [[ "${f##*/}" =~ \.fstab\.input ]]; then
-            SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD=yes SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=yes root=fstab" SYSTEMD_FSTAB="$f" SYSTEMD_SYSROOT_FSTAB="/dev/null" $generator "$out" "$out" "$out"
-        else
-            SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD=yes SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=no $(cat "$f")" $generator "$out" "$out" "$out"
-        fi
-
-        # The option x-systemd.growfs creates symlink to system's systemd-growfs@.service in .mount.wants directory.
-        # The system that the test is currently running on may not have or may have outdated unit file.
-        # Let's replace the symlink with an empty file.
-        for i in "$out"/*/systemd-growfs@*.service; do
-            [[ -L "$i" ]] || continue
-            rm "$i"
-            touch "$i"
+test_one() (
+    local input out exp i j k dir fname expf
+
+    input=${1?}
+
+    : "*** Running $input"
+
+    out=$(mktemp --tmpdir --directory "test-fstab-generator.XXXXXXXXXX")
+    # shellcheck disable=SC2064
+    trap "rm -rf '$out'" EXIT INT QUIT PIPE
+
+    exp="${input%.input}.expected"
+    if [[ "${input##*/}" =~ swap ]] && systemd-detect-virt --container >/dev/null; then
+        exp="${exp}.container"
+    fi
+
+    if [[ "${input##*/}" =~ \.fstab\.input ]]; then
+        SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD=yes SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=yes root=fstab" SYSTEMD_FSTAB="$input" SYSTEMD_SYSROOT_FSTAB="/dev/null" $generator "$out" "$out" "$out"
+    else
+        SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD=yes SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=no $(cat "$input")" $generator "$out" "$out" "$out"
+    fi
+
+    # The option x-systemd.growfs creates symlink to system's systemd-growfs@.service in .mount.wants directory.
+    # The system that the test is currently running on may not have or may have outdated unit file.
+    # Let's replace the symlink with an empty file.
+    for i in "$out"/*/systemd-growfs@*.service; do
+        [[ -L "$i" ]] || continue
+        rm "$i"
+        touch "$i"
+    done
+
+    # For split-usr system
+    for i in "$out"/systemd-*.service; do
+        sed -i -e 's:ExecStart=/lib/systemd/:ExecStart=/usr/lib/systemd/:' "$i"
+    done
+
+    if [[ "${input##*/}" =~ \.fstab\.input ]]; then
+        for i in "$out"/*.{automount,mount,swap}; do
+            sed -i -e 's:SourcePath=.*$:SourcePath=/etc/fstab:' "$i"
         done
-
-        # For split-usr system
-        for i in "$out"/systemd-*.service; do
-            sed -i -e 's:ExecStart=/lib/systemd/:ExecStart=/usr/lib/systemd/:' "$i"
-        done
-
-        if [[ "${f##*/}" =~ \.fstab\.input ]]; then
-            for i in "$out"/*.{automount,mount,swap}; do
-                sed -i -e 's:SourcePath=.*$:SourcePath=/etc/fstab:' "$i"
-            done
+    fi
+
+    # .deb packager seems to dislike files named with backslash. So, as a workaround, we store files
+    # without backslash in .expected.
+    for i in "$out"/**/*\\*.{mount,swap}; do
+        k="${i//\\/}"
+        if [[ "$i" != "$k" ]]; then
+            if [[ -f "$i" ]]; then
+                mv "$i" "$k"
+            elif [[ -L "$i" ]]; then
+                dest=$(readlink "$i")
+                rm "$i"
+                ln -s "${dest//\\/}" "$k"
+            fi
         fi
-
-        # .deb packager seems to dislike files named with backslash. So, as a workaround, we store files
-        # without backslash in .expected.
-        for i in "$out"/**/*\\*.{mount,swap}; do
-            k="${i//\\/}"
-            if [[ "$i" != "$k" ]]; then
-                if [[ -f "$i" ]]; then
-                    mv "$i" "$k"
-                elif [[ -L "$i" ]]; then
-                    dest=$(readlink "$i")
-                    rm "$i"
-                    ln -s "${dest//\\/}" "$k"
+    done
+
+    # We store empty files rather than dead symlinks, so that they don't get pruned when packaged up, so compare
+    # the list of filenames rather than their content
+    if ! diff -u <(find "$out" -printf '%P\n' | sort) <(find "$exp" -printf '%P\n' | sort); then
+        : "**** Unexpected output for $input"
+        return 1
+    fi
+
+    # Check the main units.
+    if ! diff -u "$out" "$exp"; then
+        : "**** Unexpected output for $input"
+        return 1
+    fi
+
+    # Also check drop-ins.
+    for i in "$out"/*; do
+        [[ -d "$i" ]] || continue
+
+        dir="${i##*/}"
+
+        for j in "$i"/*; do
+            fname="${j##*/}"
+            expf="$exp/$dir/$fname"
+
+            if [[ -L "$j" && ! -e "$j" ]]; then
+                # For dead symlink, we store an empty file.
+                if [[ ! -e "$expf" || -n "$(cat "$expf")" ]]; then
+                    : "**** Unexpected symlink $j created by $input"
+                    return 1
                 fi
+                continue
             fi
-        done
 
-        # We store empty files rather than dead symlinks, so that they don't get pruned when packaged up, so compare
-        # the list of filenames rather than their content
-        if ! diff -u <(find "$out" -printf '%P\n' | sort) <(find "$exp" -printf '%P\n' | sort); then
-            echo "**** Unexpected output for $f"
-            exit 1
-        fi
-
-        # Check the main units.
-        if ! diff -u "$out" "$exp"; then
-            echo "**** Unexpected output for $f"
-            exit 1
-        fi
-
-        # Also check drop-ins.
-        for i in "$out"/*; do
-            [[ -d "$i" ]] || continue
-
-            dir="${i##*/}"
-
-            for j in "$i"/*; do
-                fname="${j##*/}"
-                expf="$exp/$dir/$fname"
+            if ! diff -u "$j" "$expf"; then
+                : "**** Unexpected output in $j for $input"
+                return 1
+            fi
+        done
+    done
 
-                if [[ -L "$j" && ! -e "$j" ]]; then
-                    # For dead symlink, we store an empty file.
-                    if [[ ! -e "$expf" || -n "$(cat "$expf")" ]]; then
-                        echo "**** Unexpected symlink $j created by $f"
-                        exit 1
-                    fi
-                    continue
-                fi
+    return 0
+)
 
-                if ! diff -u "$j" "$expf"; then
-                    echo "**** Unexpected output in $j for $f"
-                    exit 1
-                fi
-            done
-        done
-    ) || exit 1
+for f in "$src"/test-*.input; do
+    test_one "$f"
 done