#!/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, --tap Passed on to bats, which will format output in TAP format -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.) 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_DIR=test/system REMOTE= TEST_ROOT=1 TEST_ROOTLESS=1 declare -a bats_opts=() declare -a bats_filter=() declare -a TESTS for i;do value=`expr "$i" : '[^=]*=\(.*\)'` case "$i" in -h|--help) echo "$usage"; exit 0;; --root) TEST_ROOTLESS= ;; --rootless) TEST_ROOT= ;; --remote) REMOTE=remote ;; --tap|-t) bats_opts+=("-t") ;; --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_DIR/*$tname*.bats)) bats_filter=("--filter" "$filt") else TESTS+=($(echo $TESTS_DIR/*$i*.bats)) fi ;; esac done if [ ${#TESTS[@]} -eq 0 ] ; then TESTS=("$TESTS_DIR") fi # 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=${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=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