Multiple testing fixes

* Changes NotificationHandler base to be a object and the tests to inherit it
  like a mixin, test_invalid method fails if not due to duplicate test id.
* Changes backend tests to use scenarios and special NSD4 tests puts the setUp
  logic into a fixture which is loaded for the NSD4 backend tests.
* Remove any get_*_service call into start_service(name) which uses a fixture
  ServiceFixture that automatically cleans up the service upon teardown (no
  more sprinkling tearDowns all over the tests to stop a service).
* Use fixture for database. Removes storage.setup_schema and teardown_schema.
* Fix cleanup of notifications.
* Use fixture for Policy instead of in teardown().

bug #1256728

Change-Id: I72a53eed9e81d3f014015aa443582de21a4e66ee
This commit is contained in:
Endre Karlson 2013-12-02 01:25:49 +01:00
parent a109782c8a
commit eb164336c5
23 changed files with 269 additions and 360 deletions

View File

@ -24,17 +24,3 @@ def get_storage():
""" Return the engine class from the provided engine name """ """ Return the engine class from the provided engine name """
storage_driver = cfg.CONF['service:central'].storage_driver storage_driver = cfg.CONF['service:central'].storage_driver
return Storage.get_plugin(storage_driver, invoke_on_load=True) return Storage.get_plugin(storage_driver, invoke_on_load=True)
def setup_schema():
""" Create the DB - Used for testing purposes """
LOG.debug("Setting up Schema")
storage = get_storage()
storage.setup_schema()
def teardown_schema():
""" Reset the DB to default - Used for testing purposes """
LOG.debug("Tearing down Schema")
storage = get_storage()
storage.teardown_schema()

View File

