ci: Really continue tests on failure, print global summary

This commit is contained in:
ZyX 2017-04-04 20:15:30 +03:00
parent 271df03fa4
commit c1416e0665
6 changed files with 75 additions and 63 deletions

View File

@ -43,11 +43,6 @@ env:
# If this file exists, we know that the cache contains compiled # If this file exists, we know that the cache contains compiled
# dependencies and we can use it. # dependencies and we can use it.
- CACHE_MARKER="$HOME/.cache/nvim-deps/.travis_cache_marker" - CACHE_MARKER="$HOME/.cache/nvim-deps/.travis_cache_marker"
# Test success marker. If this file exists, we know that all tests
# were successful. Required because we only want to update the cache
# if the tests were successful, but don't have this information
# available in before_cache (which is run before after_success).
- SUCCESS_MARKER="$BUILD_DIR/.tests_successful"
# default target name for functional tests # default target name for functional tests
- FUNCTIONALTEST=functionaltest - FUNCTIONALTEST=functionaltest
- CI_TARGET=tests - CI_TARGET=tests

View File

@ -3,12 +3,15 @@
set -e set -e
set -o pipefail set -o pipefail
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/suite.sh"
# Don't cache pip's log and selfcheck. # Don't cache pip's log and selfcheck.
rm -rf "${HOME}/.cache/pip/log" rm -rf "${HOME}/.cache/pip/log"
rm -f "${HOME}/.cache/pip/selfcheck.json" rm -f "${HOME}/.cache/pip/selfcheck.json"
# Update the third-party dependency cache only if the build was successful. # Update the third-party dependency cache only if the build was successful.
if [[ -f "${SUCCESS_MARKER}" ]]; then if ended_successfully; then
rm -rf "${HOME}/.cache/nvim-deps" rm -rf "${HOME}/.cache/nvim-deps"
mv "${DEPS_BUILD_DIR}" "${HOME}/.cache/nvim-deps" mv "${DEPS_BUILD_DIR}" "${HOME}/.cache/nvim-deps"
touch "${CACHE_MARKER}" touch "${CACHE_MARKER}"

View File

