# HG changeset patch # User Pierre-Yves David # Date 1371736807 -7200 # Node ID 97c3bb9a7c9916f5a614f32700df0051e35c1ae7 # Parent 6cc13a0a9145c3fe370122554e1664dd78b5063c [testlib] move repo and related attribute back on Instance instead of Class The repo and cnx was hold by the TestCase class to work as a cache and avoid recreation of the repo from scratch of each test. However since bad26a22fe29 the caching is done by the DatabaseHandler object and it is not necessary have a second layer of cache on the TestCase itself. We move the repo and cnx attribute back on the TestCase instance itself and make several class methods instance methods again. This will helps to change dbapi access in test from dbapi to repoapi. related to #2503918 diff -r 6cc13a0a9145 -r 97c3bb9a7c99 devtools/testlib.py --- a/devtools/testlib.py Mon Jun 24 14:53:19 2013 +0200 +++ b/devtools/testlib.py Thu Jun 20 16:00:07 2013 +0200 @@ -178,17 +178,22 @@ tags = TestCase.tags | Tags('cubicweb', 'cw_repo') test_db_id = DEFAULT_EMPTY_DB_ID _cnxs = set() # establised connection - _cnx = None # current connection + # stay on connection for leak detection purpose + + def __init__(self, *args, **kwargs): + self._cnx = None # current connection + self.repo = None + self.websession = None + super(CubicWebTC, self).__init__(*args, **kwargs) # Too much complicated stuff. the class doesn't need to bear the repo anymore - @classmethod - def set_cnx(cls, cnx): - cls._cnxs.add(cnx) - cls._cnx = cnx + def set_cnx(self, cnx): + self._cnxs.add(cnx) + self._cnx = cnx @property def cnx(self): - return self.__class__._cnx + return self._cnx @classproperty def config(cls): @@ -237,27 +242,26 @@ pass #XXX this doesn't need to a be classmethod anymore - @classmethod - def _init_repo(cls): + def _init_repo(self): """init the repository and connection to it. """ # setup configuration for test - cls.init_config(cls.config) + self.init_config(self.config) # get or restore and working db. - db_handler = devtools.get_test_db_handler(cls.config) - db_handler.build_db_cache(cls.test_db_id, cls.pre_setup_database) + db_handler = devtools.get_test_db_handler(self.config) + db_handler.build_db_cache(self.test_db_id, self.pre_setup_database) - cls.repo, cnx = db_handler.get_repo_and_cnx(cls.test_db_id) + self.repo, cnx = db_handler.get_repo_and_cnx(self.test_db_id) # no direct assignation to cls.cnx anymore. # cnx is now an instance property that use a class protected attributes. - cls.set_cnx(cnx) - cls.websession = dbapi.DBAPISession(cnx, cls.admlogin) - cls._orig_cnx = (cnx, cls.websession) - cls.config.repository = lambda x=None: cls.repo + self.set_cnx(cnx) + self.websession = dbapi.DBAPISession(cnx, self.admlogin) + self._orig_cnx = (cnx, self.websession) + self.config.repository = lambda x=None: self.repo - @classproperty - def vreg(cls): - return cls.repo.vreg + @property + def vreg(self): + return self.repo.vreg def _close_cnx(self): for cnx in list(self._cnxs): diff -r 6cc13a0a9145 -r 97c3bb9a7c99 doc/4.0.rst --- a/doc/4.0.rst Mon Jun 24 14:53:19 2013 +0200 +++ b/doc/4.0.rst Thu Jun 20 16:00:07 2013 +0200 @@ -31,6 +31,10 @@ * ``request.set_session`` no longer takes an optional ``user`` argument. +* CubicwebTC does not have repo and cnx as class attributes anymore. They are + standard instance attributes. ``set_cnx`` and ``_init_repo`` class methods + become instance methods. + Deprecated Code Drops ---------------------- diff -r 6cc13a0a9145 -r 97c3bb9a7c99 server/test/unittest_migractions.py --- a/server/test/unittest_migractions.py Mon Jun 24 14:53:19 2013 +0200 +++ b/server/test/unittest_migractions.py Thu Jun 20 16:00:07 2013 +0200 @@ -45,19 +45,18 @@ tags = CubicWebTC.tags | Tags(('server', 'migration', 'migractions')) - @classmethod - def _init_repo(cls): - super(MigrationCommandsTC, cls)._init_repo() + def _init_repo(self): + super(MigrationCommandsTC, self)._init_repo() # we have to read schema from the database to get eid for schema entities - cls.repo.set_schema(cls.repo.deserialize_schema(), resetvreg=False) + self.repo.set_schema(self.repo.deserialize_schema(), resetvreg=False) # hack to read the schema from data/migrschema - config = cls.config + config = self.config config.appid = join('data', 'migratedapp') - config._apphome = cls.datapath('migratedapp') + config._apphome = self.datapath('migratedapp') global migrschema migrschema = config.load_schema() config.appid = 'data' - config._apphome = cls.datadir + config._apphome = self.datadir assert 'Folder' in migrschema def setUp(self): diff -r 6cc13a0a9145 -r 97c3bb9a7c99 server/test/unittest_multisources.py --- a/server/test/unittest_multisources.py Mon Jun 24 14:53:19 2013 +0200 +++ b/server/test/unittest_multisources.py Thu Jun 20 16:00:07 2013 +0200 @@ -70,40 +70,29 @@ test_db_id= 'cw-server-multisources' tags = CubicWebTC.tags | Tags(('multisources')) - @classmethod - def setUpClass(cls): - cls._cfg2 = ExternalSource1Configuration('data', apphome=TwoSourcesTC.datadir) - cls._cfg3 = ExternalSource2Configuration('data', apphome=TwoSourcesTC.datadir) + + def _init_repo(self): + repo2_handler = get_test_db_handler(self._cfg2) + repo2_handler.build_db_cache('4cards-1affaire',pre_setup_func=pre_setup_database_extern) + self.repo2, self.cnx2 = repo2_handler.get_repo_and_cnx('4cards-1affaire') + + repo3_handler = get_test_db_handler(self._cfg3) + repo3_handler.build_db_cache('multisource',pre_setup_func=pre_setup_database_multi) + self.repo3, self.cnx3 = repo3_handler.get_repo_and_cnx('multisource') + + + super(TwoSourcesTC, self)._init_repo() + + def setUp(self): + self._cfg2 = ExternalSource1Configuration('data', apphome=TwoSourcesTC.datadir) + self._cfg3 = ExternalSource2Configuration('data', apphome=TwoSourcesTC.datadir) TestServerConfiguration.no_sqlite_wrap = True # hi-jack PyroRQLSource.get_connection to access existing connection (no # pyro connection) - PyroRQLSource.get_connection = lambda x: x.uri == 'extern-multi' and cls.cnx3 or cls.cnx2 + PyroRQLSource.get_connection = lambda x: x.uri == 'extern-multi' and self.cnx3 or self.cnx2 # also necessary since the repository is closing its initial connections # pool though we want to keep cnx2 valid Connection.close = lambda x: None - - @classmethod - def tearDowncls(cls): - PyroRQLSource.get_connection = PyroRQLSource_get_connection - Connection.close = Connection_close - cls.cnx2.close() - cls.cnx3.close() - TestServerConfiguration.no_sqlite_wrap = False - - @classmethod - def _init_repo(cls): - repo2_handler = get_test_db_handler(cls._cfg2) - repo2_handler.build_db_cache('4cards-1affaire',pre_setup_func=pre_setup_database_extern) - cls.repo2, cls.cnx2 = repo2_handler.get_repo_and_cnx('4cards-1affaire') - - repo3_handler = get_test_db_handler(cls._cfg3) - repo3_handler.build_db_cache('multisource',pre_setup_func=pre_setup_database_multi) - cls.repo3, cls.cnx3 = repo3_handler.get_repo_and_cnx('multisource') - - - super(TwoSourcesTC, cls)._init_repo() - - def setUp(self): CubicWebTC.setUp(self) self.addCleanup(self.cnx2.close) self.addCleanup(self.cnx3.close) @@ -112,9 +101,10 @@ def tearDown(self): for source in self.repo.sources[1:]: self.repo.remove_source(source.uri) - CubicWebTC.tearDown(self) - self.cnx2.close() - self.cnx3.close() + super(TwoSourcesTC, self).tearDown() + PyroRQLSource.get_connection = PyroRQLSource_get_connection + Connection.close = Connection_close + TestServerConfiguration.no_sqlite_wrap = False undo_monkey_patch() @staticmethod