From dfed02207d71999a80c52d6472f2538c7e0cf2b2 Mon Sep 17 00:00:00 2001 From: Nataliia Uvarova Date: Wed, 9 Jul 2014 19:59:04 +0300 Subject: [PATCH] Run storage unit tests in pooled context Enable storage unit tests for pooled context. This patch adds check for pooling in test config in test initialization and creates appropriate wrappers. Also changes to sqlalchemy pooling controllers were made: in pooled context project cannot be None due to constraint in database. Change-Id: I59a663cef5b761e9470b8870d07cea03f5dac98b --- marconi/queues/storage/sqlalchemy/pools.py | 2 +- marconi/queues/storage/sqlalchemy/tables.py | 2 +- marconi/tests/queues/storage/base.py | 27 ++++++++++++++++-- .../unit/queues/storage/test_impl_mongodb.py | 28 +++++++++++++++++++ .../queues/storage/test_impl_sqlalchemy.py | 25 +++++++++++++++++ 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/marconi/queues/storage/sqlalchemy/pools.py b/marconi/queues/storage/sqlalchemy/pools.py index 1bd687f89..e54591188 100644 --- a/marconi/queues/storage/sqlalchemy/pools.py +++ b/marconi/queues/storage/sqlalchemy/pools.py @@ -135,6 +135,6 @@ def _normalize(pool, detailed=False): } if detailed: opts = pool[3] - ret['options'] = utils.json_decode(opts) if opts else None + ret['options'] = utils.json_decode(opts) if opts else {} return ret diff --git a/marconi/queues/storage/sqlalchemy/tables.py b/marconi/queues/storage/sqlalchemy/tables.py index bceca546b..00dc54bf1 100644 --- a/marconi/queues/storage/sqlalchemy/tables.py +++ b/marconi/queues/storage/sqlalchemy/tables.py @@ -68,6 +68,6 @@ Catalogue = sa.Table('Catalogue', metadata, sa.Column('pool', sa.String(64), sa.ForeignKey('Pools.name', ondelete='CASCADE')), - sa.Column('project', sa.String(64), nullable=False), + sa.Column('project', sa.String(64)), sa.Column('queue', sa.String(64), nullable=False), sa.UniqueConstraint('project', 'queue')) diff --git a/marconi/tests/queues/storage/base.py b/marconi/tests/queues/storage/base.py index d16a273e6..9144b4b2c 100644 --- a/marconi/tests/queues/storage/base.py +++ b/marconi/tests/queues/storage/base.py @@ -24,6 +24,7 @@ from testtools import matchers from marconi.openstack.common.cache import cache as oslo_cache from marconi.openstack.common import timeutils +from marconi.queues import bootstrap from marconi.queues import storage from marconi.queues.storage import errors from marconi import tests as testing @@ -52,13 +53,33 @@ class ControllerBaseTest(testing.TestBase): cache = oslo_cache.get_cache(self.conf.cache_url) # pylint: disable=not-callable - self.driver = self.driver_class(self.conf, cache) + self.conf.register_opts(bootstrap._GENERAL_OPTIONS) + pooling = 'pooling' in self.conf and self.conf.pooling + if pooling and not self.control_driver_class: + self.skipTest("Pooling is enabled, " + "but control driver class is not specified") + + if not pooling: + # pylint: disable=not-callable + self.driver = self.driver_class(self.conf, cache) + else: + # pylint: disable=not-callable + control = self.control_driver_class(self.conf, cache) + uri = "sqlite:///:memory:" + for i in range(4): + control.pools_controller.create(six.text_type(i), 100, uri) + self.driver = self.driver_class(self.conf, cache, control) + self._prepare_conf() self.addCleanup(self._purge_databases) - # pylint: disable=not-callable - self.controller = self.controller_class(self.driver) + if not pooling: + # pylint: disable=not-callable + self.controller = self.controller_class(self.driver) + else: + # pylint: disable=not-callable + self.controller = self.controller_class(self.driver._pool_catalog) def _prepare_conf(self): """Prepare the conf before running tests diff --git a/tests/unit/queues/storage/test_impl_mongodb.py b/tests/unit/queues/storage/test_impl_mongodb.py index 117dad8e7..14ae1acd6 100644 --- a/tests/unit/queues/storage/test_impl_mongodb.py +++ b/tests/unit/queues/storage/test_impl_mongodb.py @@ -32,6 +32,7 @@ from marconi.queues.storage import mongodb from marconi.queues.storage.mongodb import controllers from marconi.queues.storage.mongodb import options from marconi.queues.storage.mongodb import utils +from marconi.queues.storage import pooling from marconi import tests as testing from marconi.tests.queues.storage import base @@ -403,3 +404,30 @@ class MongodbCatalogueTests(base.CatalogueControllerTest): def tearDown(self): self.controller.drop_all() super(MongodbCatalogueTests, self).tearDown() + + +@testing.requires_mongodb +class PooledMessageTests(base.MessageControllerTest): + config_file = 'wsgi_mongodb_pooled.conf' + controller_class = pooling.MessageController + driver_class = pooling.DataDriver + control_driver_class = mongodb.ControlDriver + controller_base_class = pooling.RoutingController + + +@testing.requires_mongodb +class PooledQueueTests(base.QueueControllerTest): + config_file = 'wsgi_mongodb_pooled.conf' + controller_class = pooling.QueueController + driver_class = pooling.DataDriver + control_driver_class = mongodb.ControlDriver + controller_base_class = pooling.RoutingController + + +@testing.requires_mongodb +class PooledClaimsTests(base.ClaimControllerTest): + config_file = 'wsgi_mongodb_pooled.conf' + controller_class = pooling.ClaimController + driver_class = pooling.DataDriver + control_driver_class = mongodb.ControlDriver + controller_base_class = pooling.RoutingController diff --git a/tests/unit/queues/storage/test_impl_sqlalchemy.py b/tests/unit/queues/storage/test_impl_sqlalchemy.py index 56c09a062..947524f1b 100644 --- a/tests/unit/queues/storage/test_impl_sqlalchemy.py +++ b/tests/unit/queues/storage/test_impl_sqlalchemy.py @@ -17,6 +17,7 @@ import datetime import sqlalchemy as sa from marconi.queues.storage import errors +from marconi.queues.storage import pooling from marconi.queues.storage import sqlalchemy from marconi.queues.storage.sqlalchemy import controllers from marconi.queues.storage.sqlalchemy import tables @@ -100,3 +101,27 @@ class SqlalchemyCatalogueTest(base.CatalogueControllerTest): def tearDown(self): super(SqlalchemyCatalogueTest, self).tearDown() + + +class PooledMessageTests(base.MessageControllerTest): + config_file = 'wsgi_sqlalchemy_pooled.conf' + controller_class = pooling.MessageController + driver_class = pooling.DataDriver + control_driver_class = sqlalchemy.ControlDriver + controller_base_class = pooling.RoutingController + + +class PooledClaimsTests(base.ClaimControllerTest): + config_file = 'wsgi_sqlalchemy_pooled.conf' + controller_class = pooling.ClaimController + driver_class = pooling.DataDriver + control_driver_class = sqlalchemy.ControlDriver + controller_base_class = pooling.RoutingController + + +class PooledQueueTests(base.QueueControllerTest): + config_file = 'wsgi_sqlalchemy_pooled.conf' + controller_class = pooling.QueueController + driver_class = pooling.DataDriver + control_driver_class = sqlalchemy.ControlDriver + controller_base_class = pooling.RoutingController