From b92c3df242f9a99cb628336e2096a4716cdabc1e Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Thu, 7 Jul 2022 20:00:46 +0200 Subject: [PATCH 1/2] test: allow multiple handlers for the EXIT signal Bash allows only one handler per signal, so let's overcome this limitation by having one dedicated EXIT signal which runs all registered handlers from all over the place. --- test/test-functions | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/test/test-functions b/test/test-functions index acb09c20be..5ca3ccfa84 100644 --- a/test/test-functions +++ b/test/test-functions @@ -60,6 +60,33 @@ get_bool() { fi } +# Since in Bash we can have only one handler per signal, let's overcome this +# limitation by having one global handler for the EXIT signal which executes +# all registered handlers +_AT_EXIT_HANDLERS=() +_at_exit() { + set +e + + # Run the EXIT handlers in reverse order + for ((i = ${#_AT_EXIT_HANDLERS[@]} - 1; i >= 0; i--)); do + ddebug "Running EXIT handler '${_AT_EXIT_HANDLERS[$i]}'" + "${_AT_EXIT_HANDLERS[$i]}" + done +} + +trap _at_exit EXIT + +add_at_exit_handler() { + local handler="${1?}" + + if [[ "$(type -t "$handler")" != "function" ]]; then + dfatal "'$handler' is not a function" + exit 1 + fi + + _AT_EXIT_HANDLERS+=("$handler") +} + # Decide if we can (and want to) run qemu with KVM acceleration. # Check if nested KVM is explicitly enabled (TEST_NESTED_KVM). If not, # check if it's not explicitly disabled (TEST_NO_KVM) and we're not already @@ -1238,7 +1265,7 @@ cleanup_loopdev() { fi } -trap cleanup_loopdev EXIT INT QUIT PIPE +add_at_exit_handler cleanup_loopdev create_empty_image() { if [ -z "${IMAGE_NAME:=}" ]; then From 0a62b8f7057239cd9831a83f25086fca8f3353a7 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Thu, 7 Jul 2022 20:02:06 +0200 Subject: [PATCH 2/2] test: avoid overriding an already existing EXIT handler TEST-70 specified its own EXIT handler, which replaced the `cleanup_loopdev` handler, so the loop device was always hanging around once this test was run. Let's use the new `add_at_exit_handler()` stuff to mitigate this. --- test/TEST-70-TPM2/test.sh | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/test/TEST-70-TPM2/test.sh b/test/TEST-70-TPM2/test.sh index b78670d051..baf75aaf11 100755 --- a/test/TEST-70-TPM2/test.sh +++ b/test/TEST-70-TPM2/test.sh @@ -14,7 +14,6 @@ command -v swtpm >/dev/null 2>&1 || exit 0 command -v tpm2_pcrextend >/dev/null 2>&1 || exit 0 test_append_files() { - ( local workspace="${1:?}" instmods tpm tpm_tis tpm_ibmvtpm @@ -26,20 +25,24 @@ test_append_files() { if get_bool "$LOOKS_LIKE_DEBIAN"; then inst_library "/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/libgcc_s.so.1" fi - ) } -machine="$(uname -m)" -tpmdevice="tpm-tis" -if [ "$machine" = "ppc64le" ]; then +TEST_70_TPM_DEVICE="tpm-tis" +if [[ "$(uname -m)" == "ppc64le" ]]; then # tpm-spapr support was introduced in qemu 5.0.0. Skip test for old qemu versions. qemu_min_version "5.0.0" || exit 0 - tpmdevice="tpm-spapr" + TEST_70_TPM_DEVICE="tpm-spapr" fi -tpmstate=$(mktemp -d) -swtpm socket --tpm2 --tpmstate dir="$tpmstate" --ctrl type=unixio,path="$tpmstate/sock" & -trap 'kill %%; rm -rf $tpmstate' SIGINT EXIT -QEMU_OPTIONS="-chardev socket,id=chrtpm,path=$tpmstate/sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device $tpmdevice,tpmdev=tpm0" +TEST_70_at_exit() { + [[ -n "${TEST_70_SWTPM_PID:-}" ]] && kill "$TEST_70_SWTPM_PID" &>/dev/null + [[ -n "${TEST_70_TPM_STATE:-}" ]] && rm -rf "$TEST_70_TPM_STATE" +} + +TEST_70_TPM_STATE="$(mktemp -d)" +swtpm socket --tpm2 --tpmstate dir="$TEST_70_TPM_STATE" --ctrl type=unixio,path="$TEST_70_TPM_STATE/sock" & +TEST_70_SWTPM_PID=$! +add_at_exit_handler TEST_70_at_exit +QEMU_OPTIONS+=" -chardev socket,id=chrtpm,path=$TEST_70_TPM_STATE/sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device $TEST_70_TPM_DEVICE,tpmdev=tpm0" do_test "$@"