# HG changeset patch # User Sylvain Thénault # Date 1397555737 -7200 # Node ID 0872ac2a1db00e8dde0cf6a8a0da41807d4b8c50 # Parent 4903a959604a05f44f59aae3e914814713aaa89a [testlib] call init_config once the config has been properly bootstraped This should be done right after repository instantiation and as such involves giving CWTC.init_config as a callback to the test database handler (which will itself gives it to the repository initialization function). This unfortunatly requires to pass the init_config method to the server.init_repository function because it has to be called after the config has been initialized (which is done in Repository.__init__) but before the migration handler is instantiated (which will call 'server_maintainance' hook, hence may require the proper config). Another way to fix this would be to change the initialization sequence, but this is another story. Closes #3749378 diff -r 4903a959604a -r 0872ac2a1db0 devtools/__init__.py --- a/devtools/__init__.py Thu Jun 12 17:50:50 2014 +0200 +++ b/devtools/__init__.py Tue Apr 15 11:55:37 2014 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -293,8 +293,9 @@ db_cache = {} explored_glob = set() - def __init__(self, config): + def __init__(self, config, init_config=None): self.config = config + self.init_config = init_config self._repo = None # pure consistency check assert self.system_source['db-driver'] == self.DRIVER @@ -382,6 +383,9 @@ """ if self._repo is None: self._repo = self._new_repo(self.config) + # config has now been bootstrapped, call init_config if specified + if self.init_config is not None: + self.init_config(self.config) repo = self._repo repo.turn_repo_on() if startup and not repo._has_started: @@ -536,8 +540,8 @@ for datadir in cls.__CTL: subprocess.call(['pg_ctl', 'stop', '-D', datadir, '-m', 'fast']) - def __init__(self, config): - super(PostgresTestDataBaseHandler, self).__init__(config) + def __init__(self, *args, **kwargs): + super(PostgresTestDataBaseHandler, self).__init__(*args, **kwargs) datadir = join(self.config.apphome, 'pgdb') if not exists(datadir): subprocess.check_call(['initdb', '-D', datadir, '-E', 'utf-8', '--locale=C']) @@ -605,7 +609,8 @@ finally: templcursor.close() cnx.close() - init_repository(self.config, interactive=False) + init_repository(self.config, interactive=False, + init_config=self.init_config) except BaseException: if self.dbcnx is not None: self.dbcnx.rollback() @@ -681,7 +686,8 @@ """initialize a fresh sqlserver databse used for testing purpose""" if self.config.init_repository: from cubicweb.server import init_repository - init_repository(self.config, interactive=False, drop=True) + init_repository(self.config, interactive=False, drop=True, + init_config=self.init_config) ### sqlite test database handling ############################################## @@ -758,7 +764,8 @@ # initialize the database from cubicweb.server import init_repository self._cleanup_database(self.absolute_dbfile()) - init_repository(self.config, interactive=False) + init_repository(self.config, interactive=False, + init_config=self.init_config) import atexit atexit.register(SQLiteTestDataBaseHandler._cleanup_all_tmpdb) @@ -852,7 +859,7 @@ # XXX a class method on Test ? _CONFIG = None -def get_test_db_handler(config): +def get_test_db_handler(config, init_config=None): global _CONFIG if _CONFIG is not None and config is not _CONFIG: from logilab.common.modutils import cleanup_sys_modules @@ -873,7 +880,7 @@ key = (driver, config) handlerkls = HANDLERS.get(driver, None) if handlerkls is not None: - handler = handlerkls(config) + handler = handlerkls(config, init_config) if config.skip_db_create_and_restore: handler = NoCreateDropDatabaseHandler(handler) HCACHE.set(config, handler) diff -r 4903a959604a -r 0872ac2a1db0 devtools/testlib.py --- a/devtools/testlib.py Thu Jun 12 17:50:50 2014 +0200 +++ b/devtools/testlib.py Tue Apr 15 11:55:37 2014 +0200 @@ -413,12 +413,9 @@ def _init_repo(self): """init the repository and connection to it. """ - # setup configuration for test - self.init_config(self.config) # get or restore and working db. - db_handler = devtools.get_test_db_handler(self.config) + db_handler = devtools.get_test_db_handler(self.config, self.init_config) db_handler.build_db_cache(self.test_db_id, self.pre_setup_database) - db_handler.restore_database(self.test_db_id) self.repo = db_handler.get_repo(startup=True) # get an admin session (without actual login) @@ -501,14 +498,18 @@ config.mode = 'test' return config - @classmethod + @classmethod # XXX could be turned into a regular method def init_config(cls, config): """configuration initialization hooks. You may only want to override here the configuraton logic. Otherwise, consider to use a different :class:`ApptestConfiguration` - defined in the `configcls` class attribute""" + defined in the `configcls` class attribute. + + This method will be called by the database handler once the config has + been properly bootstrapped. + """ source = config.system_source_config cls.admlogin = unicode(source['db-user']) cls.admpassword = source['db-password'] diff -r 4903a959604a -r 0872ac2a1db0 server/__init__.py --- a/server/__init__.py Thu Jun 12 17:50:50 2014 +0200 +++ b/server/__init__.py Tue Apr 15 11:55:37 2014 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -197,7 +197,8 @@ {'u': user.eid, 'group': group}) return user -def init_repository(config, interactive=True, drop=False, vreg=None): +def init_repository(config, interactive=True, drop=False, vreg=None, + init_config=None): """initialise a repository database by creating tables add filling them with the minimal set of entities (ie at least the schema, base groups and a initial user) @@ -215,6 +216,9 @@ config.cube_appobject_path = set(('hooks', 'entities')) # only enable the system source at initialization time repo = Repository(config, vreg=vreg) + if init_config is not None: + # further config initialization once it has been bootstrapped + init_config(config) schema = repo.schema sourcescfg = config.read_sources_file() source = sourcescfg['system']