test_middleware_system.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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.interfaces.middleware import Middleware
  6. class MiddlewareSystemTestCase(unittest.TestCase):
  7. def test_basic_middleware(self):
  8. class DummyMiddleWare(Middleware):
  9. def __init__(self):
  10. self.invocation_order = ""
  11. def install(self, event_manager):
  12. self.event_manager = event_manager
  13. self.invocation_order += "install_"
  14. def uninstall(self):
  15. self.invocation_order += "uninstall"
  16. dispatcher = SimpleEventDispatcher()
  17. manager = SimpleMiddlewareManager(dispatcher)
  18. middleware = DummyMiddleWare()
  19. manager.add(middleware)
  20. self.assertEqual(middleware.invocation_order, "install_",
  21. "install should be called when adding new middleware")
  22. manager.remove(middleware)
  23. self.assertEqual(middleware.invocation_order, "install_uninstall",
  24. "uninstall should be called when removing middleware")
  25. def test_base_middleware(self):
  26. EVENT_NAME = "some.event.occurred"
  27. class DummyMiddleWare(BaseMiddleware):
  28. def __init__(self):
  29. self.invocation_order = ""
  30. def setup(self):
  31. self.add_observer(event_pattern="some.event.*", priority=1000,
  32. callback=self.my_callback_obs)
  33. self.add_interceptor(event_pattern="some.*", priority=900,
  34. callback=self.my_callback_intcpt)
  35. def my_callback_obs(self, **kwargs):
  36. self.invocation_order += "observe"
  37. def my_callback_intcpt(self, **kwargs):
  38. self.invocation_order += "intercept_"
  39. return kwargs.get('next_handler').invoke(**kwargs)
  40. dispatcher = SimpleEventDispatcher()
  41. manager = SimpleMiddlewareManager(dispatcher)
  42. middleware = DummyMiddleWare()
  43. manager.add(middleware)
  44. dispatcher.emit(self, EVENT_NAME)
  45. self.assertEqual(middleware.invocation_order, "intercept_observe")
  46. self.assertListEqual(
  47. [middleware.my_callback_intcpt, middleware.my_callback_obs],
  48. [handler.callback for handler
  49. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  50. manager.remove(middleware)
  51. self.assertListEqual([], dispatcher.get_handlers_for_event(EVENT_NAME))
  52. def test_multiple_middleware(self):
  53. EVENT_NAME = "some.really.interesting.event.occurred"
  54. class DummyMiddleWare1(BaseMiddleware):
  55. def __init__(self):
  56. self.invocation_order = ""
  57. def setup(self):
  58. self.add_observer(event_pattern="some.really.*", priority=1000,
  59. callback=self.my_callback_obs1)
  60. self.add_interceptor(event_pattern="some.*", priority=900,
  61. callback=self.my_callback_intcpt2)
  62. def my_callback_obs1(self, **kwargs):
  63. self.invocation_order += "observe"
  64. def my_callback_intcpt2(self, **kwargs):
  65. self.invocation_order += "intercept_"
  66. return kwargs.get('next_handler').invoke(**kwargs)
  67. class DummyMiddleWare2(BaseMiddleware):
  68. def __init__(self):
  69. self.invocation_order = ""
  70. def setup(self):
  71. self.add_observer(event_pattern="some.really.*", priority=1050,
  72. callback=self.my_callback_obs1)
  73. self.add_interceptor(event_pattern="*", priority=950,
  74. callback=self.my_callback_intcpt2)
  75. def my_callback_obs1(self, **kwargs):
  76. self.invocation_order += "observe"
  77. def my_callback_intcpt2(self, **kwargs):
  78. self.invocation_order += "intercept_"
  79. return kwargs.get('next_handler').invoke(**kwargs)
  80. dispatcher = SimpleEventDispatcher()
  81. manager = SimpleMiddlewareManager(dispatcher)
  82. middleware1 = DummyMiddleWare1()
  83. middleware2 = DummyMiddleWare2()
  84. manager.add(middleware1)
  85. manager.add(middleware2)
  86. dispatcher.emit(self, EVENT_NAME)
  87. # Callbacks in both middleware classes should be registered
  88. self.assertListEqual(
  89. [middleware1.my_callback_intcpt2, middleware2.my_callback_intcpt2,
  90. middleware1.my_callback_obs1, middleware2.my_callback_obs1],
  91. [handler.callback for handler
  92. in dispatcher.get_handlers_for_event(EVENT_NAME)])
  93. manager.remove(middleware1)
  94. # Only middleware2 callbacks should be registered
  95. self.assertListEqual(
  96. [middleware2.my_callback_intcpt2, middleware2.my_callback_obs1],
  97. [handler.callback for handler in
  98. dispatcher.get_handlers_for_event(EVENT_NAME)])