ASSERT_NULL(startswith8(NULL, ""));
}
-#define TEST_FNMATCH_ONE(pattern, haystack, expect) \
- ({ \
- ASSERT_EQ(fnmatch(pattern, haystack, 0), expect ? 0 : FNM_NOMATCH); \
- ASSERT_EQ(efi_fnmatch(u##pattern, u##haystack), expect); \
+#define TEST_FNMATCH_ONE_FULL(pattern, haystack, expect, skip_libc) \
+ ({ \
+ if (!skip_libc) \
+ ASSERT_EQ(fnmatch(pattern, haystack, 0), expect ? 0 : FNM_NOMATCH); \
+ ASSERT_EQ(efi_fnmatch(u##pattern, u##haystack), expect); \
})
+#define TEST_FNMATCH_ONE(pattern, haystack, expect) \
+ TEST_FNMATCH_ONE_FULL(pattern, haystack, expect, false)
+
+#ifdef __GLIBC__
+#define TEST_FNMATCH_ONE_MAY_SKIP_LIBC(pattern, haystack, expect) \
+ TEST_FNMATCH_ONE_FULL(pattern, haystack, expect, false)
+#else
+/* It seems musl is too strict in handling "[]" (or has a bug?). Anyway, let's skip some test cases when
+ * built with musl. The behavior of efi_fnmatch() does not need to match musl's fnmatch(). */
+#define TEST_FNMATCH_ONE_MAY_SKIP_LIBC(pattern, haystack, expect) \
+ TEST_FNMATCH_ONE_FULL(pattern, haystack, expect, true)
+#endif
+
TEST(efi_fnmatch) {
TEST_FNMATCH_ONE("", "", true);
TEST_FNMATCH_ONE("abc", "abc", true);
TEST_FNMATCH_ONE("[abc", "a", false);
TEST_FNMATCH_ONE("[][!] [][!] [][!]", "[ ] !", true);
TEST_FNMATCH_ONE("[]-] []-]", "] -", true);
- TEST_FNMATCH_ONE("[1\\]] [1\\]]", "1 ]", true);
+ TEST_FNMATCH_ONE_MAY_SKIP_LIBC("[1\\]] [1\\]]", "1 ]", true);
TEST_FNMATCH_ONE("[$-\\+]", "&", true);
TEST_FNMATCH_ONE("[1-3A-C] [1-3A-C]", "2 B", true);
TEST_FNMATCH_ONE("[3-5] [3-5] [3-5]", "3 4 5", true);
TEST_FNMATCH_ONE("[f-h] [f-h] [f-h]", "f g h", true);
- TEST_FNMATCH_ONE("[a-c-f] [a-c-f] [a-c-f] [a-c-f] [a-c-f]", "a b c - f", true);
- TEST_FNMATCH_ONE("[a-c-f]", "e", false);
+ TEST_FNMATCH_ONE_MAY_SKIP_LIBC("[a-c-f] [a-c-f] [a-c-f] [a-c-f] [a-c-f]", "a b c - f", true);
+ TEST_FNMATCH_ONE_MAY_SKIP_LIBC("[a-c-f]", "e", false);
TEST_FNMATCH_ONE("[--0] [--0] [--0]", "- . 0", true);
TEST_FNMATCH_ONE("[+--] [+--] [+--]", "+ , -", true);
TEST_FNMATCH_ONE("[f-l]", "m", false);
TEST_FNMATCH_ONE("[b]", "z-a", false);
- TEST_FNMATCH_ONE("[a\\-z]", "b", false);
+ TEST_FNMATCH_ONE_MAY_SKIP_LIBC("[a\\-z]", "b", false);
TEST_FNMATCH_ONE("?a*b[.-0]c", "/a/b/c", true);
TEST_FNMATCH_ONE("debian-*-*-*.*", "debian-jessie-2018-06-17-kernel-image-5.10.0-16-amd64.efi", true);
test_printf_one("string");
test_printf_one("%%-%%%%");
+#ifdef __GLIBC__
test_printf_one("%p %p %32p %*p %*p", NULL, (void *) 0xF, &errno, 0, &saved_argc, 20, &saved_argv);
test_printf_one("%-10p %-32p %-*p %-*p", NULL, &errno, 0, &saved_argc, 20, &saved_argv);
+#else
+ /* musl prints NULL as 0, while glibc and our implementation print it as (nil). */
+ test_printf_one("%p %32p %*p %*p", (void *) 0xF, &errno, 0, &saved_argc, 20, &saved_argv);
+ test_printf_one("%-32p %-*p %-*p", &errno, 0, &saved_argc, 20, &saved_argv);
+#endif
test_printf_one("%c %3c %*c %*c %-8c", '1', '!', 0, 'a', 9, '_', '>');
# shellcheck disable=SC2064
trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE
+skip_nis() {
+ # musl seems to not support NIS entries. Let's skip the test case for NIS entries.
+ local path=${1:?}
+ [[ "${SYSTEMD_LIBC:-}" == musl && "${path##*/}" == "test-11.input" ]]
+}
+
prepare_testdir() {
mkdir -p "$TESTDIR/etc/sysusers.d/"
mkdir -p "$TESTDIR/usr/lib/sysusers.d/"
# happy tests
for f in $(find "$SOURCE"/test-*.input | sort -V); do
+ skip_nis "$f" && continue
echo "*** Running $f"
prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
done
for f in $(find "$SOURCE"/test-*.input | sort -V); do
+ skip_nis "$f" && continue
echo "*** Running $f on stdin"
prepare_testdir "${f%.input}"
touch "$TESTDIR/etc/sysusers.d/test.conf"
done
for f in $(find "$SOURCE"/test-*.input | sort -V); do
+ skip_nis "$f" && continue
echo "*** Running $f on stdin with --replace"
prepare_testdir "${f%.input}"
touch "$TESTDIR/etc/sysusers.d/test.conf"
EOF
for f in $(find "$SOURCE"/test-*.input | sort -V); do
+ skip_nis "$f" && continue
echo "*** Running $f (with login.defs)"
prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
ln -s ../../../../../etc/login.defs.moved "$TESTDIR/etc/login.defs"
for f in $(find "$SOURCE"/test-*.input | sort -V); do
+ skip_nis "$f" && continue
echo "*** Running $f (with login.defs symlinked)"
prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/*
+preprocess_error() {
+ # Convert error message for ERANGE from glibc to musl.
+ if [[ "${SYSTEMD_LIBC:-}" == musl ]]; then
+ sed -e 's/Numerical result out of range/Result not representable/' "${1:?}"
+ else
+ cat "${1:?}"
+ fi
+}
+
# tests for error conditions
for f in $(find "$SOURCE"/unhappy-*.input | sort -V); do
echo "*** Running test $f"
prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
SYSTEMD_LOG_LEVEL=info "$SYSUSERS" --root="$TESTDIR" 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err"
- if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err" >&2; then
+ if ! diff -u "$TESTDIR/err" <(preprocess_error "${f%.*}.expected-err") >&2; then
echo >&2 "**** Unexpected error output for $f"
cat >&2 "$TESTDIR/err"
exit 1