test_middleware_system.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import unittest
  2. from cloudbridge.cloud.base.events import SimpleEventDispatcher
  3. from cloudbridge.cloud.base.middleware import BaseMiddleware
  4. from cloudbridge.cloud.base.middleware import SimpleMiddlewareManager
  5. from cloudbridge.cloud.base.middleware import intercept
  6. from cloudbridge.cloud.base.middleware import observe
  7. from cloudbridge.cloud.interfaces.middleware import Middleware
  8. class MiddlewareSystemTestCase(unittest.TestCase):
  9. def test_basic_middleware(self):
  10. class DummyMiddleWare(Middleware):
  11. def __init__(self):
  12. self.invocation_order = ""
  13. def install(self, event_manager):
  14. self.event_manager = event_manager
  15. self.invocation_order += "install_"
  16. def uninstall(self):
  17. self.invocation_order += "uninstall"
  18. dispatcher = SimpleEventDispatcher()
  19. manager = SimpleMiddlewareManager(dispatcher)
  20. middleware = DummyMiddleWare()
  21. manager.add(middleware)
  22. self.assertEqual(middleware.invocation_order, "install_",
  23. "install should be called when adding new middleware")
  24. manager.remove(middleware)
  25. self.assertEqual(middleware.invocation_order, "install_uninstall",
  26. "uninstall should be called when removing middleware")
  27. def test_base_middleware(self):
  28. EVENT_NAME = "some.event.occurred"
  29. class DummyMiddleWare(BaseMiddleware):
  30. def __init__(self):
  31. self.invocation_order = ""
  32. @observe(event_pattern="some.event.*", priority=1000)
  33. def my_callback_obs(self, **kwargs):
  34. self.invocation_order += "observe"
  35. @intercept(event_pattern="some.event.*", priority=900)
  36. def my_callback_intcpt(self, **kwargs):
  37. self.invocation_order += "intercept_"
  38. return kwargs.get('next_handler').invoke(**kwargs)
  39. dispatcher = SimpleEventDispatcher()
  40. manager = SimpleMiddlewareManager(dispatcher)
  41. middleware = DummyMiddleWare()
  42. manager.add(middleware)
  43. dispatcher.emit(self, EVENT_NAME)
  44. self.assertEqual(middleware.invocation_order, "intercept_observe")
  45. self.assertListEqual(
  46. [middleware.my_callback_intcpt, middleware.my_callback_obs],
  47. [handler.callback for handler
  48. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  49. manager.remove(middleware)
  50. self.assertListEqual([], dispatcher.get_handlers_for_event(EVENT_NAME))
  51. def test_multiple_middleware(self):
  52. EVENT_NAME = "some.really.interesting.event.occurred"
  53. class DummyMiddleWare1(BaseMiddleware):
  54. @observe(event_pattern="some.really.*", priority=1000)
  55. def my_callback_obs1(self, **kwargs):
  56. pass
  57. @intercept(event_pattern="some.*", priority=900)
  58. def my_callback_intcpt2(self, **kwargs):
  59. return kwargs.get('next_handler').invoke(**kwargs)
  60. class DummyMiddleWare2(BaseMiddleware):
  61. @observe(event_pattern="some.really.*", priority=1050)
  62. def my_callback_obs3(self, **kwargs):
  63. pass
  64. @intercept(event_pattern="*", priority=950)
  65. def my_callback_intcpt4(self, **kwargs):
  66. return kwargs.get('next_handler').invoke(**kwargs)
  67. dispatcher = SimpleEventDispatcher()
  68. manager = SimpleMiddlewareManager(dispatcher)
  69. middleware1 = DummyMiddleWare1()
  70. middleware2 = DummyMiddleWare2()
  71. manager.add(middleware1)
  72. manager.add(middleware2)
  73. dispatcher.emit(self, EVENT_NAME)
  74. # Callbacks in both middleware classes should be registered
  75. self.assertListEqual(
  76. [middleware1.my_callback_intcpt2, middleware2.my_callback_intcpt4,
  77. middleware1.my_callback_obs1, middleware2.my_callback_obs3],
  78. [handler.callback for handler
  79. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  80. manager.remove(middleware1)
  81. # Only middleware2 callbacks should be registered
  82. self.assertListEqual(
  83. [middleware2.my_callback_intcpt4, middleware2.my_callback_obs3],
  84. [handler.callback for handler in
  85. dispatcher.get_handlers_for_event(EVENT_NAME)])
  86. # add middleware back to check that internal state is properly handled
  87. manager.add(middleware1)
  88. # should one again equal original list
  89. self.assertListEqual(
  90. [middleware1.my_callback_intcpt2, middleware2.my_callback_intcpt4,
  91. middleware1.my_callback_obs1, middleware2.my_callback_obs3],
  92. [handler.callback for handler
  93. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  94. def test_automatic_middleware(self):
  95. EVENT_NAME = "another.interesting.event.occurred"
  96. class SomeDummyClass(object):
  97. @observe(event_pattern="another.really.*", priority=1000)
  98. def not_a_match(self, **kwargs):
  99. pass
  100. @intercept(event_pattern="another.*", priority=900)
  101. def my_callback_intcpt2(self, **kwargs):
  102. pass
  103. def not_an_event_handler(self, **kwargs):
  104. pass
  105. @observe(event_pattern="another.interesting.*", priority=1000)
  106. def my_callback_obs1(self, **kwargs):
  107. pass
  108. dispatcher = SimpleEventDispatcher()
  109. manager = SimpleMiddlewareManager(dispatcher)
  110. some_obj = SomeDummyClass()
  111. middleware = manager.add(some_obj)
  112. dispatcher.emit(self, EVENT_NAME)
  113. # Middleware should be discovered even if class containing interceptors
  114. # doesn't inherit from Middleware
  115. self.assertListEqual(
  116. [some_obj.my_callback_intcpt2, some_obj.my_callback_obs1],
  117. [handler.callback for handler
  118. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  119. manager.remove(middleware)
  120. # Callbacks should be correctly removed
  121. self.assertListEqual(
  122. [],
  123. [handler.callback for handler in
  124. dispatcher.get_handlers_for_event(EVENT_NAME)])