diff options
author | Daniel Rocco <drocco@thebrightlink.com> | 2013-08-24 16:03:22 -0400 |
---|---|---|
committer | Daniel Rocco <drocco@thebrightlink.com> | 2013-11-23 23:12:47 -0500 |
commit | 9c7558aeef8fcafca4b45d2c5bcf88e5a4e36790 (patch) | |
tree | efac830c1c10185ddca18d246c375ba253c847a6 | |
parent | 86f6ba332bb09d9a5a4f24112c0db3474cb1b139 (diff) | |
download | stevedore-9c7558aeef8fcafca4b45d2c5bcf88e5a4e36790.tar.gz |
driver extension manager test instance factory
-rw-r--r-- | stevedore/driver.py | 39 | ||||
-rw-r--r-- | stevedore/named.py | 4 | ||||
-rw-r--r-- | stevedore/tests/test_driver.py | 42 | ||||
-rw-r--r-- | stevedore/tests/test_test_manager.py | 3 |
4 files changed, 82 insertions, 6 deletions
diff --git a/stevedore/driver.py b/stevedore/driver.py index 54cdcae..d8bcd12 100644 --- a/stevedore/driver.py +++ b/stevedore/driver.py @@ -30,16 +30,49 @@ class DriverManager(NamedExtensionManager): invoke_args=invoke_args, invoke_kwds=invoke_kwds, ) + + @classmethod + def make_test_instance(cls, available_extensions, name, + propagate_map_exceptions=False): + """Construct a test DriverManager + + Test instances are passed a list of extensions to work from rather + than loading them from entry points. DriverManager test instances use + the name argument to determine which of the available_extensions should + be used as the driver. + + :param available_extensions: Pre-configured Extension instances + available for use + :type available_extensions: list of + :class:`~stevedore.extension.Extension` + :param name: The name of the driver to use. + :type name: str + :param propagate_map_exceptions: Boolean controlling whether exceptions + are propagated up through the map call or whether they are logged + and then ignored + :type propagate_map_exceptions: bool + :return: The manager instance, initialized for testing + + """ + + o = super(DriverManager, cls).make_test_instance( + available_extensions, [name], + propagate_map_exceptions=propagate_map_exceptions) + return o + + def _init_plugins(self, extensions, propagate_map_exceptions=False): + super(DriverManager, self)._init_plugins(extensions) + if not self.extensions: + name = self._names[0] raise RuntimeError('No %r driver found, looking for %r' % - (namespace, name)) + (self.namespace, name)) if len(self.extensions) > 1: discovered_drivers = ','.join(e.entry_point_target for e in self.extensions) raise RuntimeError('Multiple %r drivers found: %s' % - (namespace, discovered_drivers)) - + (self.namespace, discovered_drivers)) def __call__(self, func, *args, **kwds): """Invokes func() for the single loaded extension. diff --git a/stevedore/named.py b/stevedore/named.py index 9708f99..0b1ce97 100644 --- a/stevedore/named.py +++ b/stevedore/named.py @@ -46,7 +46,7 @@ class NamedExtensionManager(ExtensionManager): ) @classmethod - def make_test_instance(cls, available_extensions, names, + def make_test_instance(cls, available_extensions, names=None, name_order=False, propagate_map_exceptions=False): """Construct a test NamedExtensionManager @@ -73,6 +73,7 @@ class NamedExtensionManager(ExtensionManager): """ o = cls.__new__(cls) + o.namespace = 'TESTING' o._names = names o._name_order = name_order @@ -80,6 +81,7 @@ class NamedExtensionManager(ExtensionManager): # happens in _load_one_plugin extensions = [extension for extension in available_extensions if extension.name in names] + o._init_plugins(extensions, propagate_map_exceptions=propagate_map_exceptions) return o diff --git a/stevedore/tests/test_driver.py b/stevedore/tests/test_driver.py index 70ec54c..df43110 100644 --- a/stevedore/tests/test_driver.py +++ b/stevedore/tests/test_driver.py @@ -1,13 +1,21 @@ """Tests for stevedore.extension """ +from mock import Mock, sentinel +from nose.tools import raises import mock import pkg_resources from stevedore import driver +from stevedore.extension import Extension from stevedore.tests import test_extension +mock_entry_point = Mock(module_name='test.extension', attrs=['obj']) +a_driver = Extension('test_driver', mock_entry_point, sentinel.driver_plugin, + sentinel.driver_obj) + + def test_detect_plugins(): em = driver.DriverManager('stevedore.test.extension', 't1') names = sorted(em.names()) @@ -59,3 +67,37 @@ def test_multiple_drivers(): except RuntimeError as err: assert "Multiple" in str(err), str(err) fep.assert_called_with('stevedore.test.multiple_drivers') + + +@raises(RuntimeError) +def test_instance_driver_not_found_should_raise(): + extension = Extension('a_driver', None, None, None) + driver.DriverManager.make_test_instance( + [extension], 'this_is_not_the_driver_you_are_looking_for') + + +@raises(RuntimeError) +def test_instance_multiple_drivers_found_should_raise(): + extension = Extension('test_driver', mock_entry_point, None, None) + copycat = Extension('test_driver', mock_entry_point, None, None) + + driver.DriverManager.make_test_instance([extension, copycat], + 'test_driver') + + +def test_instance_should_find_named_driver(): + em = driver.DriverManager.make_test_instance([a_driver], 'test_driver') + assert ['test_driver'] == em.names() + + +def test_instance_call(): + def invoke(ext, *args, **kwds): + return (ext.name, args, kwds) + em = driver.DriverManager.make_test_instance([a_driver], 'test_driver') + result = em(invoke, 'a', b='C') + assert result == ('test_driver', ('a',), {'b': 'C'}) + + +def test_instance_driver(): + em = driver.DriverManager.make_test_instance([a_driver], 'test_driver') + assert sentinel.driver_obj == em.driver diff --git a/stevedore/tests/test_test_manager.py b/stevedore/tests/test_test_manager.py index 3046127..2dd42c0 100644 --- a/stevedore/tests/test_test_manager.py +++ b/stevedore/tests/test_test_manager.py @@ -1,7 +1,6 @@ from mock import Mock from nose.tools import raises -from stevedore import (ExtensionManager, NamedExtensionManager, HookManager, - EnabledExtensionManager, DriverManager) +from stevedore import (ExtensionManager, NamedExtensionManager, HookManager) from stevedore.extension import Extension |