test_driver.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  2. # not use this file except in compliance with the License. You may obtain
  3. # a copy of the License at
  4. #
  5. # http://www.apache.org/licenses/LICENSE-2.0
  6. #
  7. # Unless required by applicable law or agreed to in writing, software
  8. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  9. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  10. # License for the specific language governing permissions and limitations
  11. # under the License.
  12. """Tests for stevedore.extension
  13. """
  14. import importlib.metadata as importlib_metadata
  15. from stevedore import driver
  16. from stevedore import exception
  17. from stevedore import extension
  18. from stevedore.tests import test_extension
  19. from stevedore.tests import utils
  20. class TestCallback(utils.TestCase):
  21. def test_detect_plugins(self):
  22. em = driver.DriverManager('stevedore.test.extension', 't1')
  23. names = sorted(em.names())
  24. self.assertEqual(names, ['t1'])
  25. def test_call(self):
  26. def invoke(ext, *args, **kwds):
  27. return (ext.name, args, kwds)
  28. em = driver.DriverManager('stevedore.test.extension', 't1')
  29. result = em(invoke, 'a', b='C')
  30. self.assertEqual(result, ('t1', ('a',), {'b': 'C'}))
  31. def test_driver_property_not_invoked_on_load(self):
  32. em = driver.DriverManager('stevedore.test.extension', 't1',
  33. invoke_on_load=False)
  34. d = em.driver
  35. self.assertIs(d, test_extension.FauxExtension)
  36. def test_driver_property_invoked_on_load(self):
  37. em = driver.DriverManager('stevedore.test.extension', 't1',
  38. invoke_on_load=True)
  39. d = em.driver
  40. self.assertIsInstance(d, test_extension.FauxExtension)
  41. def test_no_drivers(self):
  42. try:
  43. driver.DriverManager('stevedore.test.extension.none', 't1')
  44. except exception.NoMatches as err:
  45. self.assertIn("No 'stevedore.test.extension.none' driver found",
  46. str(err))
  47. def test_bad_driver(self):
  48. try:
  49. driver.DriverManager('stevedore.test.extension', 'e2')
  50. except ImportError:
  51. pass
  52. else:
  53. self.assertEqual(False, "No error raised")
  54. def test_multiple_drivers(self):
  55. # The idea for this test was contributed by clayg:
  56. # https://gist.github.com/clayg/6311348
  57. extensions = [
  58. extension.Extension(
  59. 'backend',
  60. importlib_metadata.EntryPoint(
  61. 'backend', 'pkg1:driver', 'backend'),
  62. 'pkg backend',
  63. None,
  64. ),
  65. extension.Extension(
  66. 'backend',
  67. importlib_metadata.EntryPoint(
  68. 'backend', 'pkg2:driver', 'backend'),
  69. 'pkg backend',
  70. None,
  71. ),
  72. ]
  73. try:
  74. dm = driver.DriverManager.make_test_instance(extensions[0])
  75. # Call the initialization code that verifies the extension
  76. dm._init_plugins(extensions)
  77. except exception.MultipleMatches as err:
  78. self.assertIn("Multiple", str(err))
  79. else:
  80. self.fail('Should have had an error')