@ -22,15 +22,12 @@ from oslo.config import cfg
from designate.openstack.common import log as logging from designate.openstack.common import log as logging
from designate.openstack.common.notifier import test_notifier from designate.openstack.common.notifier import test_notifier
from designate.openstack.common.fixture import config from designate.openstack.common.fixture import config
from designate.openstack.common import importutils
from designate.openstack.common import policy from designate.openstack.common import policy
from designate.openstack.common import test from designate.openstack.common import test
from designate.context import DesignateContext from designate.context import DesignateContext
from designate import storage from designate import storage
from designate import exceptions from designate import exceptions
from designate.agent import service as agent_service
from designate.api import service as api_service
from designate.central import service as central_service
from designate.sink import service as sink_service
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -42,11 +39,24 @@ cfg.CONF.import_opt('auth_strategy', 'designate.api',
group='service:api') group='service:api')
cfg.CONF.import_opt('database_connection', 'designate.storage.impl_sqlalchemy', cfg.CONF.import_opt('database_connection', 'designate.storage.impl_sqlalchemy',
group='storage:sqlalchemy') group='storage:sqlalchemy')
# NOTE: Since we're importing service classes in start_service this breaks
# if not here.
cfg.CONF.import_opt(
'notification_driver', 'designate.openstack.common.notifier.api')
class StorageFixture(fixtures.Fixture):
def setUp(self):
super(StorageFixture, self).setUp()
self.storage = storage.get_storage()
self.storage.setup_schema()
self.addCleanup(self.storage.teardown_schema)
class NotifierFixture(fixtures.Fixture): class NotifierFixture(fixtures.Fixture):
def tearDown(self): def setUp(self):
self.clear() super(NotifierFixture, self).setUp()
self.addCleanup(self.clear)
def get(self): def get(self):
return test_notifier.NOTIFICATIONS return test_notifier.NOTIFICATIONS
@ -55,6 +65,30 @@ class NotifierFixture(fixtures.Fixture):
test_notifier.NOTIFICATIONS = [] test_notifier.NOTIFICATIONS = []
class ServiceFixture(fixtures.Fixture):
def __init__(self, svc_name, *args, **kw):
cls = importutils.import_class(
'designate.%s.service.Service' % svc_name)
self.svc = cls(*args, **kw)
def setUp(self):
super(ServiceFixture, self).setUp()
self.svc.start()
self.addCleanup(self.kill)
def kill(self):
try:
self.svc.kill()
except Exception:
pass
class PolicyFixture(fixtures.Fixture):
def setUp(self):
super(PolicyFixture, self).setUp()
self.addCleanup(policy.reset)
class TestCase(test.BaseTestCase): class TestCase(test.BaseTestCase):
quota_fixtures = [{ quota_fixtures = [{
'tenant_id': '12345', 'tenant_id': '12345',
@ -138,16 +172,13 @@ class TestCase(test.BaseTestCase):
self.notifications = NotifierFixture() self.notifications = NotifierFixture()
self.useFixture(self.notifications) self.useFixture(self.notifications)
storage.setup_schema() storage_fixture = StorageFixture()
self.useFixture(storage_fixture)
self.useFixture(PolicyFixture())
self.admin_context = self.get_admin_context() self.admin_context = self.get_admin_context()
def tearDown(self):
self.reset_notifications()
policy.reset()
storage.teardown_schema()
super(TestCase, self).tearDown()
# Config Methods # Config Methods
def config(self, **kwargs): def config(self, **kwargs):
group = kwargs.pop('group', None) group = kwargs.pop('group', None)
@ -174,18 +205,13 @@ class TestCase(test.BaseTestCase):
def reset_notifications(self): def reset_notifications(self):
self.notifications.clear() self.notifications.clear()
# Service Methods def start_service(self, svc_name, *args, **kw):
def get_agent_service(self): """
return agent_service.Service() Convenience method for starting a service!
"""
def get_api_service(self): fixture = ServiceFixture(svc_name, *args, **kw)
return api_service.Service() self.useFixture(fixture)
return fixture.svc
def get_central_service(self):
return central_service.Service()
def get_sink_service(self):
return sink_service.Service()
# Context Methods # Context Methods
def get_context(self, **kwargs): def get_context(self, **kwargs):

View File

@ -19,9 +19,8 @@ from designate.tests.test_agent import AgentTestCase
class AgentServiceTest(AgentTestCase): class AgentServiceTest(AgentTestCase):
def setUp(self): def setUp(self):
super(AgentServiceTest, self).setUp() super(AgentServiceTest, self).setUp()
self.service = self.get_agent_service() self.service = self.start_service('agent')
def test_start_and_stop(self): def test_stop(self):
# Ensures the start/stop actions don't raise # NOTE: Start is already done by the fixture in start_service()
self.service.start()
self.service.stop() self.service.stop()

View File

@ -23,9 +23,8 @@ class ApiServiceTest(ApiTestCase):
# Use a random port for the API # Use a random port for the API
self.config(api_port=0, group='service:api') self.config(api_port=0, group='service:api')
self.service = self.get_api_service() self.service = self.start_service('api')
def test_start_and_stop(self): def test_start_and_stop(self):
# Ensures the start/stop actions don't raise # NOTE: Start is already done by the fixture in start_service()
self.service.start()
self.service.stop() self.service.stop()

View File

@ -44,13 +44,7 @@ class ApiV1Test(ApiTestCase):
# Obtain a test client # Obtain a test client
self.client = self.app.test_client() self.client = self.app.test_client()
# Create and start an instance of the central service self.central_service = self.start_service('central')
self.central_service = self.get_central_service()
self.central_service.start()
def tearDown(self):
self.central_service.stop()
super(ApiV1Test, self).tearDown()
def get(self, path, **kw): def get(self, path, **kw):
expected_status_code = kw.pop('status_code', 200) expected_status_code = kw.pop('status_code', 200)

View File

@ -43,13 +43,10 @@ class ApiV2TestCase(ApiTestCase):
self.client = TestApp(self.app) self.client = TestApp(self.app)
# Create and start an instance of the central service # Create and start an instance of the central service
self.central_service = self.get_central_service() self.central_service = self.start_service('central')
self.central_service.start()
def tearDown(self): def tearDown(self):
self.app = None self.app = None
self.client = None self.client = None
self.central_service.stop()
super(ApiV2TestCase, self).tearDown() super(ApiV2TestCase, self).tearDown()

View File

@ -1,6 +1,6 @@
# Copyright 2012 Managed I.T. # Copyright 2013 Hewlett-Packard Development Company, L.P.
# #
# Author: Kiall Mac Innes <kiall@managedit.ie> # Author: Kiall Mac Innes <kiall@hp.com>
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain # not use this file except in compliance with the License. You may obtain
@ -13,19 +13,3 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from oslo.config import cfg
from designate.openstack.common import log as logging
from designate.tests import TestCase
from designate import backend
LOG = logging.getLogger(__name__)
class BackendTestCase(TestCase):
def get_backend_driver(self):
central_service = self.get_central_service()
return backend.get_backend(cfg.CONF['service:agent'].backend_driver,
central_service=central_service)
def test_constructor(self):
self.get_backend_driver()

View File

@ -0,0 +1,51 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from testscenarios import load_tests_apply_scenarios as load_tests # noqa
from oslo.config import cfg
from designate.openstack.common import log as logging
from designate import backend
from designate import tests
from designate.tests.test_backend.test_nsd4slave import NSD4Fixture
LOG = logging.getLogger(__name__)
class BackendTestCase(tests.TestCase):
scenarios = [
('bind9', dict(backend_driver='bind9', group='service:agent')),
('dnsmasq', dict(backend_driver='dnsmasq', group='service:agent')),
('fake', dict(backend_driver='fake', group='service:agent')),
('mysqlbind9', dict(backend_driver='mysqlbind9',
group='service:agent')),
('nsd4slave', dict(backend_driver='nsd4slave', group='service:agent',
server_fixture=NSD4Fixture)),
('powerdns', dict(backend_driver='powerdns', group='service:agent'))
]
def setUp(self):
super(BackendTestCase, self).setUp()
if hasattr(self, 'server_fixture'):
self.useFixture(self.server_fixture())
self.config(backend_driver=self.backend_driver, group=self.group)
def get_backend_driver(self):
central_service = self.start_service('central')
return backend.get_backend(cfg.CONF['service:agent'].backend_driver,
central_service=central_service)
def test_constructor(self):
self.get_backend_driver()

View File

@ -1,26 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_backend import BackendTestCase
LOG = logging.getLogger(__name__)
class Bind9BackendDriverTestCase(BackendTestCase):
def setUp(self):
super(Bind9BackendDriverTestCase, self).setUp()
self.config(backend_driver='bind9', group='service:agent')

View File

@ -1,26 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_backend import BackendTestCase
LOG = logging.getLogger(__name__)
class DnsmasqBackendDriverTestCase(BackendTestCase):
def setUp(self):
super(DnsmasqBackendDriverTestCase, self).setUp()
self.config(backend_driver='dnsmasq', group='service:agent')

View File

@ -1,26 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_backend import BackendTestCase
LOG = logging.getLogger(__name__)
class FakeBackendDriverTestCase(BackendTestCase):
def setUp(self):
super(FakeBackendDriverTestCase, self).setUp()
self.config(backend_driver='fake', group='service:agent')

View File

@ -1,26 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_backend import BackendTestCase
LOG = logging.getLogger(__name__)
class MySQLBind9BackendDriverTestCase(BackendTestCase):
def setUp(self):
super(MySQLBind9BackendDriverTestCase, self).setUp()
self.config(backend_driver='mysqlbind9', group='service:agent')

View File

@ -15,12 +15,16 @@
# under the License. # under the License.
import eventlet import eventlet
import fixtures
from mock import MagicMock
import os import os
import socket import socket
import ssl import ssl
from oslo.config import cfg
from designate import backend
from designate import exceptions from designate import exceptions
from designate.tests.test_backend import BackendTestCase from designate import tests
from mock import MagicMock
# impl_nsd4slave needs to register its options before being instanciated. # impl_nsd4slave needs to register its options before being instanciated.
# Import it and pretend to use it to avoid flake8 unused import errors. # Import it and pretend to use it to avoid flake8 unused import errors.
from designate.backend import impl_nsd4slave from designate.backend import impl_nsd4slave
@ -58,36 +62,46 @@ class NSD4ServerStub:
eventlet.StopServe() eventlet.StopServe()
class NSD4SlaveBackendTestCase(BackendTestCase): class NSD4Fixture(fixtures.Fixture):
__test__ = True
def setUp(self): def setUp(self):
super(NSD4SlaveBackendTestCase, self).setUp() super(NSD4Fixture, self).setUp()
self.servers = [NSD4ServerStub(), NSD4ServerStub()] self.servers = [NSD4ServerStub(), NSD4ServerStub()]
[server.start() for server in self.servers] [server.start() for server in self.servers]
impl_nsd4slave.DEFAULT_PORT = self.servers[0].port impl_nsd4slave.DEFAULT_PORT = self.servers[0].port
self.config(backend_driver='nsd4slave', group='service:agent') cfg.CONF.set_override('backend_driver', 'nsd4slave', 'service:agent')
self.config( cfg.CONF.set_override(
servers=['127.0.0.1', '127.0.0.1:%d' % self.servers[1].port], 'servers', ['127.0.0.1', '127.0.0.1:%d' % self.servers[1].port],
group='backend:nsd4slave') 'backend:nsd4slave')
keyfile = os.path.join(os.path.dirname(__file__), 'nsd_control.key') keyfile = os.path.join(os.path.dirname(__file__), 'nsd_control.key')
certfile = os.path.join(os.path.dirname(__file__), 'nsd_control.pem') certfile = os.path.join(os.path.dirname(__file__), 'nsd_control.pem')
self.config(keyfile=keyfile, group='backend:nsd4slave') cfg.CONF.set_override('keyfile', keyfile, 'backend:nsd4slave')
self.config(certfile=certfile, group='backend:nsd4slave') cfg.CONF.set_override('certfile', certfile, 'backend:nsd4slave')
self.config(pattern='test-pattern', group='backend:nsd4slave') cfg.CONF.set_override('pattern', 'test-pattern', 'backend:nsd4slave')
self.nsd4 = self.get_backend_driver() self.addCleanup(self.tearDown)
def tearDown(self): def tearDown(self):
super(NSD4SlaveBackendTestCase, self).tearDown()
[server.stop() for server in self.servers] [server.stop() for server in self.servers]
# NOTE: We'll only test the specifics to the nsd4 backend here.
# Rest is handled via scenarios
class NSD4SlaveBackendTestCase(tests.TestCase):
def setUp(self):
super(NSD4SlaveBackendTestCase, self).setUp()
self.server_fixture = NSD4Fixture()
self.useFixture(self.server_fixture)
central_service = self.start_service('central')
self.nsd4 = backend.get_backend(
cfg.CONF['service:agent'].backend_driver,
central_service=central_service)
def test_create_domain(self): def test_create_domain(self):
context = self.get_context() context = self.get_context()
domain = self.get_domain_fixture() domain = self.get_domain_fixture()
self.nsd4.create_domain(context, domain) self.nsd4.create_domain(context, domain)
command = 'NSDCT1 addzone %s test-pattern\n' % domain['name'] command = 'NSDCT1 addzone %s test-pattern\n' % domain['name']
[self.assertEqual(server.recved_command, command) [self.assertEqual(server.recved_command, command)
for server in self.servers] for server in self.server_fixture.servers]
def test_delete_domain(self): def test_delete_domain(self):
context = self.get_context() context = self.get_context()
@ -95,10 +109,10 @@ class NSD4SlaveBackendTestCase(BackendTestCase):
self.nsd4.delete_domain(context, domain) self.nsd4.delete_domain(context, domain)
command = 'NSDCT1 delzone %s\n' % domain['name'] command = 'NSDCT1 delzone %s\n' % domain['name']
[self.assertEqual(server.recved_command, command) [self.assertEqual(server.recved_command, command)
for server in self.servers] for server in self.server_fixture.servers]
def test_server_not_ok(self): def test_server_not_ok(self):
self.servers[0].response = 'goat' self.server_fixture.servers[0].response = 'goat'
context = self.get_context() context = self.get_context()
domain = self.get_domain_fixture() domain = self.get_domain_fixture()
self.assertRaises(exceptions.NSD4SlaveBackendError, self.assertRaises(exceptions.NSD4SlaveBackendError,

View File

@ -1,26 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_backend import BackendTestCase
LOG = logging.getLogger(__name__)
class PowerDNSBackendDriverTestCase(BackendTestCase):
def setUp(self):
super(PowerDNSBackendDriverTestCase, self).setUp()
self.config(backend_driver='powerdns', group='service:agent')

View File

@ -26,11 +26,10 @@ LOG = logging.getLogger(__name__)
class CentralServiceTest(CentralTestCase): class CentralServiceTest(CentralTestCase):
def setUp(self): def setUp(self):
super(CentralServiceTest, self).setUp() super(CentralServiceTest, self).setUp()
self.central_service = self.get_central_service() self.central_service = self.start_service('central')
def test_start_and_stop(self): def test_stop(self):
# Ensures the start/stop actions don't raise # Test stopping the service
self.central_service.start()
self.central_service.stop() self.central_service.stop()
def test_is_valid_domain_name(self): def test_is_valid_domain_name(self):

View File

@ -15,31 +15,14 @@
# under the License. # under the License.
import json import json
import os import os
import six
import testtools import testtools
from designate.notification_handler.base import Handler
from designate.tests import TestCase
from designate.tests import SkipNotImplementedMeta
FIXTURES_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), FIXTURES_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__),
'..', '..',
'sample_notifications')) 'sample_notifications'))
@six.add_metaclass(SkipNotImplementedMeta) class NotificationHandlerMixin(object):
class NotificationHandlerTestCase(TestCase):
__plugin_base__ = Handler
def setUp(self):
super(NotificationHandlerTestCase, self).setUp()
self.central_service = self.get_central_service()
self.central_service.start()
def tearDown(self):
self.central_service.stop()
super(NotificationHandlerTestCase, self).tearDown()
def get_notification_fixture(self, service, name): def get_notification_fixture(self, service, name):
filename = os.path.join(FIXTURES_PATH, service, '%s.json' % name) filename = os.path.join(FIXTURES_PATH, service, '%s.json' % name)

