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,
sort_keys, marker, sort_dir, sort_dirs)
self.stubs.Set(self.db_api, '_paginate_query',
fake_paginate_query)
self.mock_object(self.db_api, '_paginate_query',
fake_paginate_query)
self.db_api.image_get_all(self.context, sort_key=['created_at'])
def test_paginate_non_redundant_sort_keys(self):
@ -130,8 +130,8 @@ class TestSqlAlchemyDBDataIntegrity(base.TestDriver,
return original_method(query, model, limit,
sort_keys, marker, sort_dir, sort_dirs)
self.stubs.Set(self.db_api, '_paginate_query',
fake_paginate_query)
self.mock_object(self.db_api, '_paginate_query',
fake_paginate_query)
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):
def setUp(self):
super(ApiTest, self).setUp()
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 wrapped
self.stubs.Set(glance.common.client.BaseClient,
'get_connection_type', get_connection_type)
self.mock_object(glance.common.client.BaseClient,
'get_connection_type', get_connection_type)
def tearDown(self):
glance.db.sqlalchemy.api.clear_db_env()

View File

@ -52,19 +52,12 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
store.register_opts(CONF)
self.config_patcher = mock.patch(
'glance.common.config.load_paste_app',
side_effect=self._do_nothing)
self.start_patcher = mock.patch('glance.common.wsgi.Server.start',
side_effect=self._do_nothing)
self.wait_patcher = mock.patch('glance.common.wsgi.Server.wait',
side_effect=self._do_nothing)
self.addCleanup(mock.patch.stopall)
self.config_patcher.start()
self.start_patcher.start()
self.wait_patcher.start()
self.mock_object(glance.common.config, 'load_paste_app',
self._do_nothing)
self.mock_object(glance.common.wsgi.Server, 'start',
self._do_nothing)
self.mock_object(glance.common.wsgi.Server, 'wait',
self._do_nothing)
def tearDown(self):
sys.stderr = sys.__stderr__
@ -77,10 +70,10 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
def test_worker_creation_failure(self):
failure = exc.WorkerCreationFailure(reason='test')
with mock.patch('glance.common.wsgi.Server.start',
side_effect=self._raise(failure)):
exit = self.assertRaises(SystemExit, glance.cmd.api.main)
self.assertEqual(2, exit.code)
self.mock_object(glance.common.wsgi.Server, 'start',
self._raise(failure))
exit = self.assertRaises(SystemExit, glance.cmd.api.main)
self.assertEqual(2, exit.code)
@mock.patch.object(glance.common.config, 'parse_cache_args')
@mock.patch.object(logging, 'setup')
@ -103,12 +96,11 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
mock.call.mock_cache_clean()]
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__')
def test_cache_cleaner_main_runtime_exception_handling(self, mock_cache,
mock_run):
def test_cache_cleaner_main_runtime_exception_handling(self, mock_cache):
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)
self.assertEqual('ERROR: ', exit.code)
@ -133,12 +125,11 @@ class TestGlanceApiCmd(test_utils.BaseTestCase):
mock.call.mock_cache_prune()]
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__')
def test_cache_pruner_main_runtime_exception_handling(self, mock_cache,
mock_run):
def test_cache_pruner_main_runtime_exception_handling(self, mock_cache):
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)
self.assertEqual('ERROR: ', exit.code)

View File

