diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-06-08 14:28:54 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-06-08 14:28:54 +0000 |
| commit | 2d9463709588d88172e125a97200ac813ee79eb4 (patch) | |
| tree | be32d79777dfee79a8a364d14dac3db85d90a35c | |
| parent | 81628868c2ecf3685c9844510430d15b2ad976b7 (diff) | |
| parent | e67d7775a7a3347c795a5ff3ed8166f850b8598e (diff) | |
| download | oslo-2d9463709588d88172e125a97200ac813ee79eb4.tar.gz oslo-2d9463709588d88172e125a97200ac813ee79eb4.tar.xz oslo-2d9463709588d88172e125a97200ac813ee79eb4.zip | |
Merge "Add nova time util functions to timeutils"
| -rw-r--r-- | openstack/common/timeutils.py | 35 | ||||
| -rw-r--r-- | tests/unit/test_timeutils.py | 64 |
2 files changed, 89 insertions, 10 deletions
diff --git a/openstack/common/timeutils.py b/openstack/common/timeutils.py index 345f315..a7b2ce3 100644 --- a/openstack/common/timeutils.py +++ b/openstack/common/timeutils.py @@ -20,11 +20,13 @@ Time related utilities and helper functions. """ import datetime +import time import iso8601 TIME_FORMAT = "%Y-%m-%dT%H:%M:%S" +PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" def isotime(at=None): @@ -47,12 +49,34 @@ def parse_isotime(timestr): raise ValueError(e.message) +def strtime(at=None, fmt=PERFECT_TIME_FORMAT): + """Returns formatted utcnow.""" + if not at: + at = utcnow() + return at.strftime(fmt) + + +def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT): + """Turn a formatted time back into a datetime.""" + return datetime.datetime.strptime(timestr, fmt) + + def normalize_time(timestamp): """Normalize time in arbitrary timezone to UTC""" offset = timestamp.utcoffset() return timestamp.replace(tzinfo=None) - offset if offset else timestamp +def is_older_than(before, seconds): + """Return True if before is older than seconds.""" + return utcnow() - before > datetime.timedelta(seconds=seconds) + + +def utcnow_ts(): + """Timestamp version of our utcnow function.""" + return time.mktime(utcnow().timetuple()) + + def utcnow(): """Overridable version of utils.utcnow.""" if utcnow.override_time: @@ -68,6 +92,17 @@ def set_time_override(override_time=datetime.datetime.utcnow()): utcnow.override_time = override_time +def advance_time_delta(timedelta): + """Advance overriden time using a datetime.timedelta.""" + assert(not utcnow.override_time is None) + utcnow.override_time += timedelta + + +def advance_time_seconds(seconds): + """Advance overriden time by seconds.""" + advance_time_delta(datetime.timedelta(0, seconds)) + + def clear_time_override(): """Remove the overridden time.""" utcnow.override_time = None diff --git a/tests/unit/test_timeutils.py b/tests/unit/test_timeutils.py index 59a5032..ba68235 100644 --- a/tests/unit/test_timeutils.py +++ b/tests/unit/test_timeutils.py @@ -26,21 +26,55 @@ from openstack.common import timeutils class TimeUtilsTest(unittest.TestCase): - def test_isotime(self): - skynet_self_aware_time_str = '1997-08-29T06:14:00Z' - skynet_self_aware_time = datetime.datetime(1997, 8, 29, 6, 14, 0, + def setUp(self): + utc_timezone = iso8601.iso8601.UTC + self.skynet_self_aware_time_str = '1997-08-29T06:14:00Z' + self.skynet_self_aware_time = datetime.datetime(1997, 8, 29, 6, 14, 0, + tzinfo=utc_timezone) + self.one_minute_before = datetime.datetime(1997, 8, 29, 6, 13, 0, tzinfo=iso8601.iso8601.UTC) + self.skynet_self_aware_time_perfect_str = '1997-08-29T06:14:00.000000' + self.skynet_self_aware_time_perfect = datetime.datetime(1997, 8, 29, + 6, 14, 0) + + def tearDown(self): + timeutils.clear_time_override() + + def test_isotime(self): with mock.patch('datetime.datetime') as datetime_mock: - datetime_mock.utcnow.return_value = skynet_self_aware_time + datetime_mock.utcnow.return_value = self.skynet_self_aware_time dt = timeutils.isotime() - self.assertEqual(dt, skynet_self_aware_time_str) + self.assertEqual(dt, self.skynet_self_aware_time_str) def test_parse_isotime(self): - skynet_self_aware_time_str = '1997-08-29T06:14:00Z' - skynet_self_aware_time = datetime.datetime(1997, 8, 29, 6, 14, 0, - tzinfo=iso8601.iso8601.UTC) - self.assertEqual(skynet_self_aware_time, - timeutils.parse_isotime(skynet_self_aware_time_str)) + expect = timeutils.parse_isotime(self.skynet_self_aware_time_str) + self.assertEqual(self.skynet_self_aware_time, expect) + + def test_strtime(self): + expect = timeutils.strtime(self.skynet_self_aware_time_perfect) + self.assertEqual(self.skynet_self_aware_time_perfect_str, expect) + + def test_parse_strtime(self): + perfect_time_format = self.skynet_self_aware_time_perfect_str + expect = timeutils.parse_strtime(perfect_time_format) + self.assertEqual(self.skynet_self_aware_time_perfect, expect) + + def test_is_older_than(self): + with mock.patch('datetime.datetime') as datetime_mock: + datetime_mock.utcnow.return_value = self.skynet_self_aware_time + expect_true = timeutils.is_older_than(self.one_minute_before, 59) + self.assertTrue(expect_true) + expect_false = timeutils.is_older_than(self.one_minute_before, 60) + self.assertFalse(expect_false) + expect_false = timeutils.is_older_than(self.one_minute_before, 61) + self.assertFalse(expect_false) + + def test_utcnow_ts(self): + skynet_self_aware_timestamp = 872806440.0 + with mock.patch('datetime.datetime') as datetime_mock: + datetime_mock.utcnow.return_value = self.skynet_self_aware_time + ts = timeutils.utcnow_ts() + self.assertEqual(ts, skynet_self_aware_timestamp) def test_utcnow(self): timeutils.set_time_override(mock.sentinel.utcnow) @@ -51,6 +85,16 @@ class TimeUtilsTest(unittest.TestCase): self.assertTrue(timeutils.utcnow()) + def test_advance_time_delta(self): + timeutils.set_time_override(self.one_minute_before) + timeutils.advance_time_delta(datetime.timedelta(seconds=60)) + self.assertEqual(timeutils.utcnow(), self.skynet_self_aware_time) + + def test_advance_time_seconds(self): + timeutils.set_time_override(self.one_minute_before) + timeutils.advance_time_seconds(60) + self.assertEqual(timeutils.utcnow(), self.skynet_self_aware_time) + class TestIso8601Time(unittest.TestCase): |