View File

@ -14,17 +14,20 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from designate.openstack.common import log as logging from designate.openstack.common import log as logging
from designate.tests import TestCase
from designate.notification_handler.nova import NovaFixedHandler from designate.notification_handler.nova import NovaFixedHandler
from designate.tests.test_notification_handler import \ from designate.tests.test_notification_handler import \
NotificationHandlerTestCase NotificationHandlerMixin
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class NovaFixedHandlerTest(NotificationHandlerTestCase): class NovaFixedHandlerTest(TestCase, NotificationHandlerMixin):
def setUp(self): def setUp(self):
super(NovaFixedHandlerTest, self).setUp() super(NovaFixedHandlerTest, self).setUp()
self.central_service = self.start_service('central')
domain = self.create_domain() domain = self.create_domain()
self.domain_id = domain['id'] self.domain_id = domain['id']
self.config(domain_id=domain['id'], group='handler:nova_fixed') self.config(domain_id=domain['id'], group='handler:nova_fixed')

View File

@ -14,17 +14,20 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from designate.openstack.common import log as logging from designate.openstack.common import log as logging
from designate.tests import TestCase
from designate.notification_handler.quantum import QuantumFloatingHandler from designate.notification_handler.quantum import QuantumFloatingHandler
from designate.tests.test_notification_handler import \ from designate.tests.test_notification_handler import \
NotificationHandlerTestCase NotificationHandlerMixin
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class QuantumFloatingHandlerTest(NotificationHandlerTestCase): class QuantumFloatingHandlerTest(TestCase, NotificationHandlerMixin):
def setUp(self): def setUp(self):
super(QuantumFloatingHandlerTest, self).setUp() super(QuantumFloatingHandlerTest, self).setUp()
self.central_service = self.start_service('central')
domain = self.create_domain() domain = self.create_domain()
self.domain_id = domain['id'] self.domain_id = domain['id']
self.config(domain_id=domain['id'], group='handler:quantum_floatingip') self.config(domain_id=domain['id'], group='handler:quantum_floatingip')

