2017-03-07 07:11:40 +08:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
BUILDAH_BINARY=${BUILDAH_BINARY:-$(dirname ${BASH_SOURCE})/../buildah}
|
2017-06-29 02:34:41 +08:00
|
|
|
IMGTYPE_BINARY=${IMGTYPE_BINARY:-$(dirname ${BASH_SOURCE})/../imgtype}
|
2017-03-07 07:11:40 +08:00
|
|
|
TESTSDIR=${TESTSDIR:-$(dirname ${BASH_SOURCE})}
|
2017-06-17 02:21:43 +08:00
|
|
|
STORAGE_DRIVER=${STORAGE_DRIVER:-vfs}
|
2017-07-21 01:41:51 +08:00
|
|
|
PATH=$(dirname ${BASH_SOURCE})/..:${PATH}
|
2017-03-07 07:11:40 +08:00
|
|
|
|
2019-04-02 05:56:29 +08:00
|
|
|
# Default timeout for a buildah command.
|
2019-04-03 21:38:25 +08:00
|
|
|
BUILDAH_TIMEOUT=${BUILDAH_TIMEOUT:-300}
|
2019-04-02 05:56:29 +08:00
|
|
|
|
2017-03-07 07:11:40 +08:00
|
|
|
function setup() {
|
2018-05-18 05:50:13 +08:00
|
|
|
suffix=$(dd if=/dev/urandom bs=12 count=1 status=none | od -An -tx1 | sed -e 's, ,,g')
|
|
|
|
TESTDIR=${BATS_TMPDIR}/tmp${suffix}
|
2017-03-08 04:54:51 +08:00
|
|
|
rm -fr ${TESTDIR}
|
|
|
|
mkdir -p ${TESTDIR}/{root,runroot}
|
2017-03-07 07:11:40 +08:00
|
|
|
}
|
|
|
|
|
2017-03-28 15:01:59 +08:00
|
|
|
function starthttpd() {
|
2017-03-30 03:50:32 +08:00
|
|
|
pushd ${2:-${TESTDIR}} > /dev/null
|
2018-04-19 16:52:24 +08:00
|
|
|
go build -o serve ${TESTSDIR}/serve/serve.go
|
2017-03-28 15:01:59 +08:00
|
|
|
HTTP_SERVER_PORT=$((RANDOM+32768))
|
|
|
|
./serve ${HTTP_SERVER_PORT} ${1:-${BATS_TMPDIR}} &
|
|
|
|
HTTP_SERVER_PID=$!
|
|
|
|
popd > /dev/null
|
|
|
|
}
|
|
|
|
|
|
|
|
function stophttpd() {
|
|
|
|
if test -n "$HTTP_SERVER_PID" ; then
|
|
|
|
kill -HUP ${HTTP_SERVER_PID}
|
|
|
|
unset HTTP_SERVER_PID
|
|
|
|
unset HTTP_SERVER_PORT
|
|
|
|
fi
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2017-03-07 07:11:40 +08:00
|
|
|
function teardown() {
|
2017-03-28 15:01:59 +08:00
|
|
|
stophttpd
|
2017-03-08 04:54:51 +08:00
|
|
|
rm -fr ${TESTDIR}
|
2017-03-07 07:11:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function createrandom() {
|
|
|
|
dd if=/dev/urandom bs=1 count=${2:-256} of=${1:-${BATS_TMPDIR}/randomfile} status=none
|
|
|
|
}
|
|
|
|
|
|
|
|
function buildah() {
|
2017-06-29 05:07:58 +08:00
|
|
|
${BUILDAH_BINARY} --debug --registries-conf ${TESTSDIR}/registries.conf --root ${TESTDIR}/root --runroot ${TESTDIR}/runroot --storage-driver ${STORAGE_DRIVER} "$@"
|
2017-03-07 07:11:40 +08:00
|
|
|
}
|
2017-05-23 00:08:20 +08:00
|
|
|
|
|
|
|
function imgtype() {
|
2018-09-04 19:52:09 +08:00
|
|
|
${IMGTYPE_BINARY} -debug -root ${TESTDIR}/root -runroot ${TESTDIR}/runroot -storage-driver ${STORAGE_DRIVER} "$@"
|
2017-05-23 00:08:20 +08:00
|
|
|
}
|
2018-09-03 19:20:52 +08:00
|
|
|
|
2019-04-02 05:56:29 +08:00
|
|
|
#################
|
|
|
|
# run_buildah # Invoke buildah, with timeout, using BATS 'run'
|
|
|
|
#################
|
|
|
|
#
|
|
|
|
# This is the preferred mechanism for invoking buildah:
|
|
|
|
#
|
|
|
|
# * we use 'timeout' to abort (with a diagnostic) if something
|
|
|
|
# takes too long; this is preferable to a CI hang.
|
|
|
|
# * we log the command run and its output. This doesn't normally
|
|
|
|
# appear in BATS output, but it will if there's an error.
|
|
|
|
# * we check exit status. Since the normal desired code is 0,
|
|
|
|
# that's the default; but the first argument can override:
|
|
|
|
#
|
|
|
|
# run_buildah 125 nonexistent-subcommand
|
|
|
|
# run_buildah '?' some-other-command # let our caller check status
|
|
|
|
#
|
|
|
|
# Since we use the BATS 'run' mechanism, $output and $status will be
|
|
|
|
# defined for our caller.
|
|
|
|
#
|
|
|
|
function run_buildah() {
|
|
|
|
# Number as first argument = expected exit code; default 0
|
|
|
|
expected_rc=0
|
|
|
|
case "$1" in
|
|
|
|
[0-9]) expected_rc=$1; shift;;
|
|
|
|
[1-9][0-9]) expected_rc=$1; shift;;
|
|
|
|
[12][0-9][0-9]) expected_rc=$1; shift;;
|
|
|
|
'?') expected_rc= ; shift;; # ignore exit code
|
|
|
|
esac
|
|
|
|
|
|
|
|
# stdout is only emitted upon error; this echo is to help a debugger
|
|
|
|
echo "\$ $BUILDAH_BINARY $*"
|
2019-04-03 21:38:25 +08:00
|
|
|
run timeout --foreground --kill=10 $BUILDAH_TIMEOUT ${BUILDAH_BINARY} --debug --registries-conf ${TESTSDIR}/registries.conf --root ${TESTDIR}/root --runroot ${TESTDIR}/runroot --storage-driver ${STORAGE_DRIVER} "$@"
|
2019-04-02 05:56:29 +08:00
|
|
|
# without "quotes", multiple lines are glommed together into one
|
|
|
|
if [ -n "$output" ]; then
|
|
|
|
echo "$output"
|
|
|
|
fi
|
|
|
|
if [ "$status" -ne 0 ]; then
|
|
|
|
echo -n "[ rc=$status ";
|
|
|
|
if [ -n "$expected_rc" ]; then
|
|
|
|
if [ "$status" -eq "$expected_rc" ]; then
|
|
|
|
echo -n "(expected) ";
|
|
|
|
else
|
|
|
|
echo -n "(** EXPECTED $expected_rc **) ";
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
echo "]"
|
|
|
|
fi
|
|
|
|
|
2019-04-03 21:38:25 +08:00
|
|
|
if [ "$status" -eq 124 -o "$status" -eq 137 ]; then
|
|
|
|
# FIXME: 'timeout -v' requires coreutils-8.29; travis seems to have
|
|
|
|
# an older version. If/when travis updates, please add -v
|
|
|
|
# to the 'timeout' command above, and un-comment this out:
|
|
|
|
# if expr "$output" : ".*timeout: sending" >/dev/null; then
|
|
|
|
echo "*** TIMED OUT ***"
|
|
|
|
false
|
2019-04-02 05:56:29 +08:00
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$expected_rc" ]; then
|
|
|
|
if [ "$status" -ne "$expected_rc" ]; then
|
|
|
|
die "exit code is $status; expected $expected_rc"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
#########
|
|
|
|
# die # Abort with helpful message
|
|
|
|
#########
|
|
|
|
function die() {
|
|
|
|
echo "#/vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" >&2
|
|
|
|
echo "#| FAIL: $*" >&2
|
|
|
|
echo "#\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >&2
|
|
|
|
false
|
|
|
|
}
|
|
|
|
|
|
|
|
########
|
|
|
|
# is # Compare actual vs expected string; fail w/diagnostic if mismatch
|
|
|
|
########
|
|
|
|
#
|
2019-04-03 21:38:25 +08:00
|
|
|
# Compares given string against expectations, using '=~' to allow patterns.
|
2019-04-02 05:56:29 +08:00
|
|
|
#
|
|
|
|
# Examples:
|
|
|
|
#
|
|
|
|
# is "$actual" "$expected" "descriptive test name"
|
|
|
|
# is "apple" "orange" "name of a test that will fail in most universes"
|
|
|
|
# is "apple" "[a-z]\+" "this time it should pass"
|
|
|
|
#
|
|
|
|
function is() {
|
|
|
|
local actual="$1"
|
|
|
|
local expect="$2"
|
|
|
|
local testname="${3:-FIXME}"
|
|
|
|
|
|
|
|
if [ -z "$expect" ]; then
|
|
|
|
if [ -z "$actual" ]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
expect='[no output]'
|
|
|
|
elif [ "$actual" = "$expect" ]; then
|
|
|
|
return
|
2019-04-03 21:38:25 +08:00
|
|
|
elif [[ "$actual" =~ ^$expect ]]; then
|
2019-04-02 05:56:29 +08:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
# This is a multi-line message, which may in turn contain multi-line
|
|
|
|
# output, so let's format it ourself, readably
|
|
|
|
local -a actual_split
|
|
|
|
readarray -t actual_split <<<"$actual"
|
|
|
|
printf "#/vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n" >&2
|
|
|
|
printf "#| FAIL: $testname\n" >&2
|
|
|
|
printf "#| expected: '%s'\n" "$expect" >&2
|
|
|
|
printf "#| actual: '%s'\n" "${actual_split[0]}" >&2
|
|
|
|
local line
|
|
|
|
for line in "${actual_split[@]:1}"; do
|
|
|
|
printf "#| > '%s'\n" "$line" >&2
|
|
|
|
done
|
|
|
|
printf "#\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" >&2
|
|
|
|
false
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-09-03 19:20:52 +08:00
|
|
|
function check_options_flag_err() {
|
|
|
|
flag="$1"
|
|
|
|
[ "$status" -eq 1 ]
|
|
|
|
[[ $output = *"No options ($flag) can be specified after"* ]]
|
|
|
|
}
|