Introduce ''mock_object'' method to base test class

We would like to fully remove mox from the test tree. Even for tests
that don't use mox's validation, many of them are using the symbol
patching with self.stubs.Set. We can do the same thing with the
monkeypatch fixture instead.

This introduces self.stub_out to nova/test.py and an example of what a
stubs => stub_out change would look like.

The teardown function in the converted test was removed at the same
time, as those should no longer be used.

Part of the mox community goal for Rocky.

Change-Id: I8f471ff8fee600ebb4e8907bf240007b7b4fe59f
Signed-off-by: Chuck Short <chucks@redhat.com>
This commit is contained in:
Charles Short 2018-05-19 15:24:30 +00:00 committed by Chuck Short
parent b6d5100de7
commit 8954959817
17 changed files with 142 additions and 96 deletions

View File

@ -117,8 +117,8 @@ class TestSqlAlchemyDBDataIntegrity(base.TestDriver,
return original_method(query, model, limit, return original_method(query, model, limit,
sort_keys, marker, sort_dir, sort_dirs) sort_keys, marker, sort_dir, sort_dirs)
self.stubs.Set(self.db_api, '_paginate_query', self.mock_object(self.db_api, '_paginate_query',
fake_paginate_query) fake_paginate_query)
self.db_api.image_get_all(self.context, sort_key=['created_at']) self.db_api.image_get_all(self.context, sort_key=['created_at'])
def test_paginate_non_redundant_sort_keys(self): def test_paginate_non_redundant_sort_keys(self):
@ -130,8 +130,8 @@ class TestSqlAlchemyDBDataIntegrity(base.TestDriver,
return original_method(query, model, limit, return original_method(query, model, limit,
sort_keys, marker, sort_dir, sort_dirs) sort_keys, marker, sort_dir, sort_dirs)
self.stubs.Set(self.db_api, '_paginate_query', self.mock_object(self.db_api, '_paginate_query',
fake_paginate_query) fake_paginate_query)
self.db_api.image_get_all(self.context, sort_key=['name']) self.db_api.image_get_all(self.context, sort_key=['name'])

View File

@ -117,6 +117,7 @@ CONF = cfg.CONF
class ApiTest(test_utils.BaseTestCase): class ApiTest(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(ApiTest, self).setUp() super(ApiTest, self).setUp()
self.test_dir = self.useFixture(fixtures.TempDir()).path self.test_dir = self.useFixture(fixtures.TempDir()).path
@ -209,8 +210,8 @@ class ApiTest(test_utils.BaseTestCase):
return test_utils.HttplibWsgiAdapter(self.glance_registry_app) return test_utils.HttplibWsgiAdapter(self.glance_registry_app)
return wrapped return wrapped
self.stubs.Set(glance.common.client.BaseClient, self.mock_object(glance.common.client.BaseClient,
'get_connection_type', get_connection_type) 'get_connection_type', get_connection_type)
def tearDown(self): def tearDown(self):
glance.db.sqlalchemy.api.clear_db_env() glance.db.sqlalchemy.api.clear_db_env()

View File

@ -52,19 +52,12 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
store.register_opts(CONF) store.register_opts(CONF)
self.config_patcher = mock.patch( self.mock_object(glance.common.config, 'load_paste_app',
'glance.common.config.load_paste_app', self._do_nothing)
side_effect=self._do_nothing) self.mock_object(glance.common.wsgi.Server, 'start',
self.start_patcher = mock.patch('glance.common.wsgi.Server.start', self._do_nothing)
side_effect=self._do_nothing) self.mock_object(glance.common.wsgi.Server, 'wait',
self.wait_patcher = mock.patch('glance.common.wsgi.Server.wait', self._do_nothing)
side_effect=self._do_nothing)
self.addCleanup(mock.patch.stopall)
self.config_patcher.start()
self.start_patcher.start()
self.wait_patcher.start()
def tearDown(self): def tearDown(self):
sys.stderr = sys.__stderr__ sys.stderr = sys.__stderr__
@ -77,10 +70,10 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
def test_worker_creation_failure(self): def test_worker_creation_failure(self):
failure = exc.WorkerCreationFailure(reason='test') failure = exc.WorkerCreationFailure(reason='test')
with mock.patch('glance.common.wsgi.Server.start', self.mock_object(glance.common.wsgi.Server, 'start',
side_effect=self._raise(failure)): self._raise(failure))
exit = self.assertRaises(SystemExit, glance.cmd.api.main) exit = self.assertRaises(SystemExit, glance.cmd.api.main)
self.assertEqual(2, exit.code) self.assertEqual(2, exit.code)
@mock.patch.object(glance.common.config, 'parse_cache_args') @mock.patch.object(glance.common.config, 'parse_cache_args')
@mock.patch.object(logging, 'setup') @mock.patch.object(logging, 'setup')
@ -103,12 +96,11 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
mock.call.mock_cache_clean()] mock.call.mock_cache_clean()]
self.assertEqual(expected_call_sequence, manager.mock_calls) self.assertEqual(expected_call_sequence, manager.mock_calls)
@mock.patch.object(glance.image_cache.cleaner.Cleaner, 'run')
@mock.patch.object(glance.image_cache.base.CacheApp, '__init__') @mock.patch.object(glance.image_cache.base.CacheApp, '__init__')
def test_cache_cleaner_main_runtime_exception_handling(self, mock_cache, def test_cache_cleaner_main_runtime_exception_handling(self, mock_cache):
mock_run):
mock_cache.return_value = None mock_cache.return_value = None
mock_run.side_effect = self._raise(RuntimeError) self.mock_object(glance.image_cache.cleaner.Cleaner, 'run',
self._raise(RuntimeError))
exit = self.assertRaises(SystemExit, glance.cmd.cache_cleaner.main) exit = self.assertRaises(SystemExit, glance.cmd.cache_cleaner.main)
self.assertEqual('ERROR: ', exit.code) self.assertEqual('ERROR: ', exit.code)
@ -133,12 +125,11 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
mock.call.mock_cache_prune()] mock.call.mock_cache_prune()]
self.assertEqual(expected_call_sequence, manager.mock_calls) self.assertEqual(expected_call_sequence, manager.mock_calls)
@mock.patch.object(glance.image_cache.pruner.Pruner, 'run')
@mock.patch.object(glance.image_cache.base.CacheApp, '__init__') @mock.patch.object(glance.image_cache.base.CacheApp, '__init__')
def test_cache_pruner_main_runtime_exception_handling(self, mock_cache, def test_cache_pruner_main_runtime_exception_handling(self, mock_cache):
mock_run):
mock_cache.return_value = None mock_cache.return_value = None
mock_run.side_effect = self._raise(RuntimeError) self.mock_object(glance.image_cache.pruner.Pruner, 'run',
self._raise(RuntimeError))
exit = self.assertRaises(SystemExit, glance.cmd.cache_pruner.main) exit = self.assertRaises(SystemExit, glance.cmd.cache_pruner.main)
self.assertEqual('ERROR: ', exit.code) self.assertEqual('ERROR: ', exit.code)