View File

@ -13,86 +13,3 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import testtools
from oslo.config import cfg
from designate.openstack.common import log as logging
from designate.tests import TestCase
from designate import quota
from designate import exceptions
LOG = logging.getLogger(__name__)
class QuotaTestCase(TestCase):
def setUp(self):
super(QuotaTestCase, self).setUp()
self.quota = quota.get_quota()
def test_get_quotas(self):
context = self.get_admin_context()
quotas = self.quota.get_quotas(context, 'DefaultQuotaTenant')
self.assertIsNotNone(quotas)
self.assertEqual(quotas, {
'domains': cfg.CONF.quota_domains,
'domain_records': cfg.CONF.quota_domain_records
})
def test_limit_check_unknown(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.QuotaResourceUnknown):
self.quota.limit_check(context, 'tenant_id', unknown=0)
with testtools.ExpectedException(exceptions.QuotaResourceUnknown):
self.quota.limit_check(context, 'tenant_id', unknown=0, domains=0)
def test_limit_check_under(self):
context = self.get_admin_context()
self.quota.limit_check(context, 'tenant_id', domains=0)
self.quota.limit_check(context, 'tenant_id', domain_records=0)
self.quota.limit_check(context, 'tenant_id', domains=0,
domain_records=0)
self.quota.limit_check(context, 'tenant_id',
domains=(cfg.CONF.quota_domains - 1))
self.quota.limit_check(
context,
'tenant_id',
domain_records=(cfg.CONF.quota_domain_records - 1))
def test_limit_check_at(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id',
domains=cfg.CONF.quota_domains)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(
context,
'tenant_id',
domain_records=cfg.CONF.quota_domain_records)
def test_limit_check_over(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domain_records=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999,
domain_records=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999,
domain_records=0)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=0,
domain_records=99999)

