Sfoglia il codice sorgente

Added tests for exception wrapping middleware

Nuwan Goonasekera 7 anni fa
parent
commit
883a4d2e48
2 ha cambiato i file con 62 aggiunte e 23 eliminazioni
  1. 13 23
      cloudbridge/cloud/base/middleware.py
  2. 49 0
      test/test_middleware_system.py

+ 13 - 23
cloudbridge/cloud/base/middleware.py

@@ -141,38 +141,28 @@ class EventDebugLoggingMiddleware(BaseMiddleware):
     than for debugging, as it could log sensitive parameters such as
     access keys.
     """
-    def setup(self):
-        self.add_observer(
-            event_pattern="*", priority=1100, callback=self.pre_log_event)
-        self.add_interceptor(
-            event_pattern="*", priority=1150, callback=self.post_log_event)
-
     @observe(event_pattern="*", priority=1100)
-    def pre_log_event(self, **kwargs):
-        log.debug("Event: {0} invoked with args: {1}".format(
-            kwargs.get("event"), kwargs))
-
-    @intercept(event_pattern="*", priority=1150)
-    def post_log_event(self, **kwargs):
-        next_handler = kwargs.pop("next_handler")
-        result = next_handler.invoke(**kwargs)
+    def pre_log_event(self, event_args, *args, **kwargs):
+        log.debug("Event: {0} invoked with args: {1}, kwargs: {2}".format(
+            event_args.get("event"), args, kwargs))
+
+    @observe(event_pattern="*", priority=1150)
+    def post_log_event(self, event_args, *args, **kwargs):
         log.debug("Event: {0} result: {1}".format(
-            kwargs.get("event"), result))
-        return result
+            event_args.get("event"), event_args.get("result")))
 
 
 class ExceptionWrappingMiddleware(BaseMiddleware):
     """
     Wraps all unhandled exceptions in cloudbridge exceptions.
     """
-    def setup(self):
-        self.add_interceptor(
-            event_pattern="*", priority=1050, callback=self.wrap_exception)
-
-    def wrap_exception(self, **kwargs):
-        next_handler = kwargs.pop("next_handler")
+    @intercept(event_pattern="*", priority=1050)
+    def wrap_exception(self, event_args, *args, **kwargs):
+        next_handler = event_args.pop("next_handler")
+        if not next_handler:
+            return
         try:
-            return next_handler.invoke(**kwargs)
+            return next_handler.invoke(event_args, *args, **kwargs)
         except Exception as e:
             if isinstance(e, CloudBridgeBaseException):
                 raise

+ 49 - 0
test/test_middleware_system.py

@@ -2,10 +2,14 @@ import unittest
 
 from cloudbridge.cloud.base.events import SimpleEventDispatcher
 from cloudbridge.cloud.base.middleware import BaseMiddleware
+from cloudbridge.cloud.base.middleware import ExceptionWrappingMiddleware
 from cloudbridge.cloud.base.middleware import SimpleMiddlewareManager
 from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.middleware import intercept
 from cloudbridge.cloud.base.middleware import observe
+from cloudbridge.cloud.interfaces.exceptions import CloudBridgeBaseException
+from cloudbridge.cloud.interfaces.exceptions import \
+    InvalidConfigurationException
 from cloudbridge.cloud.interfaces.middleware import Middleware
 
 
@@ -199,3 +203,48 @@ class MiddlewareSystemTestCase(unittest.TestCase):
             [],
             [handler.callback for handler in
              dispatcher.get_handlers_for_event(EVENT_NAME)])
+
+
+class ExceptionWrappingMiddlewareTestCase(unittest.TestCase):
+
+    def test_unknown_exception_is_wrapped(self):
+        EVENT_NAME = "an.exceptional.event"
+
+        class SomeDummyClass(object):
+
+            @implement(event_pattern=EVENT_NAME, priority=2500)
+            def raise_a_non_cloudbridge_exception(self, *args, **kwargs):
+                raise Exception("Some unhandled exception")
+
+        dispatcher = SimpleEventDispatcher()
+        manager = SimpleMiddlewareManager(dispatcher)
+        middleware = ExceptionWrappingMiddleware()
+        manager.add(middleware)
+
+        # no exception should be raised when there's no next handler
+        dispatcher.dispatch(self, EVENT_NAME)
+
+        some_obj = SomeDummyClass()
+        manager.add(some_obj)
+
+        with self.assertRaises(CloudBridgeBaseException):
+            dispatcher.dispatch(self, EVENT_NAME)
+
+    def test_cloudbridge_exception_is_passed_through(self):
+        EVENT_NAME = "an.exceptional.event"
+
+        class SomeDummyClass(object):
+
+            @implement(event_pattern=EVENT_NAME, priority=2500)
+            def raise_a_cloudbridge_exception(self, *args, **kwargs):
+                raise InvalidConfigurationException()
+
+        dispatcher = SimpleEventDispatcher()
+        manager = SimpleMiddlewareManager(dispatcher)
+        some_obj = SomeDummyClass()
+        manager.add(some_obj)
+        middleware = ExceptionWrappingMiddleware()
+        manager.add(middleware)
+
+        with self.assertRaises(InvalidConfigurationException):
+            dispatcher.dispatch(self, EVENT_NAME)