@ -17,6 +17,7 @@ import os
import glance_store as store
from glance_store import location
import mock
from oslo_concurrency import lockutils
from oslo_config import cfg
from oslo_db import options
@ -134,3 +135,14 @@ class MultiIsolatedUnitTest(MultiStoreClearingUnitTest):
fap = open(CONF.oslo_policy.policy_file, 'w')
fap.write(jsonutils.dumps(rules))
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 oslo_middleware
from oslotest import moxstubout
from glance.api.middleware import context
from glance.common import config
@ -29,8 +28,6 @@ class TestPasteApp(test_utils.BaseTestCase):
def setUp(self):
super(TestPasteApp, self).setUp()
mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs
def _do_test_load_paste_app(self,
expected_app_type,

View File

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

View File

@ -49,7 +49,8 @@ class RequestTest(test_utils.BaseTestCase):
def returns_some_locales(*args, **kwargs):
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.
def fake_gettext_find(lang_id, *args, **kwargs):
@ -62,7 +63,7 @@ class RequestTest(test_utils.BaseTestCase):
return found_ret
return None
self.stubs.Set(gettext, 'find', fake_gettext_find)
self.mock_object(gettext, 'find', fake_gettext_find)
def test_content_range(self):
request = wsgi.Request.blank('/tests/123')
@ -338,7 +339,7 @@ class ResourceTest(test_utils.BaseTestCase):
if isinstance(obj, wsgi.JSONResponseSerializer):
raise webob.exc.HTTPForbidden()
self.stubs.Set(wsgi.Resource, 'dispatch', dispatch)
self.mock_object(wsgi.Resource, 'dispatch', dispatch)
request = wsgi.Request.blank('/')
@ -357,7 +358,7 @@ class ResourceTest(test_utils.BaseTestCase):
def dispatch(self, obj, action, *args, **kwargs):
raise Exception("test exception")
self.stubs.Set(wsgi.Resource, 'dispatch', dispatch)
self.mock_object(wsgi.Resource, 'dispatch', dispatch)
request = wsgi.Request.blank('/')

View File

@ -15,7 +15,6 @@
# under the License.
from oslo_serialization import jsonutils
from oslotest import moxstubout
from six.moves import http_client as http
import webob
@ -123,8 +122,6 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
def setUp(self):
super(TestKeystoneAuthPlugin, self).setUp()
mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs
def test_get_plugin_from_strategy_keystone(self):
strategy = auth.get_plugin_from_strategy('keystone')
@ -200,7 +197,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
resp.status = http.BAD_REQUEST
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 = {
'username': 'user1',
@ -222,7 +219,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
resp.status = http.BAD_REQUEST
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 = {
'username': 'user1',
@ -254,7 +251,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
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 = [
{
@ -344,7 +341,7 @@ class TestKeystoneAuthPlugin(utils.BaseTestCase):
mock_token = V2Token()
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 = [
{

View File

@ -23,7 +23,6 @@ import time
import fixtures
from oslo_utils import units
from oslotest import moxstubout
import six
# NOTE(jokke): simplified transition to py3, behaves like py2 xrange
from six.moves import range
@ -518,9 +517,7 @@ class TestImageCacheNoDep(test_utils.BaseTestCase):
def init_driver(self2):
self2.driver = self.driver
mox_fixture = self.useFixture(moxstubout.MoxStubout())
self.stubs = mox_fixture.stubs
self.stubs.Set(image_cache.ImageCache, 'init_driver', init_driver)
self.mock_object(image_cache.ImageCache, 'init_driver', init_driver)
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):
def __iter__(self):
while False:
yield None
class ImageRepoStub(object):
def get(self, *args, **kwargs):
return 'image_from_get'
@ -52,6 +54,7 @@ class ImageRepoStub(object):
class ImageStub(object):
def __init__(self, image_id=None, visibility='private',
container_format='bear', disk_format='raw',
status='active', extra_properties=None,
@ -87,6 +90,7 @@ class ImageStub(object):
class ImageFactoryStub(object):
def new_image(self, image_id=None, name=None, visibility='private',
min_disk=0, min_ram=0, protected=False, owner=None,
disk_format=None, container_format=None,
@ -117,11 +121,13 @@ class MemberRepoStub(object):
class ImageMembershipStub(object):
def __init__(self, output=None):
self.output = output
class TaskRepoStub(object):
def get(self, *args, **kwargs):
return 'task_from_get'
@ -133,6 +139,7 @@ class TaskRepoStub(object):
class TaskStub(object):
def __init__(self, task_id):
self.task_id = task_id
self.status = 'pending'
@ -142,11 +149,13 @@ class TaskStub(object):
class TaskFactoryStub(object):
def new_task(self, *args):
return 'new_task'
class TestPolicyEnforcer(base.IsolatedUnitTest):
def test_policy_file_default_rules_default_location(self):
enforcer = glance.api.policy.Enforcer()
@ -209,6 +218,7 @@ class TestPolicyEnforcer(base.IsolatedUnitTest):
class TestPolicyEnforcerNoFile(base.IsolatedUnitTest):
def test_policy_file_specified_but_not_found(self):
"""Missing defined policy file should result in a default ruleset"""
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):
"""Missing default policy file should result in a default ruleset"""
def fake_find_file(self, name):
return None
self.stubs.Set(oslo_config.cfg.ConfigOpts, 'find_file',
fake_find_file)
self.mock_object(oslo_config.cfg.ConfigOpts, 'find_file',
fake_find_file)
enforcer = glance.api.policy.Enforcer()
@ -240,6 +251,7 @@ class TestPolicyEnforcerNoFile(base.IsolatedUnitTest):
class TestImagePolicy(test_utils.BaseTestCase):
def setUp(self):
self.image_stub = ImageStub(UUID1)
self.image_repo_stub = ImageRepoStub()
@ -416,6 +428,7 @@ class TestImagePolicy(test_utils.BaseTestCase):
class TestMemberPolicy(test_utils.BaseTestCase):
def setUp(self):
self.policy = mock.Mock()
self.policy.enforce = mock.Mock()
@ -491,6 +504,7 @@ class TestMemberPolicy(test_utils.BaseTestCase):
class TestTaskPolicy(test_utils.BaseTestCase):
def setUp(self):
self.task_stub = TaskStub(UUID1)
self.task_repo_stub = TaskRepoStub()
@ -569,6 +583,7 @@ class TestTaskPolicy(test_utils.BaseTestCase):
class TestContextPolicyEnforcer(base.IsolatedUnitTest):
def _do_test_policy_influence_context_admin(self,
policy_admin_role,
context_role,

View File

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

View File

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

View File

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

View File

@ -32,6 +32,7 @@ import glance.tests.utils as test_utils
class Raise(object):
def __init__(self, exc):
self.exc = exc
@ -40,6 +41,7 @@ class Raise(object):
class FakeImage(object):
def __init__(self, image_id=None, data=None, checksum=None, size=0,
virtual_size=0, locations=None, container_format='bear',
disk_format='rawr', status=None):
@ -76,6 +78,7 @@ class FakeImage(object):
class FakeImageRepo(object):
def __init__(self, result=None):
self.result = result
@ -90,6 +93,7 @@ class FakeImageRepo(object):
class FakeGateway(object):
def __init__(self, db=None, store=None, notifier=None,
policy=None, repo=None):
self.db = db
@ -103,6 +107,7 @@ class FakeGateway(object):
class TestImagesController(base.StoreClearingUnitTest):
def setUp(self):
super(TestImagesController, self).setUp()
@ -157,6 +162,7 @@ class TestImagesController(base.StoreClearingUnitTest):
def test_download_ok_when_get_image_location_forbidden(self):
class ImageLocations(object):
def __len__(self):
raise exception.Forbidden()
@ -888,9 +894,9 @@ class TestImageDataSerializer(test_utils.BaseTestCase):
def get_data(*args, **kwargs):
raise exception.Forbidden()
self.stubs.Set(glance.api.policy.ImageProxy,
'get_data',
get_data)
self.mock_object(glance.api.policy.ImageProxy,
'get_data',
get_data)
request = wsgi.Request.blank('/')
request.environ = {}
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
locations after the transaction.
"""
self.stubs.Set(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend)
self.mock_object(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend)
self.config(show_multiple_locations=True)
request = unit_test_utils.get_fake_request()
@ -2039,8 +2039,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_update_remove_location(self):
self.config(show_multiple_locations=True)
self.stubs.Set(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend)
self.mock_object(store, 'get_size_from_backend',
unit_test_utils.fake_get_size_from_backend)
request = unit_test_utils.get_fake_request()
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):
raise Exception('fake_backend_exception')
self.stubs.Set(self.store_utils, 'delete_image_location_from_backend',
fake_delete_image_location_from_backend)
self.mock_object(self.store_utils,
'delete_image_location_from_backend',
fake_delete_image_location_from_backend)
request = unit_test_utils.get_fake_request()
changes = [
@ -2288,8 +2289,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_delete_in_use(self):
def fake_safe_delete_from_backend(self, *args, **kwargs):
raise store.exceptions.InUseByStore()
self.stubs.Set(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend)
self.mock_object(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend)
request = unit_test_utils.get_fake_request()
self.assertRaises(webob.exc.HTTPConflict, self.controller.delete,
request, UUID1)
@ -2297,8 +2298,8 @@ class TestImagesController(base.IsolatedUnitTest):
def test_delete_has_snapshot(self):
def fake_safe_delete_from_backend(self, *args, **kwargs):
raise store.exceptions.HasSnapshot()
self.stubs.Set(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend)
self.mock_object(self.store_utils, 'safe_delete_from_backend',
fake_safe_delete_from_backend)
request = unit_test_utils.get_fake_request()
self.assertRaises(webob.exc.HTTPConflict, self.controller.delete,
request, UUID1)
@ -3584,6 +3585,7 @@ class TestImagesSerializer(test_utils.BaseTestCase):
"""
class ImageLocations(object):
def __len__(self):
raise exception.Forbidden()
@ -4140,6 +4142,7 @@ class TestImagesSerializerWithAdditionalProperties(test_utils.BaseTestCase):
class TestImagesSerializerDirectUrl(test_utils.BaseTestCase):
def setUp(self):
super(TestImagesSerializerDirectUrl, self).setUp()
self.serializer = glance.api.v2.images.ResponseSerializer()
@ -4225,6 +4228,7 @@ class TestImagesSerializerDirectUrl(test_utils.BaseTestCase):
class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
def test_default_disk_formats(self):
schema = glance.api.v2.images.get_schema()
expected = [None, 'ami', 'ari', 'aki', 'vhd', 'vhdx', 'vmdk',
@ -4254,6 +4258,7 @@ class TestImageSchemaFormatConfiguration(test_utils.BaseTestCase):
class TestImageSchemaDeterminePropertyBasis(test_utils.BaseTestCase):
def test_custom_property_marked_as_non_base(self):
self.config(allow_additional_image_properties=False)
custom_image_properties = {

View File

@ -759,7 +759,7 @@ class TestRegistryV2ClientApi(base.IsolatedUnitTest):
self.config(admin_tenant_name=expected['tenant'])
self.config(auth_strategy=expected['strategy'])
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)
rapi.configure_registry_admin_creds()

View File

@ -25,6 +25,7 @@ import subprocess
from alembic import command as alembic_command
import fixtures
import mock
from oslo_config import cfg
from oslo_config import fixture as cfg_fixture
from oslo_log.fixture import logging_error as log_fixture
@ -79,7 +80,7 @@ class BaseTestCase(testtools.TestCase):
self.addCleanup(CONF.reset)
mox_fixture = self.useFixture(moxstubout.MoxStubout())
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.conf_dir = os.path.join(self.test_dir, 'etc')
utils.safe_mkdirs(self.conf_dir)
@ -139,9 +140,21 @@ class BaseTestCase(testtools.TestCase):
"""
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):
"""Decorator that initiates additional test setup/teardown."""
def __init__(self, setup=None, teardown=None):
self.setup = setup
self.teardown = teardown
@ -160,6 +173,7 @@ class requires(object):
class depends_on_exe(object):
"""Decorator to skip test if an executable is unavailable"""
def __init__(self, exe):
self.exe = exe