From 46b1fb4e94d52cd2efe94d84ee0cd67e6201108b Mon Sep 17 00:00:00 2001 From: Everett Toews Date: Sun, 10 Jan 2016 14:33:59 -0600 Subject: [PATCH] Skip test class unless a service exists An efficient way to skip tests unless the service for those tests exists. Change-Id: I3f5b9584bb01e4f2807eee02b124ea33dfefab86 --- openstack/tests/functional/base.py | 31 +++++++-------- .../functional/telemetry/v2/test_alarm.py | 2 + .../telemetry/v2/test_alarm_change.py | 2 + .../telemetry/v2/test_capability.py | 4 ++ .../functional/telemetry/v2/test_meter.py | 3 ++ .../functional/telemetry/v2/test_resource.py | 4 ++ .../functional/telemetry/v2/test_sample.py | 4 ++ .../telemetry/v2/test_statistics.py | 4 ++ openstack/tests/unit/test_functional_base.py | 39 +++++++++---------- 9 files changed, 55 insertions(+), 38 deletions(-) diff --git a/openstack/tests/functional/base.py b/openstack/tests/functional/base.py index 57c5733d..3c79aeb0 100644 --- a/openstack/tests/functional/base.py +++ b/openstack/tests/functional/base.py @@ -14,35 +14,32 @@ import os import time import unittest +from keystoneauth1 import exceptions as _exceptions from openstack import connection CLOUD_NAME = os.getenv('OS_CLOUD', 'test_cloud') -def requires_service(**kwargs): - """Check whether a service is available for this test - - When the service exists, the test will be run as normal. - When the service does not exist, the test will be skipped. +def service_exists(**kwargs): + """Decorator function to check whether a service exists Usage: - @requires_service(service_type="identity", version="v3") - def test_v3_auth(self): + @unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") + class TestMeter(base.BaseFunctionalTest): ... :param kwargs: The kwargs needed to filter an endpoint. - :returns: The test result if the test is executed. - :raises: SkipTest, which is handled by the test runner. + :returns: True if the service exists, otherwise False. """ - def wrap(method): - def check(self): - ep = self.conn.session.get_endpoint(**kwargs) - if ep is None: - self.skip('Service endpoint not found.') - return method(self) - return check - return wrap + try: + conn = connection.from_config(cloud_name=CLOUD_NAME) + conn.session.get_endpoint(**kwargs) + + return True + except _exceptions.EndpointNotFound: + return False class BaseFunctionalTest(unittest.TestCase): diff --git a/openstack/tests/functional/telemetry/v2/test_alarm.py b/openstack/tests/functional/telemetry/v2/test_alarm.py index f22c42d6..b678a0b7 100644 --- a/openstack/tests/functional/telemetry/v2/test_alarm.py +++ b/openstack/tests/functional/telemetry/v2/test_alarm.py @@ -18,6 +18,8 @@ from openstack.tests.functional import base @unittest.skip("bug/1524468") +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestAlarm(base.BaseFunctionalTest): NAME = uuid.uuid4().hex diff --git a/openstack/tests/functional/telemetry/v2/test_alarm_change.py b/openstack/tests/functional/telemetry/v2/test_alarm_change.py index a9290e3f..185ebe91 100644 --- a/openstack/tests/functional/telemetry/v2/test_alarm_change.py +++ b/openstack/tests/functional/telemetry/v2/test_alarm_change.py @@ -17,6 +17,8 @@ from openstack.tests.functional import base @unittest.skip("bug/1524468") +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestAlarmChange(base.BaseFunctionalTest): NAME = uuid.uuid4().hex diff --git a/openstack/tests/functional/telemetry/v2/test_capability.py b/openstack/tests/functional/telemetry/v2/test_capability.py index 44cf39a0..682ded41 100644 --- a/openstack/tests/functional/telemetry/v2/test_capability.py +++ b/openstack/tests/functional/telemetry/v2/test_capability.py @@ -10,9 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. +import unittest + from openstack.tests.functional import base +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestCapability(base.BaseFunctionalTest): def test_list(self): diff --git a/openstack/tests/functional/telemetry/v2/test_meter.py b/openstack/tests/functional/telemetry/v2/test_meter.py index 0a6e10fe..c06495ef 100644 --- a/openstack/tests/functional/telemetry/v2/test_meter.py +++ b/openstack/tests/functional/telemetry/v2/test_meter.py @@ -10,11 +10,14 @@ # License for the specific language governing permissions and limitations # under the License. +import unittest import uuid from openstack.tests.functional import base +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestMeter(base.BaseFunctionalTest): def test_list(self): diff --git a/openstack/tests/functional/telemetry/v2/test_resource.py b/openstack/tests/functional/telemetry/v2/test_resource.py index 0fcaf865..0ec768a5 100644 --- a/openstack/tests/functional/telemetry/v2/test_resource.py +++ b/openstack/tests/functional/telemetry/v2/test_resource.py @@ -10,9 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. +import unittest + from openstack.tests.functional import base +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestResource(base.BaseFunctionalTest): def test_list(self): diff --git a/openstack/tests/functional/telemetry/v2/test_sample.py b/openstack/tests/functional/telemetry/v2/test_sample.py index bfe72ae3..3aad42d2 100644 --- a/openstack/tests/functional/telemetry/v2/test_sample.py +++ b/openstack/tests/functional/telemetry/v2/test_sample.py @@ -10,10 +10,14 @@ # License for the specific language governing permissions and limitations # under the License. +import unittest + from openstack.telemetry.v2 import sample from openstack.tests.functional import base +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestSample(base.BaseFunctionalTest): meter = None diff --git a/openstack/tests/functional/telemetry/v2/test_statistics.py b/openstack/tests/functional/telemetry/v2/test_statistics.py index 62a9c978..d0e6c6ab 100644 --- a/openstack/tests/functional/telemetry/v2/test_statistics.py +++ b/openstack/tests/functional/telemetry/v2/test_statistics.py @@ -10,9 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. +import unittest + from openstack.tests.functional import base +@unittest.skipUnless(base.service_exists(service_type="metering"), + "Metering service does not exist") class TestStatistics(base.BaseFunctionalTest): def test_list(self): diff --git a/openstack/tests/unit/test_functional_base.py b/openstack/tests/unit/test_functional_base.py index 4a0b4777..a1dccc02 100644 --- a/openstack/tests/unit/test_functional_base.py +++ b/openstack/tests/unit/test_functional_base.py @@ -13,37 +13,34 @@ import mock import unittest +from keystoneauth1 import exceptions as _exceptions + from openstack.tests.functional import base -class Test_requires_service(unittest.TestCase): +class TestServiceExists(unittest.TestCase): def setUp(self): - super(Test_requires_service, self).setUp() + super(TestServiceExists, self).setUp() - self.return_value = 1 + self.conn = mock.Mock() + self.sess = mock.Mock() + self.conn.session = self.sess self.kwargs = {"service_type": "identity", "version": "v3"} - self.sot = mock.Mock() - self.sot.test_method = lambda *args: self.return_value + @mock.patch('openstack.connection.from_config') + def test_service_exists(self, mock_from_config): + mock_from_config.return_value = self.conn - self.mock_skip = mock.Mock() - self.sot.skip = self.mock_skip + self.sess.get_endpoint = mock.Mock() - self.get_endpoint = mock.Mock() - self.sot.conn.session.get_endpoint = self.get_endpoint + self.assertTrue(base.service_exists(**self.kwargs)) - def _test(self, **kwargs): - decorated = base.requires_service(**kwargs)(self.sot.test_method) - return decorated(self.sot) + @mock.patch('openstack.connection.from_config') + def test_service_doesnt_exist(self, mock_from_config): + mock_from_config.return_value = self.conn - def test_service_exists(self): - self.assertEqual(self.return_value, self._test(**self.kwargs)) - self.get_endpoint.assert_called_with(**self.kwargs) + self.sess.get_endpoint = mock.Mock( + side_effect=_exceptions.EndpointNotFound('')) - def test_service_doesnt_exist(self): - self.get_endpoint.return_value = None - - self._test(**self.kwargs) - self.get_endpoint.assert_called_with(**self.kwargs) - self.assertEqual(self.mock_skip.call_count, 1) + self.assertFalse(base.service_exists(**self.kwargs))