Newer
Older
# vim: set shiftwidth=4 softtabstop=4:

Vincent Hatakeyama
committed
#
# 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 overridden by setting ODOO_SCRIPTS_DB_USER.

Vincent Hatakeyama
committed
here=$(dirname $0)
source $here/common
tested_modules=${ODOO_SCRIPTS_MODULE_LIST_TESTS-$(read_odoo_scripts_expandable_configuration_key module_list_tests)}
if [[ "$tested_modules" != "" ]];
then
update="-u $tested_modules"
fi

Vincent Hatakeyama
committed
dbname=$(basename $(readlink -f $project_home))_test

Vincent Hatakeyama
committed
shift
echo "$INFO Using database $dbname for tests"
if [[ -n "$ODOO_SCRIPTS_DB_USER" ]]
then
echo "$INFO Using db user $ODOO_SCRIPTS_DB_USER"
db_user_param="--db_user $ODOO_SCRIPTS_DB_USER"
fi
ODOO_TYPE=${ODOO_TYPE:-$(read_odoo_scripts_configuration_key odoo_type odoo8)}

Vincent Hatakeyama
committed
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" ];
export PRE_ODOO_BIN="python3-coverage run --omit=__manifest__.py --source=$project_home "

Vincent Hatakeyama
committed
# Catch both stdout & stderr here as Odoo 10 uses stderr, unlike previous Odoo versions.

Vincent Hatakeyama
committed
$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
if [ "$CI" = "true" ];
echo -e "odoo_scripts_tests_ran $tests_ran\nodoo_scripts_tests_failures $tests_failures\nodoo_scripts_tests_error $tests_error\n# EOF\n" > metrics
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 "${esc}[2m*****${esc}[22m ${esc}[1mTest results${esc}[21m ${esc}[2m*****${esc}[22m"
echo "Ran $tests_ran tests, $tests_failures failures, $tests_errors errors"
if [ $ODOO_TYPE != 'odoo13' ];
then
echo "$OK $ok modules passing"
if [[ $ok -gt 0 ]];
then
# Highlight the "OK"s in green (32).
GREP_COLOR='0;32' grep --color=always ' OK' $logfile || true
if [[ $failed -gt 0 ]];
then
# 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
echo ''
rm $logfile
if [[ $start_status -ne 0 ]];
then
echo "$FATAL Tests failed (exit ${start_status})"
if [[ $tests_failures -gt 0 ]] || [[ $tests_errors -gt 0 ]];
then
echo "$FATAL Tests failed (found failure and errors in Ran N failures, M errors)"
exit 42
fi
if [[ $failed -gt 0 ]];
then
echo "$FATAL Tests failed (found failure with grep)"

Vincent Hatakeyama
committed
if [[ "${FAIL_ON_WARNING:-False}" != "False" ]];
then
if [[ $warnings -gt 0 ]];
then
echo "$FATAL Tests failed ($warnings WARNING found)"

Vincent Hatakeyama
committed
exit 1
fi