]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: add regression tests for ul_configs_file_list()
authorKarel Zak <kzak@redhat.com>
Thu, 9 Oct 2025 20:04:19 +0000 (22:04 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 14 Oct 2025 11:22:05 +0000 (13:22 +0200)
Add comprehensive test script for configuration file list functionality
with the following test cases:

- main-etc: Main config file in /etc
- main-usr: Main config file fallback to /usr
- dropin-etc: Drop-in files from /etc
- dropin-usr: Drop-in files from /usr
- combined: Main config + drop-ins from multiple directories
- masking: Same basename in multiple directories (masking behavior)
- no-project: Configuration without project subdirectory

The tests verify proper file discovery, priority ordering across /etc,
/run, and /usr directories, and file masking behavior according to the
Configuration Files Specification.

Signed-off-by: Karel Zak <kzak@redhat.com>
tests/commands.sh
tests/expected/misc/configs-combined [new file with mode: 0644]
tests/expected/misc/configs-dropin-etc [new file with mode: 0644]
tests/expected/misc/configs-dropin-usr [new file with mode: 0644]
tests/expected/misc/configs-main-etc [new file with mode: 0644]
tests/expected/misc/configs-main-usr [new file with mode: 0644]
tests/expected/misc/configs-masking [new file with mode: 0644]
tests/expected/misc/configs-no-project [new file with mode: 0644]
tests/ts/misc/configs [new file with mode: 0755]

index 44b0be6603a45f7d8509dfbc236f1c8d0851eac5..19f51529ca543dbeb93480d1a2aebb152c2d830e 100644 (file)
@@ -6,6 +6,7 @@ TS_HELPER_BOILERPLATE="${ts_helpersdir}test_boilerplate"
 TS_HELPER_BYTESWAP="${ts_helpersdir}test_byteswap"
 TS_HELPER_CANONICALIZE="${ts_helpersdir}test_canonicalize"
 TS_HELPER_COLORS="${ts_helpersdir}test_colors"
+TS_HELPER_CONFIGS="${ts_helpersdir}test_configs"
 TS_HELPER_CPUSET="${ts_helpersdir}test_cpuset"
 TS_HELPER_CAP="${ts_helpersdir}test_cap"
 TS_HELPER_DMESG="${ts_helpersdir}test_dmesg"
diff --git a/tests/expected/misc/configs-combined b/tests/expected/misc/configs-combined
new file mode 100644 (file)
index 0000000..d0ab0ed
--- /dev/null
@@ -0,0 +1,5 @@
+Found 6 configuration file(s):
+  @TESTDIR@/etc/proj/example.conf
+  @TESTDIR@/usr/proj/example.conf.d/10-base.conf
+  @TESTDIR@/run/proj/example.conf.d/20-override.conf
+  @TESTDIR@/etc/proj/example.conf.d/30-local.conf
diff --git a/tests/expected/misc/configs-dropin-etc b/tests/expected/misc/configs-dropin-etc
new file mode 100644 (file)
index 0000000..0e56739
--- /dev/null
@@ -0,0 +1,3 @@
+Found 4 configuration file(s):
+  @TESTDIR@/etc/proj/example.conf.d/10-first.conf
+  @TESTDIR@/etc/proj/example.conf.d/20-second.conf
diff --git a/tests/expected/misc/configs-dropin-usr b/tests/expected/misc/configs-dropin-usr
new file mode 100644 (file)
index 0000000..892bf41
--- /dev/null
@@ -0,0 +1,3 @@
+Found 2 configuration file(s):
+  @TESTDIR@/usr/proj/example.conf.d/10-first.conf
+  @TESTDIR@/usr/proj/example.conf.d/20-second.conf
diff --git a/tests/expected/misc/configs-main-etc b/tests/expected/misc/configs-main-etc
new file mode 100644 (file)
index 0000000..d5f7afd
--- /dev/null
@@ -0,0 +1,2 @@
+Found 1 configuration file(s):
+  @TESTDIR@/etc/proj/example.conf
diff --git a/tests/expected/misc/configs-main-usr b/tests/expected/misc/configs-main-usr
new file mode 100644 (file)
index 0000000..c087703
--- /dev/null
@@ -0,0 +1,2 @@
+Found 1 configuration file(s):
+  @TESTDIR@/usr/proj/example.conf
diff --git a/tests/expected/misc/configs-masking b/tests/expected/misc/configs-masking
new file mode 100644 (file)
index 0000000..4f06221
--- /dev/null
@@ -0,0 +1,2 @@
+Found 2 configuration file(s):
+  @TESTDIR@/etc/proj/example.conf.d/10-config.conf
diff --git a/tests/expected/misc/configs-no-project b/tests/expected/misc/configs-no-project
new file mode 100644 (file)
index 0000000..fbc18d5
--- /dev/null
@@ -0,0 +1,2 @@
+Found 1 configuration file(s):
+  @TESTDIR@/etc//test.conf
diff --git a/tests/ts/misc/configs b/tests/ts/misc/configs
new file mode 100755 (executable)
index 0000000..6df4159
--- /dev/null
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="configs"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_CONFIGS"
+
+# Create test directory structure
+TESTDIR="$TS_OUTDIR/${TS_TESTNAME}-root"
+ETC_DIR="$TESTDIR/etc"
+RUN_DIR="$TESTDIR/run"
+USR_DIR="$TESTDIR/usr"
+
+mkdir -p "$ETC_DIR/proj"
+mkdir -p "$RUN_DIR/proj"
+mkdir -p "$USR_DIR/proj"
+
+# Test 1: Main config file in /etc
+ts_init_subtest "main-etc"
+echo "main config" > "$ETC_DIR/proj/example.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -f "$ETC_DIR/proj/example.conf"
+ts_finalize_subtest
+
+# Test 2: Main config file in /usr (fallback)
+ts_init_subtest "main-usr"
+echo "usr config" > "$USR_DIR/proj/example.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -f "$USR_DIR/proj/example.conf"
+ts_finalize_subtest
+
+# Test 3: Drop-in files from /etc
+ts_init_subtest "dropin-etc"
+mkdir -p "$ETC_DIR/proj/example.conf.d"
+echo "etc drop-in 1" > "$ETC_DIR/proj/example.conf.d/10-first.conf"
+echo "etc drop-in 2" > "$ETC_DIR/proj/example.conf.d/20-second.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -rf "$ETC_DIR/proj/example.conf.d"
+ts_finalize_subtest
+
+# Test 4: Drop-in files from /usr
+ts_init_subtest "dropin-usr"
+mkdir -p "$USR_DIR/proj/example.conf.d"
+echo "usr drop-in 1" > "$USR_DIR/proj/example.conf.d/10-first.conf"
+echo "usr drop-in 2" > "$USR_DIR/proj/example.conf.d/20-second.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -rf "$USR_DIR/proj/example.conf.d"
+ts_finalize_subtest
+
+# Test 5: Main config + drop-ins from multiple directories (priority order)
+ts_init_subtest "combined"
+echo "main config" > "$ETC_DIR/proj/example.conf"
+mkdir -p "$ETC_DIR/proj/example.conf.d"
+mkdir -p "$RUN_DIR/proj/example.conf.d"
+mkdir -p "$USR_DIR/proj/example.conf.d"
+echo "usr drop-in" > "$USR_DIR/proj/example.conf.d/10-base.conf"
+echo "run drop-in" > "$RUN_DIR/proj/example.conf.d/20-override.conf"
+echo "etc drop-in" > "$ETC_DIR/proj/example.conf.d/30-local.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -f "$ETC_DIR/proj/example.conf"
+rm -rf "$ETC_DIR/proj/example.conf.d"
+rm -rf "$RUN_DIR/proj/example.conf.d"
+rm -rf "$USR_DIR/proj/example.conf.d"
+ts_finalize_subtest
+
+# Test 6: Same basename in multiple directories (masking behavior)
+ts_init_subtest "masking"
+mkdir -p "$ETC_DIR/proj/example.conf.d"
+mkdir -p "$USR_DIR/proj/example.conf.d"
+echo "usr version" > "$USR_DIR/proj/example.conf.d/10-config.conf"
+echo "etc version" > "$ETC_DIR/proj/example.conf.d/10-config.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --project "proj" --name "example" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -rf "$ETC_DIR/proj/example.conf.d"
+rm -rf "$USR_DIR/proj/example.conf.d"
+ts_finalize_subtest
+
+# Test 7: No project subdirectory
+ts_init_subtest "no-project"
+mkdir -p "$ETC_DIR"
+echo "root config" > "$ETC_DIR/test.conf"
+$TS_HELPER_CONFIGS --etc "$ETC_DIR" --run "$RUN_DIR" --usr "$USR_DIR" \
+       --name "test" --suffix "conf" \
+       | sed "s|$TESTDIR|@TESTDIR@|g" >> $TS_OUTPUT 2>> $TS_ERRLOG
+rm -f "$ETC_DIR/test.conf"
+ts_finalize_subtest
+
+ts_finalize