mirror of
https://github.com/systemd/systemd
synced 2024-09-06 16:56:43 +00:00
![Zbigniew Jędrzejewski-Szmek](/assets/img/avatar_default.png)
Bash will generate a very nice message for us: /tmp/ff.sh: line 1: SOMEVAR: parameter null or not set Let's save some keystrokes by not replacing this with our own inferior messages.
163 lines
4.4 KiB
Bash
Executable file
163 lines
4.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
# This test makes some basic checks that RPM macros work correctly.
|
|
# RPM is a simple C program available on different Linux distros, not only RPM-based ones,
|
|
# and even BSD systems, so it must not be a problem to require it.
|
|
# rpmspec utility is required (so this test will work with RPM 4 but won't work with RPM 5).
|
|
set -eu
|
|
|
|
BUILD_DIR="${1:?}"
|
|
RPM_MACROS_FILE="${BUILD_DIR:?}/src/rpm/macros.systemd"
|
|
|
|
if ! command -v rpm >/dev/null || ! command -v rpmspec >/dev/null; then
|
|
echo >&2 "Missing necessary utilities (rpm, rpmspec), can't continue"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${RPM_MACROS_FILE:?}" ]]; then
|
|
echo "RPM macros file not found in $RPM_MACROS_FILE!"
|
|
exit 1
|
|
fi
|
|
|
|
at_exit() {
|
|
if [[ -v WORK_DIR && -d "$WORK_DIR" ]]; then
|
|
rm -frv "$WORK_DIR"
|
|
fi
|
|
}
|
|
|
|
trap at_exit EXIT
|
|
|
|
WORK_DIR="$(mktemp -d)"
|
|
RPM_SPEC="$(mktemp "$WORK_DIR/systemd-test-rpm-macros-XXX.spec")"
|
|
TEMP_LOG="$(mktemp "$WORK_DIR/out-XXX.log")"
|
|
|
|
die() {
|
|
echo >&2 "${1:?}"
|
|
exit 1
|
|
}
|
|
|
|
mk_mini_spec() {
|
|
cat >"${RPM_SPEC:?}" <<EOF
|
|
%{load:$RPM_MACROS_FILE}
|
|
Summary: Test systemd RPM macros
|
|
Name: systemd-test-rpm-macros
|
|
License: LGPLv2+ and MIT and GPLv2+
|
|
Version: 1
|
|
Release: 1
|
|
%description
|
|
%{summary}
|
|
END_OF_INITIAL_SPEC
|
|
EOF
|
|
}
|
|
|
|
echo "=== Test basic loadability ==="
|
|
mk_mini_spec
|
|
# ensure its loadability (macros will be just loaded and not used for now)
|
|
# also check that rpm supports %load
|
|
rpmspec --parse "$RPM_SPEC"
|
|
|
|
echo "=== Test %systemd_requires ==="
|
|
mk_mini_spec
|
|
# The idea of tests is the following:
|
|
# - make a minimal spec file
|
|
# - add macros into its %description section
|
|
# - use rpmspec(8) to print spec file with expanded macros
|
|
# - check that macros have been expanded as required.
|
|
echo "%systemd_requires" >>"$RPM_SPEC"
|
|
: >"$TEMP_LOG"
|
|
rpmspec --parse "$RPM_SPEC" | tee "$TEMP_LOG"
|
|
for i in post preun postun; do
|
|
echo "== Requires($i) =="
|
|
grep "^Requires($i): systemd$" "$TEMP_LOG"
|
|
done
|
|
|
|
echo "=== Test %systemd_ordering ==="
|
|
mk_mini_spec
|
|
echo "%systemd_ordering" >>"$RPM_SPEC"
|
|
: >"$TEMP_LOG"
|
|
rpmspec --parse "$RPM_SPEC" | tee "$TEMP_LOG"
|
|
for i in post preun postun; do
|
|
echo "== OrderWithRequires($i) =="
|
|
grep "^OrderWithRequires($i): systemd$" "$TEMP_LOG"
|
|
done
|
|
|
|
echo "=== Test macros requiring an argument without specifying such argument ==="
|
|
for i in \
|
|
systemd_post \
|
|
systemd_preun \
|
|
systemd_postun \
|
|
systemd_postun_with_restart \
|
|
systemd_user_preun \
|
|
systemd_user_postun \
|
|
systemd_user_postun_with_restart \
|
|
tmpfiles_create \
|
|
tmpfiles_create_package \
|
|
sysusers_create \
|
|
sysusers_create_package
|
|
do
|
|
echo "== Macro: $i =="
|
|
mk_mini_spec
|
|
echo "%${i}" >>"$RPM_SPEC"
|
|
if rpmspec --parse "$RPM_SPEC"; then
|
|
die "Unexpected pass with macro $i (no arguments)"
|
|
fi
|
|
done
|
|
|
|
echo "=== Test macros requiring two arguments ==="
|
|
for i in \
|
|
tmpfiles_create_package \
|
|
sysusers_create_package
|
|
do
|
|
echo "== Macro: $i =="
|
|
# Test with an incorrect number of arguments (0, 1, 3)
|
|
for args in "" "arg1" "arg1 arg2 arg3"; do
|
|
mk_mini_spec
|
|
echo "%${i} $args" >>"$RPM_SPEC"
|
|
if rpmspec --parse "$RPM_SPEC"; then
|
|
die "Unexpected pass with macro $i (arguments: $args)"
|
|
fi
|
|
done
|
|
|
|
# Test with the correct number of arguments (2)
|
|
mk_mini_spec
|
|
echo "%${i} arg1 arg2" >>"$RPM_SPEC"
|
|
if ! rpmspec --parse "$RPM_SPEC"; then
|
|
die "Unexpected fail with macro $i (arguments: $args)"
|
|
fi
|
|
done
|
|
|
|
|
|
# Test that:
|
|
# - *_create_package macros do work correctly
|
|
# - shell syntax is correct (https://github.com/systemd/systemd/commit/93406fd37)
|
|
# - RPM macros, loaded from macros.in, are actually expanded
|
|
echo "=== Test %*_create_package macros ==="
|
|
for i in sysusers tmpfiles; do
|
|
echo "== Macro: ${i}_create_package =="
|
|
|
|
PKG_DATA_FILE="$(mktemp "$WORK_DIR/pkg-data-XXX")"
|
|
EXP_OUT="$(mktemp "$WORK_DIR/exp-out-XXX.log")"
|
|
CONF_DIR="$(pkg-config --variable="${i}dir" systemd)"
|
|
EXTRA_ARGS=()
|
|
|
|
if [[ "$i" == tmpfiles ]]; then
|
|
EXTRA_ARGS+=("--create")
|
|
fi
|
|
|
|
echo "TEST_DATA" >"$PKG_DATA_FILE"
|
|
mk_mini_spec
|
|
echo "%${i}_create_package TEST_NAME ${PKG_DATA_FILE}" >>"$RPM_SPEC"
|
|
|
|
cat >"$EXP_OUT" <<EOF
|
|
systemd-$i --replace=$CONF_DIR/TEST_NAME.conf ${EXTRA_ARGS[*]:+${EXTRA_ARGS[@]} }- <<SYSTEMD_INLINE_EOF || :
|
|
TEST_DATA
|
|
SYSTEMD_INLINE_EOF
|
|
EOF
|
|
|
|
: >"$TEMP_LOG"
|
|
rpmspec --parse "$RPM_SPEC" | tee "$TEMP_LOG"
|
|
diff "$EXP_OUT" <(grep -A1 -B1 '^TEST_DATA$' "$TEMP_LOG")
|
|
|
|
rm -f "$PKG_DATA_FILE"
|
|
done
|