@ -2,11 +2,18 @@
NL="$(printf '\nE')" NL="$(printf '\nE')"
NL="${NL%E}" NL="${NL%E}"
FAILED=0
FAIL_SUMMARY="" FAIL_SUMMARY=""
# 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"
enter_suite() { enter_suite() {
FAILED=0
rm -f "${END_MARKER}"
local suite_name="$1" local suite_name="$1"
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name" export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
} }
@ -19,17 +26,16 @@ exit_suite() {
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}" export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
if test "x$1" != "x--continue" ; then if test "x$1" != "x--continue" ; then
exit $FAILED exit $FAILED
else
local saved_failed=$FAILED
FAILED=0
return $saved_failed
fi fi
} }
fail() { fail() {
local allow_failure=
if test "x$1" = "x--allow-failure" ; then
shift
allow_failure=A
fi
local test_name="$1" local test_name="$1"
local fail_char="$allow_failure$2" local fail_char="$2"
local message="$3" local message="$3"
: ${fail_char:=F} : ${fail_char:=F}
@ -37,10 +43,9 @@ fail() {
local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message" local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}" FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
echo "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
echo "Failed: $full_msg" echo "Failed: $full_msg"
if test "x$allow_failure" = "x" ; then FAILED=1
FAILED=1
fi
} }
run_test() { run_test() {
@ -77,14 +82,13 @@ run_test_wd() {
while test $restarts -gt 0 ; do while test $restarts -gt 0 ; do
: > "${status_file}" : > "${status_file}"
( (
FAILED=0 set -o pipefail
if ! ( ret=0
set -o pipefail if ! eval "$cmd" 2>&1 | tee -a "$output_file" ; then
eval "$cmd" 2>&1 | tee -a "$output_file" ret=1
) ; then
fail "${test_name}" "$@"
fi fi
echo "$FAILED" > "$status_file" echo "$ret" > "$status_file"
exit $ret
) & ) &
local pid=$! local pid=$!
while test "$(stat -c "%s" "$status_file")" -eq 0 ; do while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
@ -116,6 +120,20 @@ run_test_wd() {
done done
} }
succeeded() { ended_successfully() {
return $FAILED 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
} }

View File

@ -1,4 +1,5 @@
source "${CI_DIR}/common/build.sh" source "${CI_DIR}/common/build.sh"
source "${CI_DIR}/common/suite.sh"
print_core() { print_core() {
local app="$1" local app="$1"
@ -40,10 +41,9 @@ check_core_dumps() {
print_core "$app" "$core" print_core "$app" "$core"
fi fi
done done
if test "$app" = quiet ; then if test "$app" != quiet ; then
return 0 fail 'cores' E 'Core dumps found'
fi fi
exit 1
} }
check_logs() { check_logs() {
@ -62,8 +62,7 @@ check_logs() {
err=1 err=1
done done
if [[ -n "${err}" ]]; then if [[ -n "${err}" ]]; then
echo "Runtime errors detected." fail 'logs' E 'Runtime errors detected.'
exit 1
fi fi
} }
@ -75,50 +74,53 @@ asan_check() {
check_logs "${1}" "*san.*" check_logs "${1}" "*san.*"
} }
run_unittests() { run_unittests() {(
enter_suite unittests
ulimit -c unlimited ulimit -c unlimited
if ! build_make unittest ; then if ! build_make unittest ; then
check_core_dumps "$(which luajit)" fail 'unittests' F 'Unit tests failed'
exit 1
fi fi
check_core_dumps "$(which luajit)" check_core_dumps "$(which luajit)"
} exit_suite
)}
run_functionaltests() { run_functionaltests() {(
enter_suite functionaltests
ulimit -c unlimited ulimit -c unlimited
if ! build_make ${FUNCTIONALTEST}; then if ! build_make ${FUNCTIONALTEST}; then
asan_check "${LOG_DIR}" fail 'functionaltests' F 'Functional tests failed'
valgrind_check "${LOG_DIR}"
check_core_dumps
exit 1
fi fi
asan_check "${LOG_DIR}" asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}" valgrind_check "${LOG_DIR}"
check_core_dumps check_core_dumps
} exit_suite
)}
run_oldtests() { run_oldtests() {(
enter_suite oldtests
ulimit -c unlimited ulimit -c unlimited
if ! make -C "${TRAVIS_BUILD_DIR}/src/nvim/testdir"; then if ! make -C "${TRAVIS_BUILD_DIR}/src/nvim/testdir"; then
reset reset
asan_check "${LOG_DIR}" fail 'oldtests' F 'Legacy tests failed'
valgrind_check "${LOG_DIR}"
check_core_dumps
exit 1
fi fi
asan_check "${LOG_DIR}" asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}" valgrind_check "${LOG_DIR}"
check_core_dumps check_core_dumps
} exit_suite
)}
install_nvim() { install_nvim() {(
build_make install enter_suite 'install_nvim'
if ! build_make install ; then
fail 'install' E 'make install failed'
exit_suite
fi
"${INSTALL_PREFIX}/bin/nvim" --version "${INSTALL_PREFIX}/bin/nvim" --version
"${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' || { "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' || {
echo "Running ':help' in the installed nvim failed." echo "Running ':help' in the installed nvim failed."
echo "Maybe the helptags have not been generated properly." echo "Maybe the helptags have not been generated properly."
exit 1 fail 'help' F 'Failed running :help'
} }
local genvimsynf=syntax/vim/generated.vim local genvimsynf=syntax/vim/generated.vim
@ -127,24 +129,22 @@ install_nvim() {
cd runtime ; git ls-files | grep -e '.vim$' -e '.ps$' -e '.dict$' -e '.py$' -e '.tutor$' cd runtime ; git ls-files | grep -e '.vim$' -e '.ps$' -e '.dict$' -e '.py$' -e '.tutor$'
) ; do ) ; do
if ! test -e "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then if ! test -e "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then
echo "It appears that $file is not installed." fail 'runtime-install' F "It appears that $file is not installed."
exit 1
fi fi
done done
# Check that generated syntax file has function names, #5060. # Check that generated syntax file has function names, #5060.
local gpat='syn keyword vimFuncName .*eval' local gpat='syn keyword vimFuncName .*eval'
if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf"; then if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf"; then
echo "It appears that $genvimsynf does not contain $gpat." fail 'funcnames' F "It appears that $genvimsynf does not contain $gpat."
exit 1
fi fi
for file in $( for file in $(
cd runtime ; git ls-files | grep -e '.awk$' -e '.sh$' -e '.bat$' cd runtime ; git ls-files | grep -e '.awk$' -e '.sh$' -e '.bat$'
) ; do ) ; do
if ! test -x "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then if ! test -x "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then
echo "It appears that $file is not installed or is not executable." fail 'not-exe' F "It appears that $file is not installed or is not executable."
exit 1
fi fi
done done
} exit_suite
)}

View File

@ -25,4 +25,4 @@ CLICOLOR_FORCE=1 run_test_wd \
'csi_clean' \ 'csi_clean' \
single-includes single-includes
exit_suite end_tests

View File

@ -27,8 +27,4 @@ run_test run_oldtests
run_test install_nvim run_test install_nvim
if succeeded ; then end_tests
touch "${SUCCESS_MARKER}"
fi
exit_suite