test_middleware_system.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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, *args, **kwargs):
  34. self.invocation_order += "observe"
  35. assert 'first_pos_arg' in args
  36. assert kwargs.get('a_keyword_arg') == "something"
  37. @intercept(event_pattern="some.event.*", priority=900)
  38. def my_callback_intcpt(self, event_args, *args, **kwargs):
  39. self.invocation_order += "intercept_"
  40. assert 'first_pos_arg' in args
  41. assert kwargs.get('a_keyword_arg') == "something"
  42. next_handler = event_args.get('next_handler')
  43. return next_handler.invoke(event_args, *args, **kwargs)
  44. dispatcher = SimpleEventDispatcher()
  45. manager = SimpleMiddlewareManager(dispatcher)
  46. middleware = DummyMiddleWare()
  47. manager.add(middleware)
  48. dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
  49. a_keyword_arg='something')
  50. self.assertEqual(middleware.invocation_order, "intercept_observe")
  51. self.assertListEqual(
  52. [middleware.my_callback_intcpt, middleware.my_callback_obs],
  53. [handler.callback for handler
  54. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  55. manager.remove(middleware)
  56. self.assertListEqual([], dispatcher.get_handlers_for_event(EVENT_NAME))
  57. def test_multiple_middleware(self):
  58. EVENT_NAME = "some.really.interesting.event.occurred"
  59. class DummyMiddleWare1(BaseMiddleware):
  60. @observe(event_pattern="some.really.*", priority=1000)
  61. def my_callback_obs1(self, *args, **kwargs):
  62. pass
  63. @intercept(event_pattern="some.*", priority=900)
  64. def my_callback_intcpt2(self, event_args, *args, **kwargs):
  65. next_handler = event_args.get('next_handler')
  66. return next_handler.invoke(event_args, *args, **kwargs)
  67. class DummyMiddleWare2(BaseMiddleware):
  68. @observe(event_pattern="some.really.*", priority=1050)
  69. def my_callback_obs3(self, *args, **kwargs):
  70. pass
  71. @intercept(event_pattern="*", priority=950)
  72. def my_callback_intcpt4(self, event_args, *args, **kwargs):
  73. next_handler = event_args.get('next_handler')
  74. return next_handler.invoke(event_args, *args, **kwargs)
  75. dispatcher = SimpleEventDispatcher()
  76. manager = SimpleMiddlewareManager(dispatcher)
  77. middleware1 = DummyMiddleWare1()
  78. middleware2 = DummyMiddleWare2()
  79. manager.add(middleware1)
  80. manager.add(middleware2)
  81. dispatcher.dispatch(self, EVENT_NAME)
  82. # Callbacks in both middleware classes should be registered
  83. self.assertListEqual(
  84. [middleware1.my_callback_intcpt2, middleware2.my_callback_intcpt4,
  85. middleware1.my_callback_obs1, middleware2.my_callback_obs3],
  86. [handler.callback for handler
  87. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  88. manager.remove(middleware1)
  89. # Only middleware2 callbacks should be registered
  90. self.assertListEqual(
  91. [middleware2.my_callback_intcpt4, middleware2.my_callback_obs3],
  92. [handler.callback for handler in
  93. dispatcher.get_handlers_for_event(EVENT_NAME)])
  94. # add middleware back to check that internal state is properly handled
  95. manager.add(middleware1)
  96. # should one again equal original list
  97. self.assertListEqual(
  98. [middleware1.my_callback_intcpt2, middleware2.my_callback_intcpt4,
  99. middleware1.my_callback_obs1, middleware2.my_callback_obs3],
  100. [handler.callback for handler
  101. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  102. def test_automatic_middleware(self):
  103. EVENT_NAME = "another.interesting.event.occurred"
  104. class SomeDummyClass(object):
  105. @observe(event_pattern="another.really.*", priority=1000)
  106. def not_a_match(self, *args, **kwargs):
  107. pass
  108. @intercept(event_pattern="another.*", priority=900)
  109. def my_callback_intcpt2(self, *args, **kwargs):
  110. pass
  111. def not_an_event_handler(self, *args, **kwargs):
  112. pass
  113. @observe(event_pattern="another.interesting.*", priority=1000)
  114. def my_callback_obs1(self, *args, **kwargs):
  115. pass
  116. dispatcher = SimpleEventDispatcher()
  117. manager = SimpleMiddlewareManager(dispatcher)
  118. some_obj = SomeDummyClass()
  119. middleware = manager.add(some_obj)
  120. dispatcher.dispatch(self, EVENT_NAME)
  121. # Middleware should be discovered even if class containing interceptors
  122. # doesn't inherit from Middleware
  123. self.assertListEqual(
  124. [some_obj.my_callback_intcpt2, some_obj.my_callback_obs1],
  125. [handler.callback for handler
  126. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  127. manager.remove(middleware)
  128. # Callbacks should be correctly removed
  129. self.assertListEqual(
  130. [],
  131. [handler.callback for handler in
  132. dispatcher.get_handlers_for_event(EVENT_NAME)])