Merge "Introduce ''mock_object'' method to base test class"

This commit is contained in:
Zuul 2018-08-10 14:40:35 +00:00 committed by Gerrit Code Review
commit 0988d93857
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