diff --git a/runbot/models/build_config.py b/runbot/models/build_config.py index 64ce96ea..fb7f0147 100644 --- a/runbot/models/build_config.py +++ b/runbot/models/build_config.py @@ -913,17 +913,20 @@ class ConfigStep(models.Model): log_time = self._get_log_last_write(build) if log_time: build.job_end = log_time - if self.job_type == 'python' and self.python_result_code and self.python_result_code != PYTHON_DEFAULT: - build.write(self._make_python_results(build)) - elif self.job_type in ['install_odoo', 'python']: + if self.job_type == 'python': + if self.python_result_code and self.python_result_code != PYTHON_DEFAULT: + self._make_python_results(build) + elif self.test_enable: + self._make_tests_results(build) + elif self.job_type == 'install_odoo': if self.coverage: build.write(self._make_coverage_results(build)) - if self.test_enable or self.test_tags: - build.write(self._make_tests_results(build)) + self._make_tests_results(build) + elif self.job_type == 'test_upgrade': - build.write(self._make_upgrade_results(build)) + self._make_upgrade_results(build) elif self.job_type == 'restore': - build.write(self._make_restore_results(build)) + self._make_restore_results(build) def _make_python_results(self, build): eval_ctx = self._make_python_ctx(build) @@ -932,7 +935,8 @@ class ConfigStep(models.Model): # todo check return_value or write in try except. Example: local result setted to wrong value if not isinstance(return_value, dict): raise RunbotException('python_result_code must set return_value to a dict values on build') - return return_value + if return_value: + build.write(return_value) def _make_coverage_results(self, build): build_values = {} @@ -952,7 +956,6 @@ class ConfigStep(models.Model): return build_values def _make_upgrade_results(self, build): - build_values = {} build._log('upgrade', 'Getting results for build %s' % build.dest) if build.local_result != 'ko': @@ -964,10 +967,7 @@ class ConfigStep(models.Model): self._check_build_ended, self._check_warning, ] - local_result = self._get_checkers_result(build, checkers) - build_values['local_result'] = build._get_worst_result([build.local_result, local_result]) - - return build_values + build.local_result = self._get_checkers_result(build, checkers) def _check_module_states(self, build): if not build._is_file('logs/modules_states.txt'): @@ -1037,7 +1037,6 @@ class ConfigStep(models.Model): return 'ok' def _make_tests_results(self, build): - build_values = {} build._log('run', 'Getting results for build %s' % build.dest) if build.local_result != 'ko': @@ -1045,25 +1044,20 @@ class ConfigStep(models.Model): self._check_log, self._check_module_loaded, self._check_error, - self._check_build_ended + self._check_build_ended, ] if build.local_result != 'warn': checkers.append(self._check_warning) - local_result = self._get_checkers_result(build, checkers) - build_values['local_result'] = build._get_worst_result([build.local_result, local_result]) - return build_values + build.local_result = self._get_checkers_result(build, checkers) def _make_restore_results(self, build): - build_values = {} - if build.local_result != 'warn': + if build.local_result not in ['ko', 'warn']: checkers = [ self._check_log, - self._check_restore_ended + self._check_restore_ended, ] - local_result = self._get_checkers_result(build, checkers) - build_values['local_result'] = build._get_worst_result([build.local_result, local_result]) - return build_values + build.local_result = self._get_checkers_result(build, checkers) def _make_stats(self, build): if not self.make_stats: # TODO garbage collect non sticky stat diff --git a/runbot/tests/test_build_config_step.py b/runbot/tests/test_build_config_step.py index 0922f97d..3f2c6b72 100644 --- a/runbot/tests/test_build_config_step.py +++ b/runbot/tests/test_build_config_step.py @@ -782,8 +782,32 @@ Initiating shutdown # no result defined config_step.python_result_code = "" - mock_make_tests_results.return_value = {'local_result': 'warn'} + + def set_ok(self, build): + build.local_result = 'ok' + + def set_warning(self, build): + build.local_result = 'warn' + + def set_ko(self, build): + build.local_result = 'ko' + + mock_make_tests_results.side_effect = set_warning config_step._make_results(build) self.assertEqual(build.local_result, 'warn') + mock_make_tests_results.side_effect = set_ok + config_step._make_results(build) + self.assertEqual(build.local_result, 'warn') + + # can go to error from warning + mock_make_tests_results.side_effect = set_ko + config_step._make_results(build) + self.assertEqual(build.local_result, 'ko') + + # cannot go to ok + mock_make_tests_results.side_effect = set_ok + config_step._make_results(build) + self.assertEqual(build.local_result, 'ko') + # TODO add generic test to copy_paste _run_* in a python step