Something went wrong on our end
-
Vincent Hatakeyama authored
shell script do not assume they are called from a directory in the project home, but called from the project home while the scripts themeselves might be somewhere else Other scripts already assumes that so it should not have much impact, it allows more possibility for the location of the scriptsVincent Hatakeyama authored shell script do not assume they are called from a directory in the project home, but called from the project home while the scripts themeselves might be somewhere else Other scripts already assumes that so it should not have much impact, it allows more possibility for the location of the scripts
run_tests 6.11 KiB
#!/bin/zsh
# vim: set shiftwidth=4 softtabstop=4:
#
# This script is used to run tests on a database with demo data installed.
#
# Either provide the name of the database (first argument) or it will default to <project>_test
# The DB user can be overriden by setting ODOO_SCRIPTS_DB_USER.
# Version 4.0
here=$(dirname $0)
# assume we are called from the project home
project_home=$PWD
if ! type python3 > /dev/null; then
python="python2"
else
python="python3"
fi
tested_modules=${ODOO_SCRIPTS_MODULE_LIST_TESTS-$($python -B -c "from six.moves import configparser ; c = configparser.ConfigParser() ; c.read('${project_home}/setup.cfg') ; print(','.join(c.get('odoo_scripts', 'module_list_tests').split() if c.has_option('odoo_scripts', 'module_list_tests') else []))")}
if [[ "$tested_modules" != "" ]];
then
update="-u $tested_modules"
fi
dbname=$1
if [[ -z "$dbname" ]];
then
dbname=$(basename $(readlink -f $project_home))_test
else
shift
fi
echo "Using database $dbname for tests"
if [[ -n "$ODOO_SCRIPTS_DB_USER" ]]
then
echo "Using db user $ODOO_SCRIPTS_DB_USER"
db_user_param="--db_user $ODOO_SCRIPTS_DB_USER"
fi
ODOO_TYPE=${ODOO_TYPE:-$($python -B -c "from six.moves import configparser ; c = configparser.ConfigParser() ; c.read('${project_home}/setup.cfg') ; print(c.get('odoo_scripts', 'odoo_type') if c.has_option('odoo_scripts', 'odoo_type') else 'odoo8')")}
if [ "$ODOO_TYPE" = "odoo8" ];
then
loglevel="--log-level=info"
else
loglevel="--log-level=test"
fi
logfile=$(tempfile --suffix=.log)
if [ "$ODOO_TYPE" = "odoo11" ] || [ "$ODOO_TYPE" = "odoo13" ];
then
export PRE_ODOO_BIN="python3-coverage run --source=$project_home "
fi
# Catch both stdout & stderr here as Odoo 10 uses stderr, unlike previous Odoo versions.
$here/start $update -d $dbname $db_user_param --test-enable $loglevel --max-cron=0 --stop-after-init $* 2>&1 | tee $logfile | sed -e 's/\(.*\) \(INFO\) \(.*\)/\o033[2m\1\o033[22m \o033[32m\o033[7m\2\o033[27m \3\o033[39m/' -e 's/\(.*\) \(DEBUG\) \(.*\)/\o033[2m\1\o033[22m \o033[33m\o033[7m\2\o033[27m \2\o033[39m/' -e 's/\(.*\) \(WARNING\) \(.*\)/\o033[2m\1\o033[22m \o033[33m\o033[7m\2\o033[27m \3\o033[39m/' -e 's/\(.*\) \(ERROR\) \(.*\)/\o033[2m\1\o033[22m \o033[31m\o033[7m\2\o033[27m \3\o033[0m/' -e 's/ FAILED/ \o033[41m\o033[97m\o033[1mFAILED\o033[0m/' -e 's/ FAIL\(.*\)/ \o033[41m\o033[97m\o033[1mFAIL\o033[49m\o033[31m\1\o033[0m/' -e 's/\(.*\) \(CRITICAL\) \(.*\)/\o033[2m\1\o033[22m \o033[33m\o033[7m\2\o033[27m \3\o033[39m/' -e 's/\(.*\) \(TEST\) \(.*\) \(ERROR\)\(.*\)/\o033[2m\1\o033[22m \o033[34m\o033[7m\2\o033[27m \3\o033[0m \o033[41m\o033[97m\o033[1m\4\o033[49m\o033[31m\5\o033[0m/' -e 's/\(.*\) \(TEST\) \(.*\) \(OK\)/\o033[2m\1\o033[22m \o033[34m\o033[7m\2\o033[27m \3\o033[0m \o033[32m\o033[7m\4\o033[27m\o033[39m/' -e 's/\(.*\) \(TEST\) \(.*\)/\o033[2m\1\o033[22m \o033[34m\o033[7m\2\o033[27m \3 \o033[0m/'
start_status=$pipestatus[1]
# Valid with odoo 7, 11, 13 and probably the rest too
tests_ran=$(grep -P 'o(penerp|doo).(modules.module|[^ ]+): Ran \K([[:digit:]]+)' $logfile -o | perl -ne '$sum += $_ } { print $sum')
tests_failures=$(grep -P 'o(penerp|doo).(modules.module|[^ ]+): Module [a-z0-9_]+: \K([[:digit:]]+)' $logfile -o | perl -ne '$sum += $_ } { print $sum')
# that might be doable in the perl above
if [ -z "$tests_failures" ];
then
tests_failures=0
fi
tests_errors=$(grep -P 'o(penerp|doo).(modules.module|[^ ]+): Module [a-z0-9_]+: [[:digit:]]+ failures, \K([[:digit:]]+)' $logfile -o | perl -ne '$sum += $_ } { print $sum')
if [ -z "$tests_errors" ];
then
tests_errors=0
fi
# create a metrics file
if [ "$CI" = "true" ];
then
echo -e "odoo_scripts_tests_ran $tests_ran\nodoo_scripts_tests_failures $tests_failures\nodoo_scripts_tests_error $tests_error" > metrics
fi
if [ $ODOO_TYPE != 'odoo13' ];
then
ok=$(grep ' OK' $logfile -c)
fi
# odoo 13 uses FAIL as the error message, in the form: FAIL: TestReorderingRule.test_reordering_rule
failed=$(grep ' FAIL\(ED\|:\)\| CRITICAL\| ERROR [^ ]* openerp.modules.module: Can not .import openerp\.addons\.\| TEST .* ERROR:\|Failed to initialize database\| ERROR \([[:alnum:]]\|_\)* .\+\.test_.\+ ERROR: ' $logfile -c)
warnings=$(grep ' WARNING ' $logfile -c)
# XXX Not sure this is needed anymore with the tests_failures/tests_errors detection
if [[ $failed -eq 0 ]];
then
# simple way to detect yaml failure
failed=$(grep 'openerp.modules.loading: At least one test failed when loading the modules.' $logfile -c)
fi
echo ''
echo '\e[2m*****\e[22m \e[1mTest results\e[21m \e[2m*****\e[22m'
echo "Ran $tests_ran tests, $tests_failures failures, $tests_errors errors"
if [ $ODOO_TYPE != 'odoo13' ];
then
echo "$ok modules passing"
fi
echo ''
if [[ $ok -gt 0 ]];
then
echo -e '\033[32mOK:\033[0m'
# Highlight the "OK"s in green (32).
GREP_COLOR='0;32' grep --color=always ' OK' $logfile || true
fi
if [[ $failed -gt 0 ]];
then
echo -e '\033[31mFailures\033[0m:'
# Highlight the failure matches in red (31).
GREP_COLOR='0;31' grep --color=always "CRITICAL\|FAIL\(ED\|:\)" $logfile
GREP_COLOR='0;31' grep --color=always "ERROR [^ ]* openerp\.tools\.yaml_import:" $logfile
GREP_COLOR='0;31' grep --color=always "ERROR [^ ]* openerp.modules.module: Can not \`import openerp\.addons\..*\`" $logfile
# this one is for odoo 7
GREP_COLOR='0;31' grep --color=always "TEST .* ERROR:" $logfile
# this one is for odoo 13 for tests that produces errors (failures are matched with FAIL: )
GREP_COLOR='0;31' grep --color=always "ERROR \([[:alnum:]]\|_\)* .\+\.test_.\+ ERROR:" $logfile
fi
echo ''
rm $logfile
if [[ $start_status -ne 0 ]];
then
echo "[${RED}FATAL${RESET}] Tests failed (exit ${start_status})"
exit $start_status
fi
if [[ $tests_failures -gt 0 ]] || [[ $tests_errors -gt 0 ]];
then
echo "[${RED}FATAL${RESET}] Tests failed (found failure and errors in Ran N failures, M errors)"
exit 42
fi
if [[ $failed -gt 0 ]];
then
echo "[${RED}FATAL${RESET}] Tests failed (found failure with grep)"
exit 1
fi
if [[ "${FAIL_ON_WARNING:-False}" != "False" ]];
then
if [[ $warnings -gt 0 ]];
then
echo "[${RED}FATAL${RESET}] Tests failed ($warnings WARNING found)"
exit 1
fi
fi