summaryrefslogtreecommitdiff
path: root/hack/bats
blob: cd81a9c73629e820d5c3157fdff9d510dfcf852b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/bash
#
# bats wrapper - invokes bats, root & rootless, on podman system tests
#

###############################################################################
# BEGIN usage message

usage="Usage: $0 [--root] [--rootless] [--filter=filename[:testname]]

$0 is a wrapper for invoking podman system tests.

   --root         Run only as root
   --rootless     Run only as user (i.e. you)

   --filter=name  Run only test files that match 'test/system/*name*',
                  e.g. '500' or 'net' will match 500-networking.bats.
                  If ':pattern' is appended, and you have a modern-enough
                  version of bats installed, runs with '--filter pattern'
                  which runs only subtests that match 'pattern'

   -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:

    \$ PODMAN=/abs/path/to/podman $0 ....

To test podman-remote, start your own servers (root and rootless) via:

    /path/to/podman system service --timeout=0

...then invoke this script with PODMAN=\$(pwd)/bin/podman-remote

   (You'd think Ed could be bothered to do all that in this script; but then
   the flow would be 'sudo start-service; sudo run-bats; sudo stop-service'
   and by the time we get to stop-service, the sudo timeout will have lapsed,
   and the script will be hanging at the password prompt, and you, who left
   your desk for coffee or a walk and expected to come back to completed
   root and rootless tests, will be irked because only root tests ran and
   now you have to wait for rootless).

$0 also passes through \$OCI_RUNTIME, should you need to test that.
"

# 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}

# Because 'make' doesn't do this by default
chcon -t container_runtime_exec_t $PODMAN

# Directory in which
TESTS=test/system

REMOTE=
ROOT_ONLY=
ROOTLESS_ONLY=

declare -a bats_opts=()

declare -a bats_filter=()

for i;do
    value=`expr "$i" : '[^=]*=\(.*\)'`
    case "$i" in
        -h|--help)  echo "$usage"; exit 0;;
        --root)     ROOT_ONLY=1 ;;
        --rootless) ROOTLESS_ONLY=1 ;;
        --remote)   REMOTE=remote; echo "--remote is TBI"; exit 1;;
        --ts|-T)    bats_opts+=("-T") ;;
        */*.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

# 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

# Root
if [ -z "$ROOTLESS_ONLY" ]; then
    echo "# bats ${bats_filter[@]} $TESTS"
    sudo    --preserve-env=PODMAN \
            --preserve-env=PODMAN_TEST_DEBUG \
            --preserve-env=OCI_RUNTIME \
            --preserve-env=CONTAINERS_HELPER_BINARY_DIR \
            bats "${bats_opts[@]}" "${bats_filter[@]}" $TESTS
    rc=$?
fi

# Rootless. (Only if we're not already root)
if [[ -z "$ROOT_ONLY" && "$(id -u)" != 0 ]]; then
    echo "--------------------------------------------------"
    echo "\$ bats ${bats_filter[@]} $TESTS"
    bats "${bats_opts[@]}" "${bats_filter[@]}" $TESTS
    rc=$((rc | $?))
fi

exit $rc