View File

@ -17,6 +17,7 @@ import os
import glance_store as store import glance_store as store
from glance_store import location from glance_store import location
import mock
from oslo_concurrency import lockutils from oslo_concurrency import lockutils
from oslo_config import cfg from oslo_config import cfg
from oslo_db import options from oslo_db import options
@ -134,3 +135,14 @@ class MultiIsolatedUnitTest(MultiStoreClearingUnitTest):
fap = open(CONF.oslo_policy.policy_file, 'w') fap = open(CONF.oslo_policy.policy_file, 'w')
fap.write(jsonutils.dumps(rules)) fap.write(jsonutils.dumps(rules))
fap.close() fap.close()
def mock_object(self, obj, attr_name, *args, **kwargs):
"""Use python mock to mock an object attribute
Mocks the specified objects attribute with the given value.
Automatically performs 'addCleanup' for the mock.
"""
patcher = mock.patch.object(obj, attr_name, *args, **kwargs)
result = patcher.start()
self.addCleanup(patcher.stop)
return result

View File

@ -18,7 +18,6 @@ import shutil
import fixtures import fixtures
import oslo_middleware import oslo_middleware
from oslotest import moxstubout
from glance.api.middleware import context from glance.api.middleware import context
from glance.common import config from glance.common import config
@ -29,8 +28,6 @@ class TestPasteApp(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestPasteApp, self).setUp() super(TestPasteApp, self).setUp()
mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs
def _do_test_load_paste_app(self, def _do_test_load_paste_app(self,
expected_app_type, expected_app_type,

View File

@ -48,12 +48,14 @@ class TestLocationStrategy(base.IsolatedUnitTest):
modules = ['module1', 'module2'] modules = ['module1', 'module2']
def _fake_stevedore_extension_manager(*args, **kwargs): def _fake_stevedore_extension_manager(*args, **kwargs):
ret = lambda: None def ret():
return None
ret.names = lambda: modules ret.names = lambda: modules
return ret return ret
def _fake_stevedore_driver_manager(*args, **kwargs): def _fake_stevedore_driver_manager(*args, **kwargs):
ret = lambda: None def ret():
return None
ret.driver = lambda: None ret.driver = lambda: None
ret.driver.__name__ = kwargs['name'] ret.driver.__name__ = kwargs['name']
# Module 1 and 2 has a same strategy name # Module 1 and 2 has a same strategy name
@ -61,10 +63,10 @@ class TestLocationStrategy(base.IsolatedUnitTest):
ret.driver.init = lambda: None ret.driver.init = lambda: None
return ret return ret
self.stub = self.stubs.Set(stevedore.extension, "ExtensionManager", self.stub = self.mock_object(stevedore.extension, "ExtensionManager",
_fake_stevedore_extension_manager) _fake_stevedore_extension_manager)
self.stub = self.stubs.Set(stevedore.driver, "DriverManager", self.stub = self.mock_object(stevedore.driver, "DriverManager",
_fake_stevedore_driver_manager) _fake_stevedore_driver_manager)
loaded_modules = location_strategy._load_strategies() loaded_modules = location_strategy._load_strategies()
self.assertEqual(1, len(loaded_modules)) self.assertEqual(1, len(loaded_modules))
@ -76,7 +78,8 @@ class TestLocationStrategy(base.IsolatedUnitTest):
modules = ['module_init_exception', 'module_good'] modules = ['module_init_exception', 'module_good']
def _fake_stevedore_extension_manager(*args, **kwargs): def _fake_stevedore_extension_manager(*args, **kwargs):
ret = lambda: None def ret():
return None
ret.names = lambda: modules ret.names = lambda: modules
return ret return ret
@ -84,17 +87,18 @@ class TestLocationStrategy(base.IsolatedUnitTest):
if kwargs['name'] == 'module_init_exception': if kwargs['name'] == 'module_init_exception':
raise Exception('strategy module failed to initialize.') raise Exception('strategy module failed to initialize.')
else: else:
ret = lambda: None def ret():
return None
ret.driver = lambda: None ret.driver = lambda: None
ret.driver.__name__ = kwargs['name'] ret.driver.__name__ = kwargs['name']
ret.driver.get_strategy_name = lambda: kwargs['name'] ret.driver.get_strategy_name = lambda: kwargs['name']
ret.driver.init = lambda: None ret.driver.init = lambda: None
return ret return ret
self.stub = self.stubs.Set(stevedore.extension, "ExtensionManager", self.stub = self.mock_object(stevedore.extension, "ExtensionManager",
_fake_stevedore_extension_manager) _fake_stevedore_extension_manager)
self.stub = self.stubs.Set(stevedore.driver, "DriverManager", self.stub = self.mock_object(stevedore.driver, "DriverManager",
_fake_stevedore_driver_manager) _fake_stevedore_driver_manager)
loaded_modules = location_strategy._load_strategies() loaded_modules = location_strategy._load_strategies()
self.assertEqual(1, len(loaded_modules)) self.assertEqual(1, len(loaded_modules))

View File

@ -49,7 +49,8 @@ class RequestTest(test_utils.BaseTestCase):
def returns_some_locales(*args, **kwargs): def returns_some_locales(*args, **kwargs):
return all_locales return all_locales
self.stubs.Set(localedata, 'locale_identifiers', returns_some_locales) self.mock_object(localedata, 'locale_identifiers',
returns_some_locales)
# Override gettext.find to return other than None for some languages. # Override gettext.find to return other than None for some languages.
def fake_gettext_find(lang_id, *args, **kwargs): def fake_gettext_find(lang_id, *args, **kwargs):
@ -62,7 +63,7 @@ class RequestTest(test_utils.BaseTestCase):
return found_ret return found_ret
return None return None
self.stubs.Set(gettext, 'find', fake_gettext_find) self.mock_object(gettext, 'find', fake_gettext_find)
def test_content_range(self): def test_content_range(self):
request = wsgi.Request.blank('/tests/123') request = wsgi.Request.blank('/tests/123')
@ -338,7 +339,7 @@ class ResourceTest(test_utils.BaseTestCase):
if isinstance(obj, wsgi.JSONResponseSerializer): if isinstance(obj, wsgi.JSONResponseSerializer):
raise webob.exc.HTTPForbidden() raise webob.exc.HTTPForbidden()
self.stubs.Set(wsgi.Resource, 'dispatch', dispatch) self.mock_object(wsgi.Resource, 'dispatch', dispatch)
request = wsgi.Request.blank('/') request = wsgi.Request.blank('/')
@ -357,7 +358,7 @@ class ResourceTest(test_utils.BaseTestCase):
def dispatch(self, obj, action, *args, **kwargs): def dispatch(self, obj, action, *args, **kwargs):
raise Exception("test exception") raise Exception("test exception")
self.stubs.Set(wsgi.Resource, 'dispatch', dispatch) self.mock_object(wsgi.Resource, 'dispatch', dispatch)
request = wsgi.Request.blank('/') request = wsgi.Request.blank('/')

View File

@ -15,7 +15,6 @@
# under the License. # under the License.
from oslo_serialization import jsonutils from oslo_serialization import jsonutils
from oslotest import moxstubout
from six.moves import http_client as http from six.moves import http_client as http
import webob import webob
@ -123,8 +122,6 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestKeystoneAuthPlugin, self).setUp() super(TestKeystoneAuthPlugin, self).setUp()
mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs
def test_get_plugin_from_strategy_keystone(self): def test_get_plugin_from_strategy_keystone(self):
strategy = auth.get_plugin_from_strategy('keystone') strategy = auth.get_plugin_from_strategy('keystone')
@ -200,7 +197,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
resp.status = http.BAD_REQUEST resp.status = http.BAD_REQUEST
return FakeResponse(resp), "" return FakeResponse(resp), ""
self.stubs.Set(auth.KeystoneStrategy, '_do_request', fake_do_request) self.mock_object(auth.KeystoneStrategy, '_do_request', fake_do_request)
bad_creds = { bad_creds = {
'username': 'user1', 'username': 'user1',
@ -222,7 +219,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
resp.status = http.BAD_REQUEST resp.status = http.BAD_REQUEST
return FakeResponse(resp), "" return FakeResponse(resp), ""
self.stubs.Set(auth.KeystoneStrategy, '_do_request', fake_do_request) self.mock_object(auth.KeystoneStrategy, '_do_request', fake_do_request)
bad_creds = { bad_creds = {
'username': 'user1', 'username': 'user1',
@ -254,7 +251,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
return FakeResponse(resp), "" return FakeResponse(resp), ""
self.stubs.Set(auth.KeystoneStrategy, '_do_request', fake_do_request) self.mock_object(auth.KeystoneStrategy, '_do_request', fake_do_request)
unauthorized_creds = [ unauthorized_creds = [
{ {
@ -344,7 +341,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
mock_token = V2Token() mock_token = V2Token()
mock_token.add_service('image', ['RegionOne']) mock_token.add_service('image', ['RegionOne'])
self.stubs.Set(auth.KeystoneStrategy, '_do_request', fake_do_request) self.mock_object(auth.KeystoneStrategy, '_do_request', fake_do_request)
unauthorized_creds = [ unauthorized_creds = [
{ {

View File

@ -23,7 +23,6 @@ import time
import fixtures import fixtures
from oslo_utils import units from oslo_utils import units
from oslotest import moxstubout
import six import six
# NOTE(jokke): simplified transition to py3, behaves like py2 xrange # NOTE(jokke): simplified transition to py3, behaves like py2 xrange
from six.moves import range from six.moves import range
@ -518,9 +517,7 @@ class TestImageCacheNoDep(test_utils.BaseTestCase):
def init_driver(self2): def init_driver(self2):
self2.driver = self.driver self2.driver = self.driver
mox_fixture = self.useFixture(moxstubout.MoxStubout()) self.mock_object(image_cache.ImageCache, 'init_driver', init_driver)
self.stubs = mox_fixture.stubs
self.stubs.Set(image_cache.ImageCache, 'init_driver', init_driver)
def test_get_caching_iter_when_write_fails(self): def test_get_caching_iter_when_write_fails(self):

View File

@ -32,12 +32,14 @@ UUID1 = 'c80a1a6c-bd1f-41c5-90ee-81afedb1d58d'
class IterableMock(mock.Mock, collections.Iterable): class IterableMock(mock.Mock, collections.Iterable):
def __iter__(self): def __iter__(self):
while False: while False:
yield None yield None
class ImageRepoStub(object): class ImageRepoStub(object):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
return 'image_from_get' return 'image_from_get'
@ -52,6 +54,7 @@ class ImageRepoStub(object):
class ImageStub(object): class ImageStub(object):
def __init__(self, image_id=None, visibility='private', def __init__(self, image_id=None, visibility='private',
container_format='bear', disk_format='raw', container_format='bear', disk_format='raw',
status='active', extra_properties=None, status='active', extra_properties=None,
@ -87,6 +90,7 @@ class ImageStub(object):
class ImageFactoryStub(object): class ImageFactoryStub(object):
def new_image(self, image_id=None, name=None, visibility='private', def new_image(self, image_id=None, name=None, visibility='private',
min_disk=0, min_ram=0, protected=False, owner=None, min_disk=0, min_ram=0, protected=False, owner=None,
disk_format=None, container_format=None, disk_format=None, container_format=None,
@ -117,11 +121,13 @@ class MemberRepoStub(object):
class ImageMembershipStub(object): class ImageMembershipStub(object):
def __init__(self, output=None): def __init__(self, output=None):
self.output = output self.output = output
class TaskRepoStub(object): class TaskRepoStub(object):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
return 'task_from_get' return 'task_from_get'
@ -133,6 +139,7 @@ class TaskRepoStub(object):
class TaskStub(object): class TaskStub(object):
def __init__(self, task_id): def __init__(self, task_id):
self.task_id = task_id self.task_id = task_id
self.status = 'pending' self.status = 'pending'
@ -142,11 +149,13 @@ class TaskStub(object):
class TaskFactoryStub(object): class TaskFactoryStub(object):
def new_task(self, *args): def new_task(self, *args):
return 'new_task' return 'new_task'
class TestPolicyEnforcer(base.IsolatedUnitTest): class TestPolicyEnforcer(base.IsolatedUnitTest):
def test_policy_file_default_rules_default_location(self): def test_policy_file_default_rules_default_location(self):
enforcer = glance.api.policy.Enforcer() enforcer = glance.api.policy.Enforcer()
@ -209,6 +218,7 @@ class TestPolicyEnforcer(base.IsolatedUnitTest):
class TestPolicyEnforcerNoFile(base.IsolatedUnitTest): class TestPolicyEnforcerNoFile(base.IsolatedUnitTest):
def test_policy_file_specified_but_not_found(self): def test_policy_file_specified_but_not_found(self):
"""Missing defined policy file should result in a default ruleset""" """Missing defined policy file should result in a default ruleset"""
self.config(policy_file='gobble.gobble', group='oslo_policy') self.config(policy_file='gobble.gobble', group='oslo_policy')
@ -223,11 +233,12 @@ class TestPolicyEnforcerNoFile(base.IsolatedUnitTest):
def test_policy_file_default_not_found(self): def test_policy_file_default_not_found(self):
"""Missing default policy file should result in a default ruleset""" """Missing default policy file should result in a default ruleset"""
def fake_find_file(self, name): def fake_find_file(self, name):
return None return None
self.stubs.Set(oslo_config.cfg.ConfigOpts, 'find_file', self.mock_object(oslo_config.cfg.ConfigOpts, 'find_file',
fake_find_file) fake_find_file)
enforcer = glance.api.policy.Enforcer() enforcer = glance.api.policy.Enforcer()
@ -240,6 +251,7 @@ class TestPolicyEnforcerNoFile(base.IsolatedUnitTest):
class TestImagePolicy(test_utils.BaseTestCase): class TestImagePolicy(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
self.image_stub = ImageStub(UUID1) self.image_stub = ImageStub(UUID1)
self.image_repo_stub = ImageRepoStub() self.image_repo_stub = ImageRepoStub()
@ -416,6 +428,7 @@ class TestImagePolicy(test_utils.BaseTestCase):
class TestMemberPolicy(test_utils.BaseTestCase): class TestMemberPolicy(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
self.policy = mock.Mock() self.policy = mock.Mock()
self.policy.enforce = mock.Mock() self.policy.enforce = mock.Mock()
@ -491,6 +504,7 @@ class TestMemberPolicy(test_utils.BaseTestCase):
class TestTaskPolicy(test_utils.BaseTestCase): class TestTaskPolicy(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
self.task_stub = TaskStub(UUID1) self.task_stub = TaskStub(UUID1)
self.task_repo_stub = TaskRepoStub() self.task_repo_stub = TaskRepoStub()
@ -569,6 +583,7 @@ class TestTaskPolicy(test_utils.BaseTestCase):
class TestContextPolicyEnforcer(base.IsolatedUnitTest): class TestContextPolicyEnforcer(base.IsolatedUnitTest):
def _do_test_policy_influence_context_admin(self, def _do_test_policy_influence_context_admin(self,
policy_admin_role, policy_admin_role,
context_role, context_role,

View File

@ -52,6 +52,7 @@ class FakeImage(object):
class TestImageQuota(test_utils.BaseTestCase): class TestImageQuota(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImageQuota, self).setUp() super(TestImageQuota, self).setUp()
@ -283,8 +284,8 @@ class TestImageQuota(test_utils.BaseTestCase):
image = glance.quota.ImageProxy(base_image, context, db_api, store) image = glance.quota.ImageProxy(base_image, context, db_api, store)
self.assertIsNone(image.size) self.assertIsNone(image.size)
self.stubs.Set(store_api, 'get_size_from_backend', self.mock_object(store_api, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
image.locations.append({'url': 'file:///fake.img.tar.gz', image.locations.append({'url': 'file:///fake.img.tar.gz',
'metadata': {}}) 'metadata': {}})
self.assertIn({'url': 'file:///fake.img.tar.gz', 'metadata': {}}, self.assertIn({'url': 'file:///fake.img.tar.gz', 'metadata': {}},
@ -300,8 +301,8 @@ class TestImageQuota(test_utils.BaseTestCase):
image = glance.quota.ImageProxy(base_image, context, db_api, store) image = glance.quota.ImageProxy(base_image, context, db_api, store)
self.assertIsNone(image.size) self.assertIsNone(image.size)
self.stubs.Set(store_api, 'get_size_from_backend', self.mock_object(store_api, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
image.locations.insert(0, image.locations.insert(0,
{'url': 'file:///fake.img.tar.gz', {'url': 'file:///fake.img.tar.gz',
'metadata': {}}) 'metadata': {}})
@ -318,8 +319,8 @@ class TestImageQuota(test_utils.BaseTestCase):
image = glance.quota.ImageProxy(base_image, context, db_api, store) image = glance.quota.ImageProxy(base_image, context, db_api, store)
self.assertIsNone(image.size) self.assertIsNone(image.size)
self.stubs.Set(store_api, 'get_size_from_backend', self.mock_object(store_api, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
image.locations = [{'url': 'file:///fake.img.tar.gz', 'metadata': {}}] image.locations = [{'url': 'file:///fake.img.tar.gz', 'metadata': {}}]
self.assertEqual([{'url': 'file:///fake.img.tar.gz', 'metadata': {}}], self.assertEqual([{'url': 'file:///fake.img.tar.gz', 'metadata': {}}],
image.locations) image.locations)
@ -334,14 +335,15 @@ class TestImageQuota(test_utils.BaseTestCase):
image = glance.quota.ImageProxy(base_image, context, db_api, store) image = glance.quota.ImageProxy(base_image, context, db_api, store)
self.assertIsNone(image.size) self.assertIsNone(image.size)
self.stubs.Set(store_api, 'get_size_from_backend', self.mock_object(store_api, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
image.locations += [{'url': 'file:///fake.img.tar.gz', 'metadata': {}}] image.locations += [{'url': 'file:///fake.img.tar.gz', 'metadata': {}}]
self.assertIn({'url': 'file:///fake.img.tar.gz', 'metadata': {}}, self.assertIn({'url': 'file:///fake.img.tar.gz', 'metadata': {}},
image.locations) image.locations)
class TestImagePropertyQuotas(test_utils.BaseTestCase): class TestImagePropertyQuotas(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImagePropertyQuotas, self).setUp() super(TestImagePropertyQuotas, self).setUp()
self.base_image = FakeImage() self.base_image = FakeImage()
@ -485,6 +487,7 @@ class TestImagePropertyQuotas(test_utils.BaseTestCase):
class TestImageTagQuotas(test_utils.BaseTestCase): class TestImageTagQuotas(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImageTagQuotas, self).setUp() super(TestImageTagQuotas, self).setUp()
self.base_image = mock.Mock() self.base_image = mock.Mock()
@ -549,6 +552,7 @@ class TestImageTagQuotas(test_utils.BaseTestCase):
class TestQuotaImageTagsProxy(test_utils.BaseTestCase): class TestQuotaImageTagsProxy(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestQuotaImageTagsProxy, self).setUp() super(TestQuotaImageTagsProxy, self).setUp()
@ -594,6 +598,7 @@ class TestQuotaImageTagsProxy(test_utils.BaseTestCase):
class TestImageMemberQuotas(test_utils.BaseTestCase): class TestImageMemberQuotas(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImageMemberQuotas, self).setUp() super(TestImageMemberQuotas, self).setUp()
db_api = unit_test_utils.FakeDB() db_api = unit_test_utils.FakeDB()
@ -631,6 +636,7 @@ class TestImageMemberQuotas(test_utils.BaseTestCase):
class TestImageLocationQuotas(test_utils.BaseTestCase): class TestImageLocationQuotas(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImageLocationQuotas, self).setUp() super(TestImageLocationQuotas, self).setUp()
self.base_image = mock.Mock() self.base_image = mock.Mock()

View File

@ -128,8 +128,8 @@ class TestStoreImage(utils.BaseTestCase):
self.assertEqual(2, len(image1.locations)) self.assertEqual(2, len(image1.locations))
self.assertEqual(UUID2, location_data['url']) self.assertEqual(UUID2, location_data['url'])
self.stubs.Set(unit_test_utils.FakeStoreAPI, 'get_from_backend', self.mock_object(unit_test_utils.FakeStoreAPI, 'get_from_backend',
fake_get_from_backend) fake_get_from_backend)
# This time, image1.get_data() returns the data wrapped in a # This time, image1.get_data() returns the data wrapped in a
# LimitingReader|CooperativeReader pipeline, so peeking under # LimitingReader|CooperativeReader pipeline, so peeking under
# the hood of those objects to get at the underlying string. # the hood of those objects to get at the underlying string.
@ -200,8 +200,8 @@ class TestStoreImage(utils.BaseTestCase):
} }
image_stub = ImageStub(UUID2, status='queued', image_stub = ImageStub(UUID2, status='queued',
extra_properties=extra_properties) extra_properties=extra_properties)
self.stubs.Set(signature_utils, 'get_verifier', self.mock_object(signature_utils, 'get_verifier',
unit_test_utils.fake_get_verifier) unit_test_utils.fake_get_verifier)
image = glance.location.ImageProxy(image_stub, context, image = glance.location.ImageProxy(image_stub, context,
self.store_api, self.store_utils) self.store_api, self.store_utils)
image.set_data('YYYY', 4) image.set_data('YYYY', 4)
@ -220,8 +220,8 @@ class TestStoreImage(utils.BaseTestCase):
} }
image_stub = ImageStub(UUID2, status='queued', image_stub = ImageStub(UUID2, status='queued',
extra_properties=extra_properties) extra_properties=extra_properties)
self.stubs.Set(signature_utils, 'get_verifier', self.mock_object(signature_utils, 'get_verifier',
unit_test_utils.fake_get_verifier) unit_test_utils.fake_get_verifier)
image = glance.location.ImageProxy(image_stub, context, image = glance.location.ImageProxy(image_stub, context,
self.store_api, self.store_utils) self.store_api, self.store_utils)
with mock.patch.object(self.store_api, with mock.patch.object(self.store_api,
@ -240,8 +240,8 @@ class TestStoreImage(utils.BaseTestCase):
} }
image_stub = ImageStub(UUID2, status='queued', image_stub = ImageStub(UUID2, status='queued',
extra_properties=extra_properties) extra_properties=extra_properties)
self.stubs.Set(signature_utils, 'get_verifier', self.mock_object(signature_utils, 'get_verifier',
unit_test_utils.fake_get_verifier) unit_test_utils.fake_get_verifier)
image = glance.location.ImageProxy(image_stub, context, image = glance.location.ImageProxy(image_stub, context,
self.store_api, self.store_utils) self.store_api, self.store_utils)
image.set_data('YYYY', 4) image.set_data('YYYY', 4)

View File

@ -43,8 +43,8 @@ class TestStoreLocation(base.StoreClearingUnitTest):
def fake_get_size_from_backend(uri, context=None): def fake_get_size_from_backend(uri, context=None):
return 1 return 1
self.stubs.Set(glance_store, 'get_size_from_backend', self.mock_object(glance_store, 'get_size_from_backend',
fake_get_size_from_backend) fake_get_size_from_backend)
with mock.patch('glance.location._check_image_location'): with mock.patch('glance.location._check_image_location'):
loc1 = {'url': 'file:///fake1.img.tar.gz', 'metadata': {}} loc1 = {'url': 'file:///fake1.img.tar.gz', 'metadata': {}}

View File

@ -32,6 +32,7 @@ import glance.tests.utils as test_utils
class Raise(object): class Raise(object):
def __init__(self, exc): def __init__(self, exc):
self.exc = exc self.exc = exc
@ -40,6 +41,7 @@ class Raise(object):
class FakeImage(object): class FakeImage(object):
def __init__(self, image_id=None, data=None, checksum=None, size=0, def __init__(self, image_id=None, data=None, checksum=None, size=0,
virtual_size=0, locations=None, container_format='bear', virtual_size=0, locations=None, container_format='bear',
disk_format='rawr', status=None): disk_format='rawr', status=None):
@ -76,6 +78,7 @@ class FakeImage(object):
class FakeImageRepo(object): class FakeImageRepo(object):
def __init__(self, result=None): def __init__(self, result=None):
self.result = result self.result = result
@ -90,6 +93,7 @@ class FakeImageRepo(object):
class FakeGateway(object): class FakeGateway(object):
def __init__(self, db=None, store=None, notifier=None, def __init__(self, db=None, store=None, notifier=None,
policy=None, repo=None): policy=None, repo=None):
self.db = db self.db = db
@ -103,6 +107,7 @@ class FakeGateway(object):
class TestImagesController(base.StoreClearingUnitTest): class TestImagesController(base.StoreClearingUnitTest):
def setUp(self): def setUp(self):
super(TestImagesController, self).setUp() super(TestImagesController, self).setUp()
@ -157,6 +162,7 @@ class TestImagesController(base.StoreClearingUnitTest):
def test_download_ok_when_get_image_location_forbidden(self): def test_download_ok_when_get_image_location_forbidden(self):
class ImageLocations(object): class ImageLocations(object):
def __len__(self): def __len__(self):
raise exception.Forbidden() raise exception.Forbidden()
@ -888,9 +894,9 @@ class TestImageDataSerializer(test_utils.BaseTestCase):
def get_data(*args, **kwargs): def get_data(*args, **kwargs):
raise exception.Forbidden() raise exception.Forbidden()
self.stubs.Set(glance.api.policy.ImageProxy, self.mock_object(glance.api.policy.ImageProxy,
'get_data', 'get_data',
get_data) get_data)
request = wsgi.Request.blank('/') request = wsgi.Request.blank('/')
request.environ = {} request.environ = {}
response = webob.Response() response = webob.Response()

View File

@ -1973,8 +1973,8 @@ class TestImagesController(base.IsolatedUnitTest):
as long as the image has fewer than the limited number of image as long as the image has fewer than the limited number of image
locations after the transaction. locations after the transaction.
""" """
self.stubs.Set(store, 'get_size_from_backend', self.mock_object(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
self.config(show_multiple_locations=True) self.config(show_multiple_locations=True)
request = unit_test_utils.get_fake_request() request = unit_test_utils.get_fake_request()
@ -2039,8 +2039,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_update_remove_location(self): def test_update_remove_location(self):
self.config(show_multiple_locations=True) self.config(show_multiple_locations=True)
self.stubs.Set(store, 'get_size_from_backend', self.mock_object(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend) unit_test_utils.fake_get_size_from_backend)
request = unit_test_utils.get_fake_request() request = unit_test_utils.get_fake_request()
new_location = {'url': '%s/fake_location' % BASE_URI, 'metadata': {}} new_location = {'url': '%s/fake_location' % BASE_URI, 'metadata': {}}
@ -2080,8 +2080,9 @@ class TestImagesController(base.IsolatedUnitTest):
def fake_delete_image_location_from_backend(self, *args, **kwargs): def fake_delete_image_location_from_backend(self, *args, **kwargs):
raise Exception('fake_backend_exception') raise Exception('fake_backend_exception')
self.stubs.Set(self.store_utils, 'delete_image_location_from_backend', self.mock_object(self.store_utils,
fake_delete_image_location_from_backend) 'delete_image_location_from_backend',
fake_delete_image_location_from_backend)
request = unit_test_utils.get_fake_request() request = unit_test_utils.get_fake_request()
changes = [ changes = [
@ -2288,8 +2289,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_delete_in_use(self): def test_delete_in_use(self):
def fake_safe_delete_from_backend(self, *args, **kwargs): def fake_safe_delete_from_backend(self, *args, **kwargs):
raise store.exceptions.InUseByStore() raise store.exceptions.InUseByStore()
self.stubs.Set(self.store_utils, 'safe_delete_from_backend', self.mock_object(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend) fake_safe_delete_from_backend)
request = unit_test_utils.get_fake_request() request = unit_test_utils.get_fake_request()
self.assertRaises(webob.exc.HTTPConflict, self.controller.delete, self.assertRaises(webob.exc.HTTPConflict, self.controller.delete,
request, UUID1) request, UUID1)
@ -2297,8 +2298,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_delete_has_snapshot(self): def test_delete_has_snapshot(self):
def fake_safe_delete_from_backend(self, *args, **kwargs): def fake_safe_delete_from_backend(self, *args, **kwargs):
raise store.exceptions.HasSnapshot() raise store.exceptions.HasSnapshot()
self.stubs.Set(self.store_utils, 'safe_delete_from_backend', self.mock_object(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend) fake_safe_delete_from_backend)
request = unit_test_utils.get_fake_request() request = unit_test_utils.get_fake_request()
self.assertRaises(webob.exc.HTTPConflict, self.controller.delete, self.assertRaises(webob.exc.HTTPConflict, self.controller.delete,
request, UUID1) request, UUID1)
@ -3584,6 +3585,7 @@ class TestImagesSerializer(test_utils.BaseTestCase):
""" """
class ImageLocations(object): class ImageLocations(object):
def __len__(self): def __len__(self):
raise exception.Forbidden() raise exception.Forbidden()
@ -4140,6 +4142,7 @@ class TestImagesSerializerWithAdditionalProperties(test_utils.BaseTestCase):
class TestImagesSerializerDirectUrl(test_utils.BaseTestCase): class TestImagesSerializerDirectUrl(test_utils.BaseTestCase):
def setUp(self): def setUp(self):
super(TestImagesSerializerDirectUrl, self).setUp() super(TestImagesSerializerDirectUrl, self).setUp()
self.serializer = glance.api.v2.images.ResponseSerializer() self.serializer = glance.api.v2.images.ResponseSerializer()
@ -4225,6 +4228,7 @@ class TestImagesSerializerDirectUrl(test_utils.BaseTestCase):
class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase): class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
def test_default_disk_formats(self): def test_default_disk_formats(self):
schema = glance.api.v2.images.get_schema() schema = glance.api.v2.images.get_schema()
expected = [None, 'ami', 'ari', 'aki', 'vhd', 'vhdx', 'vmdk', expected = [None, 'ami', 'ari', 'aki', 'vhd', 'vhdx', 'vmdk',
@ -4254,6 +4258,7 @@ class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
class TestImageSchemaDeterminePropertyBasis(test_utils.BaseTestCase): class TestImageSchemaDeterminePropertyBasis(test_utils.BaseTestCase):
def test_custom_property_marked_as_non_base(self): def test_custom_property_marked_as_non_base(self):
self.config(allow_additional_image_properties=False) self.config(allow_additional_image_properties=False)
custom_image_properties = { custom_image_properties = {

View File

@ -759,7 +759,7 @@ class TestRegistryV2ClientApi(base.IsolatedUnitTest):
self.config(admin_tenant_name=expected['tenant']) self.config(admin_tenant_name=expected['tenant'])
self.config(auth_strategy=expected['strategy']) self.config(auth_strategy=expected['strategy'])
self.config(auth_region=expected['region']) self.config(auth_region=expected['region'])
self.stubs.Set(os, 'getenv', lambda x: None) self.mock_object(os, 'getenv', lambda x: None)
self.assertIsNone(rapi._CLIENT_CREDS) self.assertIsNone(rapi._CLIENT_CREDS)
rapi.configure_registry_admin_creds() rapi.configure_registry_admin_creds()

View File

@ -25,6 +25,7 @@ import subprocess
from alembic import command as alembic_command from alembic import command as alembic_command
import fixtures import fixtures
import mock
from oslo_config import cfg from oslo_config import cfg
from oslo_config import fixture as cfg_fixture from oslo_config import fixture as cfg_fixture
from oslo_log.fixture import logging_error as log_fixture from oslo_log.fixture import logging_error as log_fixture
@ -79,7 +80,7 @@ class BaseTestCase(testtools.TestCase):
self.addCleanup(CONF.reset) self.addCleanup(CONF.reset)
mox_fixture = self.useFixture(moxstubout.MoxStubout()) mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs self.stubs = mox_fixture.stubs
self.stubs.Set(exception, '_FATAL_EXCEPTION_FORMAT_ERRORS', True) self.mock_object(exception, '_FATAL_EXCEPTION_FORMAT_ERRORS', True)
self.test_dir = self.useFixture(fixtures.TempDir()).path self.test_dir = self.useFixture(fixtures.TempDir()).path
self.conf_dir = os.path.join(self.test_dir, 'etc') self.conf_dir = os.path.join(self.test_dir, 'etc')
utils.safe_mkdirs(self.conf_dir) utils.safe_mkdirs(self.conf_dir)
@ -139,9 +140,21 @@ class BaseTestCase(testtools.TestCase):
""" """
self._config_fixture.config(**kw) self._config_fixture.config(**kw)
def mock_object(self, obj, attr_name, *args, **kwargs):
""""Use python mock to mock an object attirbute
Mocks the specified objects attribute with the given value.
Automatically performs 'addCleanup' for the mock.
"""
patcher = mock.patch.object(obj, attr_name, *args, **kwargs)
result = patcher.start()
self.addCleanup(patcher.stop)
return result
class requires(object): class requires(object):
"""Decorator that initiates additional test setup/teardown.""" """Decorator that initiates additional test setup/teardown."""
def __init__(self, setup=None, teardown=None): def __init__(self, setup=None, teardown=None):
self.setup = setup self.setup = setup
self.teardown = teardown self.teardown = teardown
@ -160,6 +173,7 @@ class requires(object):
class depends_on_exe(object): class depends_on_exe(object):
"""Decorator to skip test if an executable is unavailable""" """Decorator to skip test if an executable is unavailable"""
def __init__(self, exe): def __init__(self, exe):
self.exe = exe self.exe = exe