50618882d5
safe_utils.getcallargs was written to support python2.6 which did not have inspect.getcallargs. Now that support for python2.6 has been dropped it should be replaced with inspect.getcallargs. Note:The interface that safe_utils.getcallargs provides did not match inspect.getcallargs around the handling of the self parameter needing to be passed in. It should be brought inline with inspect.getcallargs so that it can be dropped. Nova fixed in 2910d75b28afd909af3b4ac392729ac3d5e64b65. Change-Id: I2fbec0cc4d43b2fc424460b176bf26700f05f44a
76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
# Copyright 2011 Justin Santa Barbara
|
|
#
|
|
# 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.
|
|
|
|
from oslo_versionedobjects import exception
|
|
from oslo_versionedobjects import test
|
|
|
|
import mock
|
|
|
|
|
|
notifier = mock.Mock()
|
|
|
|
|
|
class TestWrapper(object):
|
|
@exception.wrap_exception(notifier=notifier)
|
|
def raise_exc(self, context, exc, admin_password):
|
|
raise exc
|
|
|
|
|
|
class ExceptionTestCase(test.TestCase):
|
|
def test_wrap_exception_wrapped(self):
|
|
test = TestWrapper()
|
|
# Ensure that the original function is available in
|
|
# the __wrapped__ attribute
|
|
self.assertTrue(hasattr(test.raise_exc, '__wrapped__'))
|
|
|
|
def test_wrap_exception(self):
|
|
context = "context"
|
|
exc = ValueError()
|
|
|
|
test = TestWrapper()
|
|
notifier.reset_mock()
|
|
|
|
# wrap_exception() must reraise the exception
|
|
self.assertRaises(ValueError,
|
|
test.raise_exc, context, exc, admin_password="xxx")
|
|
|
|
# wrap_exception() strips admin_password from args
|
|
payload = {'args': {'self': test, 'context': context, 'exc': exc},
|
|
'exception': exc}
|
|
notifier.error.assert_called_once_with(context, 'raise_exc', payload)
|
|
|
|
def test_vo_exception(self):
|
|
exc = exception.VersionedObjectsException()
|
|
self.assertEqual('An unknown exception occurred.', str(exc))
|
|
self.assertEqual({'code': 500}, exc.kwargs)
|
|
|
|
def test_object_action_error(self):
|
|
exc = exception.ObjectActionError(action='ACTION', reason='REASON',
|
|
code=123)
|
|
self.assertEqual('Object action ACTION failed because: REASON',
|
|
str(exc))
|
|
self.assertEqual({'code': 123, 'action': 'ACTION', 'reason': 'REASON'},
|
|
exc.kwargs)
|
|
|
|
def test_constructor_format_error(self):
|
|
# Test error handling on formatting exception message in the
|
|
# VersionedObjectsException constructor
|
|
with mock.patch.object(exception, 'LOG') as log:
|
|
exc = exception.ObjectActionError()
|
|
|
|
log.error.assert_called_with('code: 500')
|
|
|
|
# Formatting failed: the message is the original format string
|
|
self.assertEqual(exception.ObjectActionError.msg_fmt, str(exc))
|