Add Timer to rally.utils

This is small and pretty class for with statement that measure time.

Example of usage:

with Timer() as timer:
	#do some dirty stuff
time_in_seconds = timer.duration()

It will be used at least by our Test engine.

Change-Id: I3bf0075df807c2118d5872dd425aae0061232133
This commit is contained in:
Boris Pavlovic 2013-10-03 02:26:53 +04:00
parent 04f42b867a
commit d3473afc19
2 changed files with 43 additions and 0 deletions

View File

@ -20,6 +20,7 @@ import os
import StringIO
import sys
import time
import traceback
from rally import exceptions
from rally.openstack.common.gettextutils import _ # noqa
@ -69,6 +70,22 @@ class StdErrCapture(object):
sys.stderr = self.stderr
class Timer(object):
def __enter__(self):
self.error = None
self.start = time.time()
return self
def __exit__(self, type, value, tb):
self.finish = time.time()
if type:
tb = traceback.print_exception(type, value, tb)
self.error = (type, value, tb)
def duration(self):
return self.finish - self.start
def itersubclasses(cls, _seen=None):
"""Generator over all subclasses of a given class in depth first order."""

View File

@ -20,7 +20,9 @@
from __future__ import print_function
import datetime
import mock
import sys
import time
from rally import exceptions
from rally import test
@ -82,6 +84,30 @@ class StdIOCaptureTestCase(test.NoDBTestCase):
self.assertEqual(stderr, sys.stderr)
class TimerTestCase(test.NoDBTestCase):
def test_timer_duration(self):
start_time = time.time()
end_time = time.time()
with mock.patch('rally.utils.time') as mock_time:
mock_time.time = mock.MagicMock(return_value=start_time)
with utils.Timer() as timer:
mock_time.time = mock.MagicMock(return_value=end_time)
self.assertIsNone(timer.error)
self.assertEqual(end_time - start_time, timer.duration())
def test_timer_exception(self):
try:
with utils.Timer() as timer:
raise Exception()
except Exception:
pass
self.assertEqual(3, len(timer.error))
self.assertEqual(timer.error[0], type(Exception()))
class IterSubclassesTestCase(test.NoDBTestCase):
def test_itersubclasses(self):