helpers.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import os
  2. import unittest
  3. from cloudbridge.providers.factory import CloudProviderFactory
  4. def create_test_instance(provider):
  5. instance_name = "HelloCloudBridge-{0}".format(provider.name)
  6. if "AWSCloudProvider" in provider.name:
  7. ami = os.environ.get('CB_AMI', 'ami-d85e75b0')
  8. instance_type = os.environ.get('CB_INSTANCE_TYPE', 't1.micro')
  9. return provider.compute.create_instance(
  10. instance_name, ami, instance_type)
  11. elif "OpenStackCloudProvider" in provider.name:
  12. image_id = os.environ.get(
  13. 'CB_IMAGE',
  14. "d57696ba-5ed2-43fe-bf78-a587829973a9")
  15. instance_type = os.environ.get('CB_FLAVOR', "m2.xsmall")
  16. return provider.compute.create_instance(
  17. "{0}-{1}".format(instance_name, provider.name),
  18. image_id,
  19. instance_type)
  20. def get_test_instance(provider):
  21. instance = create_test_instance(provider)
  22. instance.wait_till_ready()
  23. return instance
  24. class ProviderTestBase(object):
  25. """
  26. A dummy base class for Test Cases. Does not inherit from unittest.TestCase
  27. to avoid confusing test discovery by unittest and nose2. unittest.TestCase
  28. is injected as a base class by the generator, so calling the unittest
  29. constructor works correctly.
  30. """
  31. def __init__(self, methodName, provider):
  32. unittest.TestCase.__init__(self, methodName=methodName)
  33. self.provider = provider
  34. class ProviderTestCaseGenerator():
  35. """
  36. Generates test cases for all provider - testcase combinations.
  37. Detailed docs at test/__init__.py
  38. """
  39. def __init__(self, test_classes):
  40. self.all_test_classes = test_classes
  41. def create_provider_instance(self, provider_class):
  42. """
  43. Instantiate a default provider instance. All required connection
  44. settings are expected to be set as environment variables.
  45. """
  46. return provider_class({})
  47. def generate_new_test_class(self, name, testcase_class):
  48. """
  49. Generates a new type which inherits from the given testcase_class and
  50. unittest.TestCase
  51. """
  52. class_name = "{0}{1}".format(name, testcase_class.__name__)
  53. return type(class_name, (testcase_class, unittest.TestCase), {})
  54. def generate_test_suite_for_provider_testcase(
  55. self, provider_class, testcase_class):
  56. """
  57. Generate and return a suite of tests for a specific provider class and
  58. testcase combination
  59. """
  60. testloader = unittest.TestLoader()
  61. testnames = testloader.getTestCaseNames(testcase_class)
  62. suite = unittest.TestSuite()
  63. for name in testnames:
  64. generated_cls = self.generate_new_test_class(
  65. provider_class.__name__,
  66. testcase_class)
  67. suite.addTest(
  68. generated_cls(
  69. name,
  70. self.create_provider_instance(provider_class)))
  71. return suite
  72. def generate_test_suite_for_provider(self, provider_class):
  73. """
  74. Generate and return a suite of all available tests for a given provider
  75. class
  76. """
  77. suite = unittest.TestSuite()
  78. suites = map(
  79. lambda test_class: self.generate_test_suite_for_provider_testcase(
  80. provider_class, test_class), self.all_test_classes)
  81. map(suite.addTest, suites)
  82. return suite
  83. def generate_tests(self):
  84. """
  85. Generate and return a suite of tests for all provider and test class
  86. combinations
  87. """
  88. factory = CloudProviderFactory()
  89. provider_name = os.environ.get("CB_TEST_PROVIDER", None)
  90. if provider_name:
  91. provider_classes = [factory.get_provider_class(provider_name)]
  92. else:
  93. provider_classes = factory.get_all_provider_classes()
  94. suite = unittest.TestSuite()
  95. suites = map(self.generate_test_suite_for_provider, provider_classes)
  96. map(suite.addTest, suites)
  97. return suite