BATS and APIv2: more tests and tweaks

- (minor): apiv2 tests: check for full ID

   Observation made while reviewing #6461: tests were checking
   only for a 12-character container/image ID in return value.
   It's actually 64, and we should test for that. This should
   also minimize confusion in a future maintainer.

 - podman pause/unpause: new test

   Runs a 'date/sleep' loop, pauses container, sleeps 3s,
   restarts, then confirms that there's a 3- to 6-second
   gap in the logs for the container.

 - podman healthcheck: new test

   run a container with healthcheck, test both healthy
   and unhealthy conditions

 - podman pod: check '{{.Pod}}' field in podman ps

   Hey, as long as we have a pod with two running
   containers, might as well confirm that 'podman ps'
   returns the expected pod ID.

Signed-off-by: Ed Santiago <santiago@redhat.com>
This commit is contained in:
Ed Santiago 2020-06-03 13:18:07 -06:00
parent 1f8c509faf
commit 2d5a2a7640
4 changed files with 183 additions and 3 deletions

View file

@ -19,7 +19,7 @@ t GET libpod/containers/json 200 length=0
t GET libpod/containers/json?all=true 200 \
length=1 \
.[0].Id~[0-9a-f]\\{12\\} \
.[0].Id~[0-9a-f]\\{64\\} \
.[0].Image=$IMAGE \
.[0].Command[0]="true" \
.[0].State~\\\(exited\\\|stopped\\\) \
@ -33,7 +33,7 @@ t DELETE libpod/containers/$cid 204
CNAME=myfoo
podman run --name $CNAME $IMAGE -td top
t GET libpod/containers/json?all=true 200 \
.[0].Id~[0-9a-f]\\{12\\}
.[0].Id~[0-9a-f]\\{64\\}
cid=$(jq -r '.[0].Id' <<<"$output")
# No such container
@ -45,7 +45,7 @@ t POST "libpod/commit?container=$CNAME&$cparam" '' 500
# Commit a new image from the container
t POST "libpod/commit?container=$CNAME" '' 200 \
.Id~[0-9a-f]\\{12\\}
.Id~[0-9a-f]\\{64\\}
iid=$(jq -r '.Id' <<<"$output")
t GET libpod/images/$iid/json 200 \
.RepoTags[0]=null \

View file

