Merge "refactor glare plugin loader tests to not mock private methods of stevedore"

This commit is contained in:
Jenkins 2017-01-31 09:25:37 +00:00 committed by Gerrit Code Review
commit d86000bf2e
1 changed files with 46 additions and 49 deletions

View File

@ -12,11 +12,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import os
import mock import mock
import pkg_resources from stevedore import extension
import stevedore
from glance.common import exception from glance.common import exception
from glance.common.glare import loader from glance.common.glare import loader
@ -37,29 +34,28 @@ class MyArtifactOk(art1.MyArtifact):
class TestArtifactsLoader(utils.BaseTestCase): class TestArtifactsLoader(utils.BaseTestCase):
def setUp(self): def setUp(self):
self.path = 'glance.contrib.plugins.artifacts_sample' self._setup_loader([('MyArtifact', art1.MyArtifact)])
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' %
self.path])
super(TestArtifactsLoader, self).setUp() super(TestArtifactsLoader, self).setUp()
def _setup_loader(self, artifacts): def _setup_loader(self, artifacts):
self.loader = None self.loader = None
try: self.extensions = [
# FIXME(dims) : We should not be relying on the internal class extension.Extension(
# methods of stevedore. name=a[0],
with mock.patch.object(stevedore.extension.ExtensionManager, entry_point=mock.Mock(),
'_find_entry_points') as fep: plugin=a[1],
fep.return_value = [ obj=None,
pkg_resources.EntryPoint.parse(art) for art in artifacts] )
self.loader = loader.ArtifactsPluginLoader( for a in artifacts
'glance.artifacts.types') ]
except AttributeError: test_plugins = extension.ExtensionManager.make_test_instance(
with mock.patch.object(stevedore.extension.ExtensionManager, extensions=self.extensions,
'list_entry_points') as fep: propagate_map_exceptions=True,
fep.return_value = [ )
pkg_resources.EntryPoint.parse(art) for art in artifacts] self.loader = loader.ArtifactsPluginLoader(
self.loader = loader.ArtifactsPluginLoader( 'glance.artifacts.types',
'glance.artifacts.types') test_plugins=test_plugins,
)
def test_load(self): def test_load(self):
""" """
@ -71,12 +67,11 @@ class TestArtifactsLoader(utils.BaseTestCase):
self.assertEqual(art1.MyArtifact, self.assertEqual(art1.MyArtifact,
self.loader.get_class_by_endpoint('myartifact')) self.loader.get_class_by_endpoint('myartifact'))
# entrypoint = [a, list] # entrypoint = [a, list]
path = os.path.splitext(__file__)[0][__file__.rfind(
'glance'):].replace('/', '.')
self._setup_loader([ self._setup_loader([
'MyArtifact=%s:MyArtifactOk' % path, ('MyArtifact', MyArtifactOk),
'MyArtifact=%s.v2.artifact:MyArtifact' % self.path, ('MyArtifact', art2.MyArtifact),
'MyArtifact=%s.v1.artifact:MyArtifact' % self.path]), ('MyArtifact', art1.MyArtifact),
])
self.assertEqual(3, len(self.loader.mgr.extensions)) self.assertEqual(3, len(self.loader.mgr.extensions))
# returns the plugin with the latest version # returns the plugin with the latest version
self.assertEqual(art2.MyArtifact, self.assertEqual(art2.MyArtifact,
@ -88,8 +83,7 @@ class TestArtifactsLoader(utils.BaseTestCase):
def test_basic_loader_func(self): def test_basic_loader_func(self):
"""Test public methods of PluginLoader class here""" """Test public methods of PluginLoader class here"""
# type_version 2 == 2.0 == 2.0.0 # type_version 2 == 2.0 == 2.0.0
self._setup_loader( self._setup_loader([('MyArtifact', art2.MyArtifact)])
['MyArtifact=%s.v2.artifact:MyArtifact' % self.path])
self.assertEqual(art2.MyArtifact, self.assertEqual(art2.MyArtifact,
self.loader.get_class_by_endpoint('myartifact')) self.loader.get_class_by_endpoint('myartifact'))
self.assertEqual(art2.MyArtifact, self.assertEqual(art2.MyArtifact,
@ -114,21 +108,18 @@ class TestArtifactsLoader(utils.BaseTestCase):
* no plugin with the same type_name and version has been already * no plugin with the same type_name and version has been already
loaded loaded
""" """
path = 'glance.contrib.plugins.artifacts_sample'
# here artifacts specific validation is checked # here artifacts specific validation is checked
self.assertRaises(exception.ArtifactNonMatchingTypeName, self.assertRaises(exception.ArtifactNonMatchingTypeName,
self._setup_loader, self._setup_loader,
['non_matching_name=%s.v1.artifact:MyArtifact' % [('non_matching_name', art1.MyArtifact)],
path]) )
# make sure this call is ok # make sure this call is ok
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' % path]) self._setup_loader([('MyArtifact', art1.MyArtifact)])
art_type = self.loader.get_class_by_endpoint('myartifact') art_type = self.loader.get_class_by_endpoint('myartifact')
self.assertEqual('MyArtifact', art_type.metadata.type_name) self.assertEqual('MyArtifact', art_type.metadata.type_name)
self.assertEqual('1.0.1', art_type.metadata.type_version) self.assertEqual('1.0.1', art_type.metadata.type_version)
# now try to add duplicate artifact with the same type_name and # now try to add duplicate artifact with the same type_name and
# type_version as already exists # type_version as already exists
bad_art_path = os.path.splitext(__file__)[0][__file__.rfind(
'glance'):].replace('/', '.')
self.assertEqual(art_type.metadata.type_version, self.assertEqual(art_type.metadata.type_version,
MyArtifactDuplicate.metadata.type_version) MyArtifactDuplicate.metadata.type_version)
self.assertEqual(art_type.metadata.type_name, self.assertEqual(art_type.metadata.type_name,
@ -136,14 +127,14 @@ class TestArtifactsLoader(utils.BaseTestCase):
# should raise an exception as (name, version) is not unique # should raise an exception as (name, version) is not unique
self.assertRaises( self.assertRaises(
exception.ArtifactDuplicateNameTypeVersion, self._setup_loader, exception.ArtifactDuplicateNameTypeVersion, self._setup_loader,
['MyArtifact=%s.v1.artifact:MyArtifact' % path, [('MyArtifact', art1.MyArtifact),
'MyArtifact=%s:MyArtifactDuplicate' % bad_art_path]) ('MyArtifact', MyArtifactDuplicate)])
# two artifacts with the same name but different versions coexist fine # two artifacts with the same name but different versions coexist fine
self.assertEqual('MyArtifact', MyArtifactOk.metadata.type_name) self.assertEqual('MyArtifact', MyArtifactOk.metadata.type_name)
self.assertNotEqual(art_type.metadata.type_version, self.assertNotEqual(art_type.metadata.type_version,
MyArtifactOk.metadata.type_version) MyArtifactOk.metadata.type_version)
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' % path, self._setup_loader([('MyArtifact', art1.MyArtifact),
'MyArtifact=%s:MyArtifactOk' % bad_art_path]) ('MyArtifact', MyArtifactOk)])
def test_check_function(self): def test_check_function(self):
""" """
@ -156,16 +147,22 @@ class TestArtifactsLoader(utils.BaseTestCase):
""" """
self.config(load_enabled=False) self.config(load_enabled=False)
self.assertRaises(exception.ArtifactLoadError, self._setup_loader([('MyArtifact', art1.MyArtifact)])
self._setup_loader, checker = self.loader._gen_check_func()
['MyArtifact=%s.v1.artifact:MyArtifact' % self.path]) self.assertRaises(
exception.ArtifactLoadError,
checker,
self.extensions[0],
)
self.config(load_enabled=True, available_plugins=['MyArtifact-1.0.2']) self.config(load_enabled=True, available_plugins=['MyArtifact-1.0.2'])
self.assertRaises(exception.ArtifactLoadError, self._setup_loader([('MyArtifact', art1.MyArtifact)])
self._setup_loader, checker = self.loader._gen_check_func()
['MyArtifact=%s.v1.artifact:MyArtifact' % self.path]) self.assertRaises(
path = os.path.splitext(__file__)[0][__file__.rfind( exception.ArtifactLoadError,
'glance'):].replace('/', '.') checker,
self._setup_loader(['MyArtifact=%s:MyArtifactOk' % path]) self.extensions[0],
)
self._setup_loader([('MyArtifact', MyArtifactOk)])
# make sure that plugin_map has the expected plugin # make sure that plugin_map has the expected plugin
self.assertEqual(MyArtifactOk, self.assertEqual(MyArtifactOk,
self.loader.get_class_by_endpoint('myartifact', self.loader.get_class_by_endpoint('myartifact',