2011-12-28 19:40:14 +01:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
set -e
|
2013-05-23 19:47:17 +02:00
|
|
|
set -E
|
|
|
|
set -T
|
2011-12-28 19:40:14 +01:00
|
|
|
|
2012-04-09 06:25:19 +02:00
|
|
|
BATS_COUNT_ONLY=""
|
|
|
|
if [ "$1" = "-c" ]; then
|
|
|
|
BATS_COUNT_ONLY=1
|
|
|
|
shift
|
|
|
|
fi
|
|
|
|
|
2013-10-21 18:32:09 +02:00
|
|
|
BATS_EXTENDED_SYNTAX=""
|
|
|
|
if [ "$1" = "-x" ]; then
|
|
|
|
BATS_EXTENDED_SYNTAX="$1"
|
|
|
|
shift
|
|
|
|
fi
|
|
|
|
|
2011-12-28 19:40:14 +01:00
|
|
|
BATS_TEST_FILENAME="$1"
|
|
|
|
if [ -z "$BATS_TEST_FILENAME" ]; then
|
|
|
|
echo "usage: bats-exec <filename>" >&2
|
|
|
|
exit 1
|
|
|
|
elif [ ! -f "$BATS_TEST_FILENAME" ]; then
|
2012-11-16 21:35:48 +01:00
|
|
|
echo "bats: $BATS_TEST_FILENAME does not exist" >&2
|
2011-12-28 19:40:14 +01:00
|
|
|
exit 1
|
|
|
|
else
|
|
|
|
shift
|
|
|
|
fi
|
|
|
|
|
|
|
|
BATS_TEST_DIRNAME="$(dirname "$BATS_TEST_FILENAME")"
|
|
|
|
BATS_TEST_NAMES=()
|
2018-05-21 12:49:44 +02:00
|
|
|
BATS_TEST_RESULTS=()
|
2011-12-28 19:40:14 +01:00
|
|
|
|
|
|
|
load() {
|
2014-06-02 01:04:29 +02:00
|
|
|
local name="$1"
|
2014-05-21 06:10:55 +02:00
|
|
|
local filename
|
|
|
|
|
2014-06-02 01:04:29 +02:00
|
|
|
if [ "${name:0:1}" = "/" ]; then
|
|
|
|
filename="${name}"
|
2014-05-21 06:10:55 +02:00
|
|
|
else
|
2014-06-02 01:04:29 +02:00
|
|
|
filename="$BATS_TEST_DIRNAME/${name}.bash"
|
2014-05-21 06:10:55 +02:00
|
|
|
fi
|
2014-06-02 01:04:29 +02:00
|
|
|
|
2012-11-16 21:35:48 +01:00
|
|
|
[ -f "$filename" ] || {
|
|
|
|
echo "bats: $filename does not exist" >&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
2014-05-21 06:10:55 +02:00
|
|
|
source "${filename}"
|
2011-12-28 19:40:14 +01:00
|
|
|
}
|
|
|
|
|
2011-12-28 23:21:48 +01:00
|
|
|
run() {
|
2015-01-29 20:51:49 +01:00
|
|
|
local e E T oldIFS
|
2011-12-28 23:21:48 +01:00
|
|
|
[[ ! "$-" =~ e ]] || e=1
|
2013-05-23 19:47:17 +02:00
|
|
|
[[ ! "$-" =~ E ]] || E=1
|
|
|
|
[[ ! "$-" =~ T ]] || T=1
|
2011-12-28 23:21:48 +01:00
|
|
|
set +e
|
2013-05-23 19:47:17 +02:00
|
|
|
set +E
|
|
|
|
set +T
|
2011-12-28 23:21:48 +01:00
|
|
|
output="$("$@" 2>&1)"
|
|
|
|
status="$?"
|
2015-01-29 20:51:49 +01:00
|
|
|
oldIFS=$IFS
|
2011-12-29 01:45:05 +01:00
|
|
|
IFS=$'\n' lines=($output)
|
2011-12-28 23:21:48 +01:00
|
|
|
[ -z "$e" ] || set -e
|
2013-05-23 19:47:17 +02:00
|
|
|
[ -z "$E" ] || set -E
|
|
|
|
[ -z "$T" ] || set -T
|
2015-01-29 20:51:49 +01:00
|
|
|
IFS=$oldIFS
|
2011-12-28 23:21:48 +01:00
|
|
|
}
|
|
|
|
|
2011-12-28 19:40:14 +01:00
|
|
|
setup() {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
teardown() {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2013-10-18 23:05:20 +02:00
|
|
|
skip() {
|
|
|
|
BATS_TEST_SKIPPED=${1:-1}
|
|
|
|
BATS_TEST_COMPLETED=1
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
2013-10-21 18:21:17 +02:00
|
|
|
bats_test_begin() {
|
2011-12-28 19:40:14 +01:00
|
|
|
BATS_TEST_DESCRIPTION="$1"
|
2013-10-21 18:32:09 +02:00
|
|
|
if [ -n "$BATS_EXTENDED_SYNTAX" ]; then
|
|
|
|
echo "begin $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
|
|
|
|
fi
|
2013-10-21 18:21:17 +02:00
|
|
|
setup
|
2011-12-28 19:40:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bats_test_function() {
|
|
|
|
local test_name="$1"
|
|
|
|
BATS_TEST_NAMES["${#BATS_TEST_NAMES[@]}"]="$test_name"
|
|
|
|
}
|
|
|
|
|
2013-10-29 02:13:45 +01:00
|
|
|
bats_capture_stack_trace() {
|
2014-06-03 02:28:31 +02:00
|
|
|
BATS_PREVIOUS_STACK_TRACE=( "${BATS_CURRENT_STACK_TRACE[@]}" )
|
|
|
|
BATS_CURRENT_STACK_TRACE=()
|
|
|
|
|
|
|
|
local test_pattern=" $BATS_TEST_NAME $BATS_TEST_SOURCE"
|
|
|
|
local setup_pattern=" setup $BATS_TEST_SOURCE"
|
|
|
|
local teardown_pattern=" teardown $BATS_TEST_SOURCE"
|
|
|
|
|
|
|
|
local frame
|
|
|
|
local index=1
|
|
|
|
|
|
|
|
while frame="$(caller "$index")"; do
|
|
|
|
BATS_CURRENT_STACK_TRACE["${#BATS_CURRENT_STACK_TRACE[@]}"]="$frame"
|
|
|
|
if [[ "$frame" = *"$test_pattern" || \
|
|
|
|
"$frame" = *"$setup_pattern" || \
|
|
|
|
"$frame" = *"$teardown_pattern" ]]; then
|
|
|
|
break
|
|
|
|
else
|
|
|
|
let index+=1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
BATS_SOURCE="$(bats_frame_filename "${BATS_CURRENT_STACK_TRACE[0]}")"
|
|
|
|
BATS_LINENO="$(bats_frame_lineno "${BATS_CURRENT_STACK_TRACE[0]}")"
|
2013-10-29 02:13:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bats_print_stack_trace() {
|
2014-06-03 02:28:31 +02:00
|
|
|
local frame
|
2013-10-29 02:13:45 +01:00
|
|
|
local index=1
|
2014-06-03 02:28:31 +02:00
|
|
|
local count="${#@}"
|
2013-10-29 02:13:45 +01:00
|
|
|
|
2014-06-03 02:28:31 +02:00
|
|
|
for frame in "$@"; do
|
2014-08-12 23:56:52 +02:00
|
|
|
local filename="$(bats_trim_filename "$(bats_frame_filename "$frame")")"
|
2014-08-12 22:04:18 +02:00
|
|
|
local lineno="$(bats_frame_lineno "$frame")"
|
2014-08-12 19:17:51 +02:00
|
|
|
|
2013-10-29 02:13:45 +01:00
|
|
|
if [ $index -eq 1 ]; then
|
|
|
|
echo -n "# ("
|
|
|
|
else
|
|
|
|
echo -n "# "
|
|
|
|
fi
|
|
|
|
|
2013-11-04 19:20:55 +01:00
|
|
|
local fn="$(bats_frame_function "$frame")"
|
|
|
|
if [ "$fn" != "$BATS_TEST_NAME" ]; then
|
|
|
|
echo -n "from function \`$fn' "
|
|
|
|
fi
|
|
|
|
|
2013-10-29 02:13:45 +01:00
|
|
|
if [ $index -eq $count ]; then
|
2014-08-12 19:17:51 +02:00
|
|
|
echo "in test file $filename, line $lineno)"
|
2013-10-29 02:13:45 +01:00
|
|
|
else
|
2014-06-03 02:28:31 +02:00
|
|
|
echo "in file $filename, line $lineno,"
|
2013-10-29 02:13:45 +01:00
|
|
|
fi
|
|
|
|
|
2013-10-29 03:01:51 +01:00
|
|
|
let index+=1
|
2013-10-29 02:13:45 +01:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2014-08-12 22:04:18 +02:00
|
|
|
bats_print_failed_command() {
|
|
|
|
local frame="$1"
|
2014-08-12 23:22:43 +02:00
|
|
|
local status="$2"
|
2014-08-12 22:14:16 +02:00
|
|
|
local filename="$(bats_frame_filename "$frame")"
|
2014-08-12 22:04:18 +02:00
|
|
|
local lineno="$(bats_frame_lineno "$frame")"
|
2014-08-12 22:14:16 +02:00
|
|
|
|
2014-08-12 22:04:18 +02:00
|
|
|
local failed_line="$(bats_extract_line "$filename" "$lineno")"
|
|
|
|
local failed_command="$(bats_strip_string "$failed_line")"
|
2014-08-12 23:22:43 +02:00
|
|
|
echo -n "# \`${failed_command}' "
|
2014-08-12 22:04:18 +02:00
|
|
|
|
2014-08-12 23:22:43 +02:00
|
|
|
if [ $status -eq 1 ]; then
|
|
|
|
echo "failed"
|
|
|
|
else
|
|
|
|
echo "failed with status $status"
|
|
|
|
fi
|
2014-08-12 22:04:18 +02:00
|
|
|
}
|
|
|
|
|
2014-06-03 02:28:31 +02:00
|
|
|
bats_frame_lineno() {
|
2013-10-29 02:13:45 +01:00
|
|
|
local frame="$1"
|
2014-06-03 02:28:31 +02:00
|
|
|
local lineno="${frame%% *}"
|
|
|
|
echo "$lineno"
|
2013-10-29 02:13:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bats_frame_function() {
|
|
|
|
local frame="$1"
|
|
|
|
local rest="${frame#* }"
|
|
|
|
local fn="${rest%% *}"
|
|
|
|
echo "$fn"
|
|
|
|
}
|
|
|
|
|
|
|
|
bats_frame_filename() {
|
|
|
|
local frame="$1"
|
|
|
|
local rest="${frame#* }"
|
|
|
|
local filename="${rest#* }"
|
|
|
|
|
|
|
|
if [ "$filename" = "$BATS_TEST_SOURCE" ]; then
|
|
|
|
echo "$BATS_TEST_FILENAME"
|
|
|
|
else
|
|
|
|
echo "$filename"
|
2013-05-23 19:47:17 +02:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-08-12 19:17:51 +02:00
|
|
|
bats_extract_line() {
|
|
|
|
local filename="$1"
|
|
|
|
local lineno="$2"
|
|
|
|
sed -n "${lineno}p" "$filename"
|
|
|
|
}
|
|
|
|
|
|
|
|
bats_strip_string() {
|
|
|
|
local string="$1"
|
|
|
|
printf "%s" "$string" | sed -e "s/^[ "$'\t'"]*//" -e "s/[ "$'\t'"]*$//"
|
|
|
|
}
|
|
|
|
|
2014-08-12 23:56:52 +02:00
|
|
|
bats_trim_filename() {
|
|
|
|
local filename="$1"
|
|
|
|
local length="${#BATS_CWD}"
|
|
|
|
|
|
|
|
if [ "${filename:0:length+1}" = "${BATS_CWD}/" ]; then
|
|
|
|
echo "${filename:length+1}"
|
|
|
|
else
|
|
|
|
echo "$filename"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-06-03 02:28:31 +02:00
|
|
|
bats_debug_trap() {
|
|
|
|
if [ "$BASH_SOURCE" != "$1" ]; then
|
|
|
|
bats_capture_stack_trace
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2013-05-23 19:47:17 +02:00
|
|
|
bats_error_trap() {
|
2014-08-12 23:22:43 +02:00
|
|
|
BATS_ERROR_STATUS="$?"
|
2014-06-03 02:28:31 +02:00
|
|
|
BATS_ERROR_STACK_TRACE=( "${BATS_PREVIOUS_STACK_TRACE[@]}" )
|
2013-05-23 19:47:17 +02:00
|
|
|
trap - debug
|
|
|
|
}
|
|
|
|
|
2011-12-29 04:20:43 +01:00
|
|
|
bats_teardown_trap() {
|
2014-06-03 02:28:31 +02:00
|
|
|
trap "bats_exit_trap" exit
|
2014-08-12 23:22:43 +02:00
|
|
|
local status=0
|
|
|
|
teardown >>"$BATS_OUT" 2>&1 || status="$?"
|
|
|
|
|
|
|
|
if [ $status -eq 0 ]; then
|
2013-11-04 19:20:55 +01:00
|
|
|
BATS_TEARDOWN_COMPLETED=1
|
|
|
|
elif [ -n "$BATS_TEST_COMPLETED" ]; then
|
2014-08-12 23:22:43 +02:00
|
|
|
BATS_ERROR_STATUS="$status"
|
2014-06-03 02:28:31 +02:00
|
|
|
BATS_ERROR_STACK_TRACE=( "${BATS_CURRENT_STACK_TRACE[@]}" )
|
2013-11-04 19:20:55 +01:00
|
|
|
fi
|
2014-08-12 23:22:43 +02:00
|
|
|
|
2011-12-29 04:20:43 +01:00
|
|
|
bats_exit_trap
|
|
|
|
}
|
|
|
|
|
2011-12-28 19:40:14 +01:00
|
|
|
bats_exit_trap() {
|
2018-05-21 14:59:00 +02:00
|
|
|
local status # Exit code: 0=OK, 1=error, 2=skipped
|
2013-10-18 23:05:20 +02:00
|
|
|
local skipped
|
2011-12-28 23:21:48 +01:00
|
|
|
trap - err exit
|
2011-12-29 06:50:49 +01:00
|
|
|
|
2013-10-18 23:05:20 +02:00
|
|
|
skipped=""
|
|
|
|
if [ -n "$BATS_TEST_SKIPPED" ]; then
|
|
|
|
skipped=" # skip"
|
|
|
|
if [ "1" != "$BATS_TEST_SKIPPED" ]; then
|
|
|
|
skipped+=" ($BATS_TEST_SKIPPED)"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-11-04 19:20:55 +01:00
|
|
|
if [ -z "$BATS_TEST_COMPLETED" ] || [ -z "$BATS_TEARDOWN_COMPLETED" ]; then
|
2011-12-29 06:50:49 +01:00
|
|
|
echo "not ok $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
|
2014-06-03 02:28:31 +02:00
|
|
|
bats_print_stack_trace "${BATS_ERROR_STACK_TRACE[@]}" >&3
|
2014-08-13 00:28:03 +02:00
|
|
|
bats_print_failed_command "${BATS_ERROR_STACK_TRACE[${#BATS_ERROR_STACK_TRACE[@]}-1]}" "$BATS_ERROR_STATUS" >&3
|
2013-10-21 17:58:21 +02:00
|
|
|
sed -e "s/^/# /" < "$BATS_OUT" >&3
|
2011-12-29 06:50:49 +01:00
|
|
|
status=1
|
2011-12-28 19:40:14 +01:00
|
|
|
else
|
2013-10-18 23:05:20 +02:00
|
|
|
echo "ok ${BATS_TEST_NUMBER}${skipped} ${BATS_TEST_DESCRIPTION}" >&3
|
2011-12-29 06:50:49 +01:00
|
|
|
status=0
|
2018-05-21 14:59:00 +02:00
|
|
|
[ -n "$BATS_TEST_SKIPPED" ] && status=2
|
2011-12-28 19:40:14 +01:00
|
|
|
fi
|
2011-12-29 06:50:49 +01:00
|
|
|
|
|
|
|
rm -f "$BATS_OUT"
|
|
|
|
exit "$status"
|
2011-12-28 19:40:14 +01:00
|
|
|
}
|
|
|
|
|
2018-05-21 12:49:44 +02:00
|
|
|
bats_test_succeeds() {
|
|
|
|
local name status index i ret
|
|
|
|
|
|
|
|
ret=0
|
|
|
|
|
|
|
|
for name in $@
|
|
|
|
do
|
|
|
|
index=''
|
|
|
|
i=0
|
|
|
|
while [ $i -lt ${#BATS_TEST_NAMES[@]} ; do
|
|
|
|
if [ "${BATS_TEST_NAMES[$i]}" = "test_$name" ] ; then
|
|
|
|
index=$i
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
if [ -z $index ] ; then
|
|
|
|
echo "Error: $name: this test name does not exist" >&2
|
|
|
|
else
|
|
|
|
status=${BATS_TEST_RESULTS[$index]}
|
|
|
|
if [ -z $status ] ; then
|
2018-05-21 14:02:05 +02:00
|
|
|
echo "Warning: $name: Cannot check status as test didn't run yet" >&2
|
2018-05-21 12:49:44 +02:00
|
|
|
else
|
2018-05-21 14:59:00 +02:00
|
|
|
[ $status = 0 ] && ret=1
|
2018-05-21 12:49:44 +02:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
return $ret
|
|
|
|
}
|
|
|
|
|
2011-12-28 19:40:14 +01:00
|
|
|
bats_perform_tests() {
|
2018-05-21 14:59:00 +02:00
|
|
|
local ret status test_number test_name
|
|
|
|
|
|
|
|
ret=0
|
2011-12-28 19:40:14 +01:00
|
|
|
echo "1..$#"
|
|
|
|
test_number=1
|
2011-12-29 02:14:10 +01:00
|
|
|
status=0
|
2011-12-28 19:40:14 +01:00
|
|
|
for test_name in "$@"; do
|
2018-05-21 14:59:00 +02:00
|
|
|
"$0" $BATS_EXTENDED_SYNTAX "$BATS_TEST_FILENAME" "$test_name" "$test_number" || status=$?
|
|
|
|
[ $status = 1 ] && ret=1 # Skip -> OK
|
2018-05-21 12:49:44 +02:00
|
|
|
BATS_TEST_RESULTS[$test_number]=$status
|
2013-10-29 03:01:51 +01:00
|
|
|
let test_number+=1
|
2011-12-28 19:40:14 +01:00
|
|
|
done
|
2018-05-21 14:59:00 +02:00
|
|
|
exit "$ret"
|
2011-12-28 19:40:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bats_perform_test() {
|
|
|
|
BATS_TEST_NAME="$1"
|
|
|
|
if [ "$(type -t "$BATS_TEST_NAME" || true)" = "function" ]; then
|
|
|
|
BATS_TEST_NUMBER="$2"
|
|
|
|
if [ -z "$BATS_TEST_NUMBER" ]; then
|
|
|
|
echo "1..1"
|
|
|
|
BATS_TEST_NUMBER="1"
|
|
|
|
fi
|
|
|
|
|
|
|
|
BATS_TEST_COMPLETED=""
|
2013-11-04 19:20:55 +01:00
|
|
|
BATS_TEARDOWN_COMPLETED=""
|
2014-06-03 02:28:31 +02:00
|
|
|
trap "bats_debug_trap \"\$BASH_SOURCE\"" debug
|
2013-05-23 19:47:17 +02:00
|
|
|
trap "bats_error_trap" err
|
|
|
|
trap "bats_teardown_trap" exit
|
2013-10-21 18:21:17 +02:00
|
|
|
"$BATS_TEST_NAME" >>"$BATS_OUT" 2>&1
|
2011-12-28 19:40:14 +01:00
|
|
|
BATS_TEST_COMPLETED=1
|
|
|
|
|
|
|
|
else
|
|
|
|
echo "bats: unknown test name \`$BATS_TEST_NAME'" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2011-12-29 06:50:49 +01:00
|
|
|
if [ -z "$TMPDIR" ]; then
|
|
|
|
BATS_TMPDIR="/tmp"
|
|
|
|
else
|
|
|
|
BATS_TMPDIR="${TMPDIR%/}"
|
|
|
|
fi
|
2012-04-09 05:08:30 +02:00
|
|
|
|
|
|
|
BATS_TMPNAME="$BATS_TMPDIR/bats.$$"
|
|
|
|
BATS_PARENT_TMPNAME="$BATS_TMPDIR/bats.$PPID"
|
|
|
|
BATS_OUT="${BATS_TMPNAME}.out"
|
2011-12-29 06:50:49 +01:00
|
|
|
|
2012-04-09 06:13:58 +02:00
|
|
|
bats_preprocess_source() {
|
2012-04-09 05:08:30 +02:00
|
|
|
BATS_TEST_SOURCE="${BATS_TMPNAME}.src"
|
2013-10-21 19:45:49 +02:00
|
|
|
{ tr -d '\r' < "$BATS_TEST_FILENAME"; echo; } | bats-preprocess > "$BATS_TEST_SOURCE"
|
2014-06-03 02:28:31 +02:00
|
|
|
trap "bats_cleanup_preprocessed_source" err exit
|
2012-04-09 06:13:58 +02:00
|
|
|
trap "bats_cleanup_preprocessed_source; exit 1" int
|
|
|
|
}
|
2012-04-09 05:08:30 +02:00
|
|
|
|
2012-04-09 06:13:58 +02:00
|
|
|
bats_cleanup_preprocessed_source() {
|
|
|
|
rm -f "$BATS_TEST_SOURCE"
|
|
|
|
}
|
|
|
|
|
|
|
|
bats_evaluate_preprocessed_source() {
|
|
|
|
if [ -z "$BATS_TEST_SOURCE" ]; then
|
|
|
|
BATS_TEST_SOURCE="${BATS_PARENT_TMPNAME}.src"
|
|
|
|
fi
|
|
|
|
source "$BATS_TEST_SOURCE"
|
|
|
|
}
|
|
|
|
|
|
|
|
exec 3<&1
|
2011-12-28 19:40:14 +01:00
|
|
|
|
|
|
|
if [ "$#" -eq 0 ]; then
|
2012-04-09 06:13:58 +02:00
|
|
|
bats_preprocess_source
|
|
|
|
bats_evaluate_preprocessed_source
|
2012-04-09 06:25:19 +02:00
|
|
|
|
|
|
|
if [ -n "$BATS_COUNT_ONLY" ]; then
|
|
|
|
echo "${#BATS_TEST_NAMES[@]}"
|
|
|
|
else
|
|
|
|
bats_perform_tests "${BATS_TEST_NAMES[@]}"
|
|
|
|
fi
|
2011-12-28 19:40:14 +01:00
|
|
|
else
|
2012-04-09 06:13:58 +02:00
|
|
|
bats_evaluate_preprocessed_source
|
2011-12-28 19:40:14 +01:00
|
|
|
bats_perform_test "$@"
|
|
|
|
fi
|