@ -0,0 +1,58 @@
#!/usr/bin/env bats -*- bats -*-
#
# tests for podman pause/unpause functionality
#
load helpers
@test "podman pause/unpause" {
skip_if_rootless "pause does not work rootless"
cname=$(random_string 10)
run_podman run -d --name $cname $IMAGE \
sh -c 'while :;do date +%s;sleep 1;done'
cid="$output"
# Wait for first time value
wait_for_output '[0-9]\{10,\}' $cid
# Pause container, sleep a bit, unpause, sleep again to give process
# time to write a new post-restart time value. Pause by CID, unpause
# by name, just to exercise code paths. While paused, check 'ps'
# and 'inspect', then check again after restarting.
run_podman pause $cid
run_podman inspect --format '{{.State.Status}}' $cid
is "$output" "paused" "podman inspect .State.Status"
sleep 3
run_podman ps -a --format '{{.ID}} {{.Names}} {{.Status}}'
is "$output" "${cid:0:12} $cname paused" "podman ps on paused container"
run_podman unpause $cname
run_podman ps -a --format '{{.ID}} {{.Names}} {{.Status}}'
is "$output" "${cid:0:12} $cname Up .*" "podman ps on resumed container"
sleep 1
# Get full logs, and iterate through them computing delta_t between entries
run_podman logs $cid
i=1
max_delta=0
while [ $i -lt ${#lines[*]} ]; do
this_delta=$(( ${lines[$i]} - ${lines[$(($i - 1))]} ))
if [ $this_delta -gt $max_delta ]; then
max_delta=$this_delta
fi
i=$(( $i + 1 ))
done
# There should be a 3-4 second gap, *maybe* 5. Never 1 or 2, that
# would imply that the container never paused.
is "$max_delta" "[3456]" "delta t between paused and restarted"
run_podman rm -f $cname
# Pause/unpause on nonexistent name or id - these should all fail
run_podman 125 pause $cid
run_podman 125 pause $cname
run_podman 125 unpause $cid
run_podman 125 unpause $cname
}
# vim: filetype=sh

View file

@ -73,6 +73,12 @@ function teardown() {
run_podman run -d --pod $podname $IMAGE nc -l -p $port
cid1="$output"
# (While we're here, test the 'Pod' field of 'podman ps'. Expect two ctrs)
run_podman ps --format '{{.Pod}}'
newline="
"
is "$output" "${podid:0:12}${newline}${podid:0:12}" "sdfdsf"
# Talker: send the message via common port on localhost
message=$(random_string 15)
run_podman run --rm --pod $podname $IMAGE \

View file

@ -0,0 +1,116 @@
#!/usr/bin/env bats -*- bats -*-
#
# tests for podman healthcheck
#
#
load helpers
# Helper function: run 'podman inspect' and check various given fields
function _check_health {
local testname="$1"
local tests="$2"
run_podman inspect --format json healthcheck_c
parse_table "$tests" | while read field expect;do
# (kludge to deal with parse_table and empty strings)
if [ "$expect" = "''" ]; then expect=""; fi
actual=$(jq -r ".[0].State.Healthcheck.$field" <<<"$output")
is "$actual" "$expect" "$testname - .State.Healthcheck.$field"
done
}
@test "podman healthcheck" {
# Create an image with a healthcheck script; said script will
# pass until the file /uh-oh gets created (by us, via exec)
cat >${PODMAN_TMPDIR}/healthcheck <<EOF
#!/bin/sh
if test -e /uh-oh; then
echo "Uh-oh on stdout!"
echo "Uh-oh on stderr!" >&2
exit 1
else
echo "Life is Good on stdout"
echo "Life is Good on stderr" >&2
exit 0
fi
EOF
cat >${PODMAN_TMPDIR}/entrypoint <<EOF
#!/bin/sh
while :; do
sleep 1
done
EOF
cat >${PODMAN_TMPDIR}/Containerfile <<EOF
FROM $IMAGE
COPY healthcheck /healthcheck
COPY entrypoint /entrypoint
RUN chmod 755 /healthcheck /entrypoint
CMD ["/entrypoint"]
EOF
run_podman build -t healthcheck_i ${PODMAN_TMPDIR}
# Run that healthcheck image.
run_podman run -d --name healthcheck_c \
--health-cmd /healthcheck \
--health-interval 1s \
--health-retries 3 \
healthcheck_i
# We can't check for 'starting' because a 1-second interval is too
# short; it could run healthcheck before we get to our first check.
#
# So, just force a healthcheck run, then confirm that it's running.
run_podman healthcheck run healthcheck_c
is "$output" "healthy" "output from 'podman healthcheck run'"
_check_health "All healthy" "
Status | healthy
FailingStreak | 0
Log[-1].ExitCode | 0
Log[-1].Output |
"
# Force a failure
run_podman exec healthcheck_c touch /uh-oh
sleep 2
_check_health "First failure" "
Status | healthy
FailingStreak | [123]
Log[-1].ExitCode | 1
Log[-1].Output |
"
# After three successive failures, container should no longer be healthy
sleep 5
_check_health "Three or more failures" "
Status | unhealthy
FailingStreak | [3456]
Log[-1].ExitCode | 1
Log[-1].Output |
"
# healthcheck should now fail, with exit status 1 and 'unhealthy' output
run_podman 1 healthcheck run healthcheck_c
is "$output" "unhealthy" "output from 'podman healthcheck run'"
# Clean up
run_podman rm -f healthcheck_c
run_podman rmi healthcheck_i
}
# vim: filetype=sh