View File

@ -1,25 +0,0 @@
# Copyright 2013 Hewlett-Packard Development Company, L.P.
#
# Author: Kiall Mac Innes <kiall@hp.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.openstack.common import log as logging
from designate.tests.test_quota import QuotaTestCase
LOG = logging.getLogger(__name__)
class NoopQuotaTest(QuotaTestCase):
def setUp(self):
self.config(quota_driver='noop')
super(NoopQuotaTest, self).setUp()

View File

@ -0,0 +1,106 @@
# Copyright 2013 Hewlett-Packard Development Company, L.P.
#
# Author: Kiall Mac Innes <kiall@hp.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from testscenarios import load_tests_apply_scenarios as load_tests # noqa
import testtools
from oslo.config import cfg
from designate.openstack.common import log as logging
from designate import quota
from designate import tests
from designate import exceptions
LOG = logging.getLogger(__name__)
class QuotaTestCase(tests.TestCase):
scenarios = [
('noop', dict(quota_driver='noop')),
('storage', dict(quota_driver='storage'))
]
def setUp(self):
super(QuotaTestCase, self).setUp()
self.config(quota_driver=self.quota_driver)
self.quota = quota.get_quota()
def test_get_quotas(self):
context = self.get_admin_context()
quotas = self.quota.get_quotas(context, 'DefaultQuotaTenant')
self.assertIsNotNone(quotas)
self.assertEqual(quotas, {
'domains': cfg.CONF.quota_domains,
'domain_records': cfg.CONF.quota_domain_records
})
def test_limit_check_unknown(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.QuotaResourceUnknown):
self.quota.limit_check(context, 'tenant_id', unknown=0)
with testtools.ExpectedException(exceptions.QuotaResourceUnknown):
self.quota.limit_check(context, 'tenant_id', unknown=0, domains=0)
def test_limit_check_under(self):
context = self.get_admin_context()
self.quota.limit_check(context, 'tenant_id', domains=0)
self.quota.limit_check(context, 'tenant_id', domain_records=0)
self.quota.limit_check(context, 'tenant_id', domains=0,
domain_records=0)
self.quota.limit_check(context, 'tenant_id',
domains=(cfg.CONF.quota_domains - 1))
self.quota.limit_check(
context,
'tenant_id',
domain_records=(cfg.CONF.quota_domain_records - 1))
def test_limit_check_at(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id',
domains=cfg.CONF.quota_domains)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(
context,
'tenant_id',
domain_records=cfg.CONF.quota_domain_records)
def test_limit_check_over(self):
context = self.get_admin_context()
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domain_records=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999,
domain_records=99999)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=99999,
domain_records=0)
with testtools.ExpectedException(exceptions.OverQuota):
self.quota.limit_check(context, 'tenant_id', domains=0,
domain_records=99999)

View File

@ -13,16 +13,18 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from designate import quota
from designate import tests
from designate.openstack.common import log as logging from designate.openstack.common import log as logging
from designate.tests.test_quota import QuotaTestCase
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class StorageQuotaTest(QuotaTestCase): class StorageQuotaTest(tests.TestCase):
def setUp(self): def setUp(self):
self.config(quota_driver='storage')
super(StorageQuotaTest, self).setUp() super(StorageQuotaTest, self).setUp()
self.config(quota_driver='storage')
self.quota = quota.get_quota()
def test_set_quota_create(self): def test_set_quota_create(self):
quota = self.quota.set_quota(self.admin_context, 'tenant_id', quota = self.quota.set_quota(self.admin_context, 'tenant_id',

View File

@ -10,4 +10,5 @@ pyflakes>=0.7.2,<0.7.4
python-subunit python-subunit
testtools>=0.9.32 testtools>=0.9.32
testrepository>=0.0.8 testrepository>=0.0.8
testscenarios>=0.4
WebTest>=2.0 WebTest>=2.0