summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Rocco <drocco@thebrightlink.com>2013-08-24 16:03:22 -0400
committerDaniel Rocco <drocco@thebrightlink.com>2013-11-23 23:12:47 -0500
commit9c7558aeef8fcafca4b45d2c5bcf88e5a4e36790 (patch)
treeefac830c1c10185ddca18d246c375ba253c847a6
parent86f6ba332bb09d9a5a4f24112c0db3474cb1b139 (diff)
downloadstevedore-9c7558aeef8fcafca4b45d2c5bcf88e5a4e36790.tar.gz
driver extension manager test instance factory
-rw-r--r--stevedore/driver.py39
-rw-r--r--stevedore/named.py4
-rw-r--r--stevedore/tests/test_driver.py42
-rw-r--r--stevedore/tests/test_test_manager.py3
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