Files
podman/test/system/130-kill.bats
Paul Holzinger 247a80db45 test/system: remove distro-integration bats tag
The distro-integration tag was added for fedora openQA to only run a
subset of tests. However since it was added only a few new tests have
been labelled like that and in general a normal contributor or even
maintianer has no idea when to add this tag.

We also have been seeing several regressions getting into fedora that
these tests would have caught. As such I worked with Adam to enable all
tests for fedora openQA so we actually have proper coverage. This has
been working for a few weeks so I think we can dop these tags so
upstream does not need to bother with them at all.

https://pagure.io/fedora-qa/os-autoinst-distri-fedora/issue/373

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2025-09-02 12:10:08 +02:00

162 lines
6.1 KiB
Bash

#!/usr/bin/env bats -*- bats -*-
#
# tests for podman kill
#
load helpers
# bats test_tags=ci:parallel
@test "podman kill - test signal handling in containers" {
local cname=c-$(safename)
local fifo=${PODMAN_TMPDIR}/podman-kill-fifo.$(random_string 10)
mkfifo $fifo
# Start a container that will handle all signals by emitting 'got: N'
local -a signals=(1 2 3 4 5 6 8 10 12 13 14 15 16 20 21 22 23 24 25 26 64)
$PODMAN run --name $cname $IMAGE sh -c \
"for i in ${signals[*]}; do trap \"echo got: \$i\" \$i; done;
echo READY;
while ! test -e /stop; do sleep 0.1; done;
echo DONE" &>$fifo </dev/null &
podman_run_pid=$!
# Open the FIFO for reading, and keep it open. This prevents a race
# condition in which the container can exit (e.g. if for some reason
# it doesn't handle the signal) and we (this test) try to read from
# the FIFO. Since there wouldn't be an active writer, the open()
# would hang forever. With this exec we keep the FD open, allowing
# 'read -t' to time out and report a useful error.
exec 5<$fifo
# First container emits READY when ready; wait for it.
read -t 60 -u 5 ready
is "$ready" "READY" "first log message from container"
# Helper function: send the given signal, verify that it's received.
kill_and_check() {
local signal=$1
local signum=${2:-$1} # e.g. if signal=HUP, we expect to see '1'
run_podman kill -s $signal $cname
read -t 60 -u 5 actual || die "Timed out: no ACK for kill -s $signal"
is "$actual" "got: $signum" "Signal $signal handled by container"
}
# Send signals in random order; make sure each one is received
for s in $(fmt --width=2 <<< "${signals[*]}" | sort --random-sort);do
kill_and_check $s
done
# Variations: with leading dash; by name, with/without dash or SIG
kill_and_check -1 1
kill_and_check -INT 2
kill_and_check FPE 8
kill_and_check -SIGUSR1 10
kill_and_check SIGUSR2 12
# Done. Tell the container to stop, and wait for final DONE.
# The '-d' is because container exit is racy: the exec process itself
# could get caught and killed by cleanup, causing this step to exit 137
run_podman exec -d $cname touch /stop
read -t 5 -u 5 done || die "Timed out waiting for DONE from container"
is "$done" "DONE" "final log message from container"
# Clean up
run_podman rm -f -t0 $cname
wait $podman_run_pid || die "wait for podman run failed"
}
# bats test_tags=ci:parallel
@test "podman kill - rejects invalid args" {
# These errors are thrown by the imported docker/signal.ParseSignal()
local -a bad_signal_names=(0 SIGBADSIG SIG BADSIG %% ! "''" '""' " ")
for s in ${bad_signal_names[@]}; do
# 'nosuchcontainer' is fine: podman should bail before it gets there
run_podman 125 kill -s $s nosuchcontainer
is "$output" "Error: invalid signal: $s" "Error from kill -s $s"
run_podman 125 pod kill -s $s nosuchpod
is "$output" "Error: invalid signal: $s" "Error from pod kill -s $s"
done
# Special case: these too are thrown by docker/signal.ParseSignal(),
# but the dash sign is stripped by our wrapper in utils, so the
# error message doesn't include the dash.
local -a bad_dash_signals=(-0 -SIGBADSIG -SIG -BADSIG -)
for s in ${bad_dash_signals[@]}; do
run_podman 125 kill -s $s nosuchcontainer
is "$output" "Error: invalid signal: ${s##-}" "Error from kill -s $s"
done
# This error (signal out of range) is thrown by our wrapper
local -a bad_signal_nums=(65 -65 96 999 99999999)
for s in ${bad_signal_nums[@]}; do
run_podman 125 kill -s $s nosuchcontainer
is "$output" "Error: valid signals are 1 through 64" \
"Error from kill -s $s"
done
# 'podman create' uses the same parsing code
run_podman 125 create --stop-signal=99 $IMAGE
is "$output" "Error: valid signals are 1 through 64" "podman create"
}
# CANNOT BE PARALLELIZED: kill -a
@test "podman kill - print IDs or raw input" {
# kill -a must print the IDs
run_podman run --rm -d $IMAGE top
ctrID="$output"
run_podman kill -a
is "$output" "$ctrID"
# kill $input must print $input
cname=c-$(safename)
run_podman run --rm -d --name $cname $IMAGE top
run_podman kill $cname
is "$output" $cname
}
# bats test_tags=ci:parallel
@test "podman kill - concurrent stop" {
# 14761 - concurrent kill/stop must record the exit code
cname=c-$(safename)
run_podman run -d --replace --name=$cname $IMAGE sh -c "trap 'echo Received SIGTERM, ignoring' SIGTERM; echo READY; while :; do sleep 0.2; done"
$PODMAN stop -t 1 $cname &
run_podman kill $cname
run_podman wait $cname
run_podman rm -f $cname
}
# bats test_tags=ci:parallel
@test "podman wait - exit codes" {
cname=c-$(safename)
run_podman create --name=$cname $IMAGE /no/such/command
run_podman container inspect --format "{{.State.StoppedByUser}}" $cname
is "$output" "false" "container not marked to be stopped by a user"
# Container never ran -> exit code == 0
run_podman wait $cname
# Container did not start successfully -> exit code != 0
run_podman 125 start $cname
# FIXME(#14873): while older Podmans return 0 on wait, Docker does not.
run_podman wait $cname
run_podman rm $cname
}
# bats test_tags=ci:parallel
@test "podman kill - no restart" {
ctr=c-$(safename)
run_podman run -d --restart=always --name=$ctr $IMAGE \
sh -c "trap 'exit 42' SIGTERM; echo READY; while :; do sleep 0.2; done"
run_podman container inspect --format "{{.State.Status}}" $ctr
is "$output" "running" "make sure container is running"
# Send SIGTERM and make sure the container exits.
run_podman kill -s=TERM $ctr
run_podman wait $ctr
is "$output" "42" "container exits with 42 on receiving SIGTERM"
run_podman container inspect --format "{{.State.StoppedByUser}}" $ctr
is "$output" "true" "container is marked to be stopped by a user"
run_podman rm $ctr
}
# vim: filetype=sh