mirror of
https://github.com/containers/podman.git
synced 2025-05-17 15:18:43 +08:00

For the past two months we've been splitting system tests into two categories: those that CAN be run in parallel, and those that CANNOT. Much work has been done to replace hardcoded names (mycontainer, mypod) with safename(). Hundreds of test runs, in CI and on Ed's laptop, have proven this approach viable. make {local,remote}system now runs in two steps: first the serial ones, then the parallel ones. hack/bats will now recognize the 'ci:parallel' tag and add --jobs (nprocs). This requires some tweaking of leak_check, because there can be umpteen tests running (affecting image/container/pod/etc state) when any given test completes. Rules for enabling parallelization in tests: * use unique container/pod/volume/network names (safename) * do not run 'podman rm -a' or 'rmi -a' * never use the -l (--latest) option * do not run 'podman ps/images' and expect precise output Signed-off-by: Ed Santiago <santiago@redhat.com>
156 lines
4.9 KiB
Bash
Executable File
156 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# bats wrapper - invokes bats, root & rootless, on podman system tests
|
|
#
|
|
|
|
###############################################################################
|
|
# BEGIN usage message
|
|
|
|
usage="Usage: $0 [--root] [--rootless] [FILENAME-PATTERN[:TEST-PATTERN]]
|
|
|
|
$0 is a wrapper for invoking podman system tests.
|
|
|
|
--root Run only as root
|
|
--rootless Run only as user (i.e. you)
|
|
--remote Run with podman-remote (see below)
|
|
|
|
FILENAME-PATTERN Run only test files that match 'test/system/*name*',
|
|
e.g. '500' or 'net' will match 500-networking.bats.
|
|
|
|
TEST-PATTERN When appended to a filename-pattern, and you have a
|
|
modern-enough version of bats installed (i.e. Fedora
|
|
but not RHEL), runs with '--filter TEST-PATTERN' which
|
|
runs only subtests within FILENAME-PATTERH whose names
|
|
match that string.
|
|
|
|
--tag=TAG Passed on to bats as '--filter-tags TAG'
|
|
As of 2023-07-26 the only tag used is 'distro-integration'
|
|
|
|
-T Passed on to bats, which will then show timing data
|
|
|
|
--help display usage message
|
|
|
|
By default, tests ./bin/podman. To test a different podman, do:
|
|
|
|
\$ env PODMAN=/abs/path/to/podman $0 ....
|
|
|
|
To test podman-remote, start your own servers (root and rootless) via:
|
|
|
|
\$ bin/podman system service --timeout=0 &
|
|
\$ sudo !!
|
|
|
|
...then invoke this script with --remote. (This script can't start the
|
|
servers, because we can sudo *starting* the service but can't sudo
|
|
stopping it: by the time the bats tests finish, the sudo timeout will
|
|
have expired. We apologize for the inconvenience.)
|
|
|
|
$0 also passes through \$OCI_RUNTIME, should you need to test that.
|
|
|
|
Examples:
|
|
|
|
\$ $0 220:\"restart cleans up\"
|
|
... only the \"restart cleans up\" test in 220-healthcheck.bats
|
|
|
|
\$ $0 --root 160:\"ps -f\"
|
|
... runs all tests in 160-volumes.bats that match \"ps -f\" (root only)
|
|
"
|
|
|
|
# END usage message
|
|
###############################################################################
|
|
# BEGIN initialization and command-line arg checking
|
|
|
|
# By default, test the podman in our working directory.
|
|
# Some tests cd out of our workdir, so abs path is important
|
|
export PODMAN=${PODMAN:-$(pwd)/bin/podman}
|
|
export QUADLET=${QUADLET:-$(pwd)/bin/quadlet}
|
|
|
|
# Directory in which
|
|
TESTS=test/system
|
|
|
|
REMOTE=
|
|
TEST_ROOT=1
|
|
TEST_ROOTLESS=1
|
|
|
|
declare -a bats_opts=()
|
|
|
|
declare -a bats_filter=()
|
|
|
|
for i;do
|
|
value=`expr "$i" : '[^=]*=\(.*\)'`
|
|
case "$i" in
|
|
-h|--help) echo "$usage"; exit 0;;
|
|
--root) TEST_ROOTLESS= ;;
|
|
--rootless) TEST_ROOT= ;;
|
|
--remote) REMOTE=remote ;;
|
|
--ts|-T) bats_opts+=("-T") ;;
|
|
--tag=*) bats_filter=("--filter-tags" "$value")
|
|
if [[ "$value" = "ci:parallel" ]]; then
|
|
bats_opts+=("--jobs" $(nproc))
|
|
fi;;
|
|
*/*.bats) TESTS=$i ;;
|
|
*)
|
|
if [[ $i =~ : ]]; then
|
|
tname=${i%:*} # network:localhost -> network
|
|
filt=${i#*:} # network:localhost -> localhost
|
|
TESTS=$(echo $TESTS/*$tname*.bats)
|
|
bats_filter=("--filter" "$filt")
|
|
else
|
|
TESTS=$(echo $TESTS/*$i*.bats)
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# With --remote, use correct binary and make sure daem--I mean server--is live
|
|
if [[ "$REMOTE" ]]; then
|
|
if ! [[ $PODMAN =~ -remote ]]; then
|
|
PODMAN=${PODMAN}-remote
|
|
fi
|
|
|
|
if [[ -n "$TEST_ROOT" ]]; then
|
|
sudo $PODMAN info >/dev/null || exit 1
|
|
fi
|
|
if [[ -n "$TEST_ROOTLESS" ]]; then
|
|
$PODMAN info >/dev/null || exit 1
|
|
fi
|
|
fi
|
|
|
|
# END initialization and command-line arg checking
|
|
###############################################################################
|
|
|
|
rc=0
|
|
|
|
# As of 2021-11 podman has a bunch of external helper binaries
|
|
if [[ -z "$CONTAINERS_HELPER_BINARY_DIR" ]]; then
|
|
export CONTAINERS_HELPER_BINARY_DIR=$(pwd)/bin
|
|
fi
|
|
|
|
# Used in 120-load test to identify rootless destination for podman image scp
|
|
export PODMAN_ROOTLESS_USER=$(id -un)
|
|
|
|
# Make sure to always check for leaks when running locally
|
|
export PODMAN_BATS_LEAK_CHECK=1
|
|
|
|
# Root
|
|
if [[ "$TEST_ROOT" ]]; then
|
|
echo "# bats ${bats_opts[*]} ${bats_filter[*]} $TESTS"
|
|
sudo --preserve-env=PODMAN \
|
|
--preserve-env=QUADLET \
|
|
--preserve-env=PODMAN_TEST_DEBUG \
|
|
--preserve-env=OCI_RUNTIME \
|
|
--preserve-env=CONTAINERS_HELPER_BINARY_DIR \
|
|
--preserve-env=PODMAN_ROOTLESS_USER \
|
|
bats "${bats_opts[@]}" "${bats_filter[@]}" $TESTS
|
|
rc=$?
|
|
fi
|
|
|
|
# Rootless. (Only if we're not already root)
|
|
if [[ "$TEST_ROOTLESS" && "$(id -u)" != 0 ]]; then
|
|
echo "--------------------------------------------------"
|
|
echo "\$ bats ${bats_opts[*]} ${bats_filter[*]} $TESTS"
|
|
bats "${bats_opts[@]}" "${bats_filter[@]}" $TESTS
|
|
rc=$((rc | $?))
|
|
fi
|
|
|
|
exit $rc
|