From bc2ae8629c3e8eaa72112c8146339320045ba948 Mon Sep 17 00:00:00 2001 From: junboli Date: Sat, 29 Jul 2017 15:46:48 +0800 Subject: [PATCH] Unsupported 'message' Exception attribute in PY3 * Fix unsupported 'message' Exception attribute in PY3 The 'message' attribute has been deprecated and removed from Python3. Use six.text_type(e) instead of e.message. For more details, please check [1]: [1] https://www.python.org/dev/peps/pep-0352/ * Add hacking to prevent this from happening in the future. Change-Id: Id40000c2c453815b04a7d2fd765e19997291d8e3 --- HACKING.rst | 1 + .../api/compute/servers/test_attach_interfaces.py | 4 +++- tempest/hacking/checks.py | 13 +++++++++++++ tempest/tests/lib/common/test_api_version_utils.py | 3 ++- tempest/tests/test_hacking.py | 12 ++++++++++++ tempest/tests/test_microversions.py | 3 ++- 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/HACKING.rst b/HACKING.rst index e5f45ac1b9..446d865665 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -24,6 +24,7 @@ Tempest Specific Commandments - [T114] Check that tempest.lib does not use tempest config - [T115] Check that admin tests should exist under admin path - [N322] Method's default argument shouldn't be mutable +- [T116] Unsupported 'message' Exception attribute in PY3 Test Data/Configuration ----------------------- diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py index 65d5042b54..bfde847663 100644 --- a/tempest/api/compute/servers/test_attach_interfaces.py +++ b/tempest/api/compute/servers/test_attach_interfaces.py @@ -15,6 +15,8 @@ import time +import six + from tempest.api.compute import base from tempest.common import compute from tempest.common.utils import net_utils @@ -195,7 +197,7 @@ class AttachInterfacesTestJSON(base.BaseV2ComputeTest): except lib_exc.BadRequest as e: msg = ('Multiple possible networks found, use a Network ID to be ' 'more specific.') - if not CONF.compute.fixed_network_name and e.message == msg: + if not CONF.compute.fixed_network_name and six.text_type(e) == msg: raise else: ifs.append(iface) diff --git a/tempest/hacking/checks.py b/tempest/hacking/checks.py index 067da09a55..aae685cb59 100644 --- a/tempest/hacking/checks.py +++ b/tempest/hacking/checks.py @@ -33,6 +33,7 @@ METHOD = re.compile(r"^ def .+") METHOD_GET_RESOURCE = re.compile(r"^\s*def (list|show)\_.+") METHOD_DELETE_RESOURCE = re.compile(r"^\s*def delete_.+") CLASS = re.compile(r"^class .+") +EX_ATTRIBUTE = re.compile(r'(\s+|\()(e|ex|exc|exception).message(\s+|\))') def import_no_clients_in_api_and_scenario_tests(physical_line, filename): @@ -294,6 +295,17 @@ def dont_put_admin_tests_on_nonadmin_path(logical_line, physical_line, yield(0, msg) +def unsupported_exception_attribute_PY3(logical_line): + """Check Unsupported 'message' exception attribute in PY3 + + T116 + """ + result = EX_ATTRIBUTE.search(logical_line) + msg = ("[T116] Unsupported 'message' Exception attribute in PY3") + if result: + yield(0, msg) + + def factory(register): register(import_no_clients_in_api_and_scenario_tests) register(scenario_tests_need_service_tags) @@ -309,3 +321,4 @@ def factory(register): register(dont_use_config_in_tempest_lib) register(use_rand_uuid_instead_of_uuid4) register(dont_put_admin_tests_on_nonadmin_path) + register(unsupported_exception_attribute_PY3) diff --git a/tempest/tests/lib/common/test_api_version_utils.py b/tempest/tests/lib/common/test_api_version_utils.py index 6206379d30..c063556f80 100644 --- a/tempest/tests/lib/common/test_api_version_utils.py +++ b/tempest/tests/lib/common/test_api_version_utils.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import six import testtools from tempest.lib.common import api_version_utils @@ -30,7 +31,7 @@ class TestVersionSkipLogic(base.TestCase): cfg_max_version) except testtools.TestCase.skipException as e: if not expected_skip: - raise testtools.TestCase.failureException(e.message) + raise testtools.TestCase.failureException(six.text_type(e)) def test_version_min_in_range(self): self._test_version('2.2', '2.10', '2.1', '2.7') diff --git a/tempest/tests/test_hacking.py b/tempest/tests/test_hacking.py index f005c219fb..c04d933cd9 100644 --- a/tempest/tests/test_hacking.py +++ b/tempest/tests/test_hacking.py @@ -180,3 +180,15 @@ class HackingTestCase(base.TestCase): 'from oslo_config import cfg', './tempest/lib/decorators.py'))) self.assertTrue(list(checks.dont_use_config_in_tempest_lib( 'import tempest.config', './tempest/lib/common/rest_client.py'))) + + def test_unsupported_exception_attribute_PY3(self): + self.assertEqual(len(list(checks.unsupported_exception_attribute_PY3( + "raise TestCase.failureException(e.message)"))), 1) + self.assertEqual(len(list(checks.unsupported_exception_attribute_PY3( + "raise TestCase.failureException(ex.message)"))), 1) + self.assertEqual(len(list(checks.unsupported_exception_attribute_PY3( + "raise TestCase.failureException(exc.message)"))), 1) + self.assertEqual(len(list(checks.unsupported_exception_attribute_PY3( + "raise TestCase.failureException(exception.message)"))), 1) + self.assertEqual(len(list(checks.unsupported_exception_attribute_PY3( + "raise TestCase.failureException(ee.message)"))), 0) diff --git a/tempest/tests/test_microversions.py b/tempest/tests/test_microversions.py index 173accbd5b..ee6db71026 100644 --- a/tempest/tests/test_microversions.py +++ b/tempest/tests/test_microversions.py @@ -13,6 +13,7 @@ # under the License. from oslo_config import cfg +import six import testtools from tempest.api.compute import base as compute_base @@ -74,7 +75,7 @@ class TestMicroversionsTestsClass(base.TestCase): self.assertRaises(testtools.TestCase.skipException, test_class.skip_checks) except testtools.TestCase.skipException as e: - raise testtools.TestCase.failureException(e.message) + raise testtools.TestCase.failureException(six.text_type(e)) def test_config_version_none_none(self): expected_pass_tests = [VersionTestNoneTolatest, VersionTestNoneTo2_2]