2017-03-31 06:19:47 -07:00
|
|
|
# HACK: get newline for use in strings given that "\n" and $'' do not work.
|
|
|
|
NL="$(printf '\nE')"
|
|
|
|
NL="${NL%E}"
|
|
|
|
|
2017-03-31 06:02:53 -07:00
|
|
|
FAIL_SUMMARY=""
|
|
|
|
|
2017-04-04 10:15:30 -07:00
|
|
|
# Test success marker. If END_MARKER file exists, we know that all tests
|
|
|
|
# finished. If FAIL_SUMMARY_FILE exists we know that some tests failed, this
|
|
|
|
# file will contain information about failed tests. Build is considered
|
|
|
|
# successful if tests ended without any of them failing.
|
|
|
|
END_MARKER="$BUILD_DIR/.tests_finished"
|
|
|
|
FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
|
|
|
|
|
2017-03-31 06:02:53 -07:00
|
|
|
enter_suite() {
|
2017-04-04 10:15:30 -07:00
|
|
|
FAILED=0
|
|
|
|
rm -f "${END_MARKER}"
|
2017-03-31 06:02:53 -07:00
|
|
|
local suite_name="$1"
|
|
|
|
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
|
|
|
|
}
|
|
|
|
|
|
|
|
exit_suite() {
|
|
|
|
if test $FAILED -ne 0 ; then
|
|
|
|
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
|
|
|
echo "${FAIL_SUMMARY}"
|
|
|
|
fi
|
|
|
|
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
|
|
|
if test "x$1" != "x--continue" ; then
|
|
|
|
exit $FAILED
|
2017-04-04 10:15:30 -07:00
|
|
|
else
|
|
|
|
local saved_failed=$FAILED
|
|
|
|
FAILED=0
|
|
|
|
return $saved_failed
|
2017-03-31 06:02:53 -07:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
fail() {
|
|
|
|
local test_name="$1"
|
2017-04-04 10:15:30 -07:00
|
|
|
local fail_char="$2"
|
2017-03-31 06:02:53 -07:00
|
|
|
local message="$3"
|
|
|
|
|
|
|
|
: ${fail_char:=F}
|
|
|
|
: ${message:=Test $test_name failed}
|
|
|
|
|
|
|
|
local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
|
|
|
|
FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
|
2017-04-04 10:15:30 -07:00
|
|
|
echo "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
|
2017-03-31 06:02:53 -07:00
|
|
|
echo "Failed: $full_msg"
|
2017-04-04 10:15:30 -07:00
|
|
|
FAILED=1
|
2017-03-31 06:02:53 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
run_test() {
|
|
|
|
local cmd="$1"
|
2017-03-31 10:52:05 -07:00
|
|
|
test $# -gt 0 && shift
|
2017-03-31 06:02:53 -07:00
|
|
|
local test_name="$1"
|
|
|
|
: ${test_name:=$cmd}
|
2017-03-31 10:52:05 -07:00
|
|
|
test $# -gt 0 && shift
|
2017-03-31 06:02:53 -07:00
|
|
|
if ! eval "$cmd" ; then
|
|
|
|
fail "${test_name}" "$@"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2017-03-31 09:42:18 -07:00
|
|
|
run_test_wd() {
|
|
|
|
local timeout="$1"
|
2017-03-31 10:52:05 -07:00
|
|
|
test $# -gt 0 && shift
|
2017-04-03 17:58:10 -07:00
|
|
|
|
2017-03-31 09:42:18 -07:00
|
|
|
local cmd="$1"
|
2017-03-31 10:52:05 -07:00
|
|
|
test $# -gt 0 && shift
|
2017-04-03 17:58:10 -07:00
|
|
|
|
|
|
|
local restart_cmd="$1"
|
|
|
|
: ${restart_cmd:=true}
|
|
|
|
test $# -gt 0 && shift
|
|
|
|
|
2017-03-31 09:42:18 -07:00
|
|
|
local test_name="$1"
|
|
|
|
: ${test_name:=$cmd}
|
2017-03-31 10:52:05 -07:00
|
|
|
test $# -gt 0 && shift
|
2017-04-03 17:58:10 -07:00
|
|
|
|
2017-03-31 09:42:18 -07:00
|
|
|
local output_file="$(mktemp)"
|
|
|
|
local status_file="$(mktemp)"
|
2017-04-03 17:58:10 -07:00
|
|
|
|
2017-03-31 09:42:18 -07:00
|
|
|
local restarts=5
|
|
|
|
local prev_tmpsize=-1
|
|
|
|
while test $restarts -gt 0 ; do
|
|
|
|
: > "${status_file}"
|
|
|
|
(
|
2017-04-04 10:15:30 -07:00
|
|
|
set -o pipefail
|
|
|
|
ret=0
|
|
|
|
if ! eval "$cmd" 2>&1 | tee -a "$output_file" ; then
|
|
|
|
ret=1
|
2017-03-31 09:42:18 -07:00
|
|
|
fi
|
2017-04-04 10:15:30 -07:00
|
|
|
echo "$ret" > "$status_file"
|
|
|
|
exit $ret
|
2017-03-31 09:42:18 -07:00
|
|
|
) &
|
|
|
|
local pid=$!
|
|
|
|
while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
|
|
|
|
prev_tmpsize=$tmpsize
|
|
|
|
sleep $timeout
|
|
|
|
tmpsize="$(stat -c "%s" "$output_file")"
|
|
|
|
if test $tempsize -eq $prev_temsize ; then
|
|
|
|
# no output, assuming either hang or exit
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
2017-04-03 18:59:30 -07:00
|
|
|
restarts=$[ restarts - 1 ]
|
2017-03-31 09:42:18 -07:00
|
|
|
if test "$(stat -c "%s" "$status_file")" -eq 0 ; then
|
|
|
|
# status file not updated, assuming hang
|
|
|
|
kill -KILL $pid
|
2017-04-03 18:59:30 -07:00
|
|
|
if test $restarts -eq 0 ; then
|
|
|
|
fail "${test_name}" E "Test hang up"
|
|
|
|
else
|
|
|
|
echo "Test ${test_name} hang up, restarting"
|
|
|
|
eval "$restart_cmd"
|
|
|
|
fi
|
2017-03-31 09:42:18 -07:00
|
|
|
else
|
|
|
|
local new_failed="$(cat "$status_file")"
|
|
|
|
if test "x$new_failed" != "x0" ; then
|
|
|
|
fail "${test_name}" F "Test failed in run_test_wd"
|
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2017-04-04 10:15:30 -07:00
|
|
|
ended_successfully() {
|
|
|
|
if [[ -f "${FAIL_SUMMARY_FILE}" ]]; then
|
|
|
|
echo 'Test failed, complete summary:'
|
|
|
|
cat "${FAIL_SUMMARY_FILE}"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
if ! [[ -f "${END_MARKER}" ]] ; then
|
|
|
|
echo 'ended_successfully called before end marker was touched'
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
end_tests() {
|
|
|
|
touch "${END_MARKER}"
|
|
|
|
ended_successfully
|
2017-03-31 06:02:53 -07:00
|
|
|
}
|