Add tracing unit tests
This patch adds some unit tests for the tracing facility. Change-Id: Ib18ec5751f74ae2d34c002b191785d51c285e16a
This commit is contained in:
@@ -97,6 +97,13 @@ class TestCase(testtools.TestCase):
|
|||||||
self.addCleanup(patcher.stop)
|
self.addCleanup(patcher.stop)
|
||||||
return mocked
|
return mocked
|
||||||
|
|
||||||
|
def patch(self, path, *args, **kwargs):
|
||||||
|
"""Use python mock to mock a path with automatic cleanup."""
|
||||||
|
patcher = mock.patch(path, *args, **kwargs)
|
||||||
|
result = patcher.start()
|
||||||
|
self.addCleanup(patcher.stop)
|
||||||
|
return result
|
||||||
|
|
||||||
# Useful assertions
|
# Useful assertions
|
||||||
def assertDictMatch(self, d1, d2, approx_equal=False, tolerance=0.001):
|
def assertDictMatch(self, d1, d2, approx_equal=False, tolerance=0.001):
|
||||||
"""Assert two dicts are equivalent.
|
"""Assert two dicts are equivalent.
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import functools
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
@@ -106,3 +107,127 @@ class TestRetryDecorator(base.TestCase):
|
|||||||
|
|
||||||
self.assertRaises(WrongException, raise_unexpected_error)
|
self.assertRaises(WrongException, raise_unexpected_error)
|
||||||
self.assertFalse(mock_sleep.called)
|
self.assertFalse(mock_sleep.called)
|
||||||
|
|
||||||
|
|
||||||
|
class LogTracingTestCase(base.TestCase):
|
||||||
|
"""Test out the log tracing."""
|
||||||
|
|
||||||
|
def test_utils_trace_method_default_logger(self):
|
||||||
|
mock_log = self.mock_object(utils, 'LOG')
|
||||||
|
|
||||||
|
@utils.trace
|
||||||
|
def _trace_test_method_custom_logger(*args, **kwargs):
|
||||||
|
return 'OK'
|
||||||
|
|
||||||
|
result = _trace_test_method_custom_logger()
|
||||||
|
|
||||||
|
self.assertEqual('OK', result)
|
||||||
|
self.assertEqual(2, mock_log.debug.call_count)
|
||||||
|
|
||||||
|
def test_utils_trace_method_inner_decorator(self):
|
||||||
|
mock_logging = self.mock_object(utils, 'logging')
|
||||||
|
mock_log = mock.Mock()
|
||||||
|
mock_log.isEnabledFor = lambda x: True
|
||||||
|
mock_logging.getLogger = mock.Mock(return_value=mock_log)
|
||||||
|
|
||||||
|
def _test_decorator(f):
|
||||||
|
def blah(*args, **kwargs):
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
return blah
|
||||||
|
|
||||||
|
@_test_decorator
|
||||||
|
@utils.trace
|
||||||
|
def _trace_test_method(*args, **kwargs):
|
||||||
|
return 'OK'
|
||||||
|
|
||||||
|
result = _trace_test_method(self)
|
||||||
|
|
||||||
|
self.assertEqual('OK', result)
|
||||||
|
self.assertEqual(2, mock_log.debug.call_count)
|
||||||
|
# Ensure the correct function name was logged
|
||||||
|
for call in mock_log.debug.call_args_list:
|
||||||
|
self.assertIn('_trace_test_method', str(call))
|
||||||
|
self.assertNotIn('blah', str(call))
|
||||||
|
|
||||||
|
def test_utils_trace_method_outer_decorator(self):
|
||||||
|
mock_logging = self.mock_object(utils, 'logging')
|
||||||
|
mock_log = mock.Mock()
|
||||||
|
mock_log.isEnabledFor = lambda x: True
|
||||||
|
mock_logging.getLogger = mock.Mock(return_value=mock_log)
|
||||||
|
|
||||||
|
def _test_decorator(f):
|
||||||
|
def blah(*args, **kwargs):
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
return blah
|
||||||
|
|
||||||
|
@utils.trace
|
||||||
|
@_test_decorator
|
||||||
|
def _trace_test_method(*args, **kwargs):
|
||||||
|
return 'OK'
|
||||||
|
|
||||||
|
result = _trace_test_method(self)
|
||||||
|
|
||||||
|
self.assertEqual('OK', result)
|
||||||
|
self.assertEqual(2, mock_log.debug.call_count)
|
||||||
|
# Ensure the incorrect function name was logged
|
||||||
|
for call in mock_log.debug.call_args_list:
|
||||||
|
self.assertNotIn('_trace_test_method', str(call))
|
||||||
|
self.assertIn('blah', str(call))
|
||||||
|
|
||||||
|
def test_utils_trace_method_outer_decorator_with_functools(self):
|
||||||
|
mock_log = mock.Mock()
|
||||||
|
mock_log.isEnabledFor = lambda x: True
|
||||||
|
self.mock_object(utils.logging, 'getLogger', mock_log)
|
||||||
|
mock_log = self.mock_object(utils, 'LOG')
|
||||||
|
|
||||||
|
def _test_decorator(f):
|
||||||
|
@functools.wraps(f)
|
||||||
|
def wraps(*args, **kwargs):
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
return wraps
|
||||||
|
|
||||||
|
@utils.trace
|
||||||
|
@_test_decorator
|
||||||
|
def _trace_test_method(*args, **kwargs):
|
||||||
|
return 'OK'
|
||||||
|
|
||||||
|
result = _trace_test_method()
|
||||||
|
|
||||||
|
self.assertEqual('OK', result)
|
||||||
|
self.assertEqual(2, mock_log.debug.call_count)
|
||||||
|
# Ensure the incorrect function name was logged
|
||||||
|
for call in mock_log.debug.call_args_list:
|
||||||
|
self.assertIn('_trace_test_method', str(call))
|
||||||
|
self.assertNotIn('wraps', str(call))
|
||||||
|
|
||||||
|
def test_utils_trace_method_with_exception(self):
|
||||||
|
self.LOG = self.mock_object(utils, 'LOG')
|
||||||
|
|
||||||
|
@utils.trace
|
||||||
|
def _trace_test_method(*args, **kwargs):
|
||||||
|
raise exception.VolumeDeviceNotFound('test message')
|
||||||
|
|
||||||
|
self.assertRaises(exception.VolumeDeviceNotFound, _trace_test_method)
|
||||||
|
|
||||||
|
exception_log = self.LOG.debug.call_args_list[1]
|
||||||
|
self.assertIn('exception', str(exception_log))
|
||||||
|
self.assertIn('test message', str(exception_log))
|
||||||
|
|
||||||
|
def test_utils_trace_method_with_time(self):
|
||||||
|
mock_logging = self.mock_object(utils, 'logging')
|
||||||
|
mock_log = mock.Mock()
|
||||||
|
mock_log.isEnabledFor = lambda x: True
|
||||||
|
mock_logging.getLogger = mock.Mock(return_value=mock_log)
|
||||||
|
|
||||||
|
mock_time = mock.Mock(side_effect=[3.1, 6])
|
||||||
|
self.mock_object(time, 'time', mock_time)
|
||||||
|
|
||||||
|
@utils.trace
|
||||||
|
def _trace_test_method(*args, **kwargs):
|
||||||
|
return 'OK'
|
||||||
|
|
||||||
|
result = _trace_test_method(self)
|
||||||
|
|
||||||
|
self.assertEqual('OK', result)
|
||||||
|
return_log = mock_log.debug.call_args_list[1]
|
||||||
|
self.assertIn('2900', str(return_log))
|
||||||
|
Reference in New Issue
Block a user