Prechádzať zdrojové kódy

Added tests for exception wrapping middleware

Nuwan Goonasekera 7 rokov pred
rodič
commit
883a4d2e48

+ 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
     than for debugging, as it could log sensitive parameters such as
     access keys.
     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)
     @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(
         log.debug("Event: {0} result: {1}".format(
-            kwargs.get("event"), result))
-        return result
+            event_args.get("event"), event_args.get("result")))
 
 
 
 
 class ExceptionWrappingMiddleware(BaseMiddleware):
 class ExceptionWrappingMiddleware(BaseMiddleware):
     """
     """
     Wraps all unhandled exceptions in cloudbridge exceptions.
     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:
         try:
-            return next_handler.invoke(**kwargs)
+            return next_handler.invoke(event_args, *args, **kwargs)
         except Exception as e:
         except Exception as e:
             if isinstance(e, CloudBridgeBaseException):
             if isinstance(e, CloudBridgeBaseException):
                 raise
                 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.events import SimpleEventDispatcher
 from cloudbridge.cloud.base.middleware import BaseMiddleware
 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 SimpleMiddlewareManager
 from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.middleware import intercept
 from cloudbridge.cloud.base.middleware import intercept
 from cloudbridge.cloud.base.middleware import observe
 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
 from cloudbridge.cloud.interfaces.middleware import Middleware
 
 
 
 
@@ -199,3 +203,48 @@ class MiddlewareSystemTestCase(unittest.TestCase):
             [],
             [],
             [handler.callback for handler in
             [handler.callback for handler in
              dispatcher.get_handlers_for_event(EVENT_NAME)])
              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)