#!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later # shellcheck disable=SC2064 set -eux set -o pipefail root_mock() { local root="${1:?}" mkdir -p "$root" # Put a tmpfs over the "root", so we're able to remount it as read-only # when needed mount -t tmpfs tmpfs "$root" mkdir "$root/etc" "$root/run" } root_cleanup() { local root="${1:?}" umount --recursive "$root" rm -fr "$root" } testcase_sanity() { systemd-machine-id-setup systemd-machine-id-setup --help systemd-machine-id-setup --version systemd-machine-id-setup --print systemd-machine-id-setup --root= --print systemd-machine-id-setup --root=/ --print (! systemd-machine-id-setup "") (! systemd-machine-id-setup --foo) } testcase_invalid() { local root machine_id root="$(mktemp -d)" trap "root_cleanup $root" RETURN root_mock "$root" systemd-machine-id-setup --print --root "$root" echo abc >>"$root/etc/machine-id" machine_id="$(systemd-machine-id-setup --print --root "$root")" diff <(echo "$machine_id") "$root/etc/machine-id" } testcase_transient() { local root transient_id committed_id root="$(mktemp -d)" trap "root_cleanup $root" RETURN root_mock "$root" systemd-machine-id-setup --print --root "$root" echo abc >>"$root/etc/machine-id" mount -o remount,ro "$root" mount -t tmpfs tmpfs "$root/run" transient_id="$(systemd-machine-id-setup --print --root "$root")" mount -o remount,rw "$root" committed_id="$(systemd-machine-id-setup --print --commit --root "$root")" [[ "$transient_id" == "$committed_id" ]] diff "$root/etc/machine-id" "$root/run/machine-id" } # Check if we correctly processed the invalid machine ID we set up in the respective # test.sh file systemctl --state=failed --no-legend --no-pager >/failed test ! -s /failed # Create a list of all functions prefixed with testcase_ mapfile -t TESTCASES < <(declare -F | awk '$3 ~ /^testcase_/ {print $3;}') if [[ "${#TESTCASES[@]}" -eq 0 ]]; then echo >&2 "No test cases found, this is most likely an error" exit 1 fi for testcase in "${TESTCASES[@]}"; do "$testcase" done