diff --git a/cafe/drivers/unittest/decorators.py b/cafe/drivers/unittest/decorators.py index 813c1e5..c336662 100644 --- a/cafe/drivers/unittest/decorators.py +++ b/cafe/drivers/unittest/decorators.py @@ -156,7 +156,9 @@ class memoized(object): self.__name__ = func.func_name def __call__(self, *args): - self._start_logging(cclogging.get_object_namespace(args[0])) + log_name = "{0}.{1}".format( + cclogging.get_object_namespace(args[0]), self.__name__) + self._start_logging(log_name) if not isinstance(args, collections.Hashable): # uncacheable. a list, for instance. # better to not cache than blow up. @@ -181,12 +183,6 @@ class memoized(object): """Return the function's docstring.""" return self.func.__doc__ - # Because the root log is initialized in the base test fixture, and because - # datalist generators are run before that test fixture is initialized, - # it is neccessary to add a log handler to the root logger so that logs - # get logged. Once the root log handler initialization is moved - # upstream of the base test fixture initialization, this code can be - # removed. def _start_logging(self, log_file_name): setattr(self.func, '_log_handler', cclogging.setup_new_cchandler( log_file_name)) diff --git a/cafe/drivers/unittest/fixtures.py b/cafe/drivers/unittest/fixtures.py index c608b02..063289b 100644 --- a/cafe/drivers/unittest/fixtures.py +++ b/cafe/drivers/unittest/fixtures.py @@ -24,7 +24,6 @@ import re import unittest from cafe.drivers.base import FixtureReporter -from cafe.common.reporting.cclogging import init_root_log_handler class BaseTestFixture(unittest.TestCase): @@ -75,8 +74,6 @@ class BaseTestFixture(unittest.TestCase): @classmethod def setUpClass(cls): super(BaseTestFixture, cls).setUpClass() - # TODO: Move root log handler initialization to the runner! - init_root_log_handler() cls._reporter = FixtureReporter(cls) cls.fixture_log = cls._reporter.logger.log cls._reporter.start() diff --git a/cafe/drivers/unittest/runner.py b/cafe/drivers/unittest/runner.py index a37928c..d799801 100755 --- a/cafe/drivers/unittest/runner.py +++ b/cafe/drivers/unittest/runner.py @@ -27,7 +27,7 @@ from inspect import isclass from multiprocessing import Process, Manager from re import search from traceback import print_exc - +from cafe.common.reporting.cclogging import init_root_log_handler from cafe.common.reporting.cclogging import log_results from cafe.common.reporting.reporter import Reporter from cafe.configurator.managers import TestEnvManager @@ -673,6 +673,7 @@ class UnittestRunner(object): self.test_env.test_data_directory = ( self.test_env.test_data_directory or self.cl_args.data_directory) self.test_env.finalize() + init_root_log_handler() self.product = self.cl_args.product self.test_repo = ( self.test_env.engine_config_interface.default_test_repo) diff --git a/cafe/engine/models/data_interfaces.py b/cafe/engine/models/data_interfaces.py index a25d29d..1b53e2e 100644 --- a/cafe/engine/models/data_interfaces.py +++ b/cafe/engine/models/data_interfaces.py @@ -134,7 +134,12 @@ class ConfigParserDataSource(DataSource): try: return self._data_source.get(self._section_name, item_name) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError) as e: - self._log.error(str(e)) + if default is None: + self._log.error(str(e)) + else: + msg = "{0}. Using default value '{1}' instead".format( + str(e), default) + self._log.warning(msg) return default def get_raw(self, item_name, default=None): @@ -142,7 +147,12 @@ class ConfigParserDataSource(DataSource): return self._data_source.get( self._section_name, item_name, raw=True) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError) as e: - self._log.error(str(e)) + if default is None: + self._log.error(str(e)) + else: + msg = "{0}. Using default value '{1}' instead".format( + str(e), default) + self._log.warning(msg) return default def get_boolean(self, item_name, default=None): @@ -150,7 +160,12 @@ class ConfigParserDataSource(DataSource): try: return self._data_source.getboolean(self._section_name, item_name) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError) as e: - self._log.error(str(e)) + if default is None: + self._log.error(str(e)) + else: + msg = "{0}. Using default value '{1}' instead".format( + str(e), default) + self._log.warning(msg) return default