From d0e50b8b90fa29db04e0c19ea699f6bc7ae16652 Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Wed, 9 Dec 2015 06:07:50 +0900 Subject: [PATCH] Use six.python_2_unicode_compatible for NeutronException.__str__ The definition of __str__ is different between py2 and py3. __str__ should return a byte stream to make print(exc) work in python2, but __str__ should return string type in python3. six.python_2_unicode_compatible sets up __str__ and __unicode__ approriately. Change-Id: I6c85ca8c4e6f86450ee390db81e3aa101293b846 Related-Bug: #1235228 --- neutronclient/common/exceptions.py | 3 ++ neutronclient/tests/unit/test_exceptions.py | 36 +++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 neutronclient/tests/unit/test_exceptions.py diff --git a/neutronclient/common/exceptions.py b/neutronclient/common/exceptions.py index 95f54f722..400289b32 100644 --- a/neutronclient/common/exceptions.py +++ b/neutronclient/common/exceptions.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import six + from neutronclient._i18n import _ """ @@ -29,6 +31,7 @@ Exceptions are classified into three categories: """ +@six.python_2_unicode_compatible class NeutronException(Exception): """Base Neutron Exception. diff --git a/neutronclient/tests/unit/test_exceptions.py b/neutronclient/tests/unit/test_exceptions.py new file mode 100644 index 000000000..b87be9527 --- /dev/null +++ b/neutronclient/tests/unit/test_exceptions.py @@ -0,0 +1,36 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import fixtures +import testtools + +from neutronclient.common import exceptions +from neutronclient.i18n import _ + + +class TestExceptions(testtools.TestCase): + + def test_exception_print_with_unicode(self): + class TestException(exceptions.NeutronException): + message = _('Exception with %(reason)s') + + multibyte_unicode_string = u'\uff21\uff22\uff23' + e = TestException(reason=multibyte_unicode_string) + + fixture = fixtures.StringStream('stdout') + self.useFixture(fixture) + with fixtures.MonkeyPatch('sys.stdout', fixture.stream): + print(e) + self.assertEqual('Exception with %s' % multibyte_unicode_string, + fixture.getDetails().get('stdout').as_text())