2
0
Эх сурвалжийг харах

Added support for skipping tests if service is not implemented

Nuwan Goonasekera 9 жил өмнө
parent
commit
a4c07639d7

+ 6 - 1
cloudbridge/cloud/base/provider.py

@@ -5,6 +5,7 @@ try:
 except ImportError:  # Python 2
     from ConfigParser import SafeConfigParser
 from os.path import expanduser
+import functools
 
 from cloudbridge.cloud.interfaces import CloudProvider
 from cloudbridge.cloud.interfaces.resources import Configuration
@@ -95,6 +96,10 @@ class BaseCloudProvider(CloudProvider):
             raise ProviderConnectionException(
                 "Authentication with cloud provider failed: %s" % (e,))
 
+    def _deepgetattr(self, obj, attr):
+        """Recurses through an attribute chain to get the ultimate value."""
+        return functools.reduce(getattr, attr.split('.'), obj)
+
     def has_service(self, service_type):
         """
         Checks whether this provider supports a given service.
@@ -106,7 +111,7 @@ class BaseCloudProvider(CloudProvider):
         :return: ``True`` if the service type is supported.
         """
         try:
-            if getattr(self, service_type):
+            if self._deepgetattr(self, service_type):
                 return True
         except AttributeError:
             pass  # Undefined service type

+ 20 - 0
test/helpers.py

@@ -50,6 +50,26 @@ def cleanup_action(cleanup_func):
         print("Error during cleanup: {0}".format(e))
 
 
+def skipIfNoService(service):
+    """
+    A decorator for skipping tests if the provider
+    does not implement a given service.
+    """
+    def wrap(func):
+        """
+        The actual wrapper
+        """
+        def wrapper(self, *args, **kwargs):
+            provider = getattr(self, 'provider')
+            if provider and not provider.has_service(service):
+                self.skipTest("Skipping test because '%s' service is not"
+                              " implemented" % (service,))
+            else:
+                func(self, *args, **kwargs)
+        return wrapper
+    return wrap
+
+
 TEST_DATA_CONFIG = {
     "AWSCloudProvider": {
         "image": os.environ.get('CB_IMAGE_AWS', 'ami-5ac2cd4d'),