diff options
| author | Zhongyue Luo <lzyeval@gmail.com> | 2012-06-06 17:51:07 +0800 |
|---|---|---|
| committer | Zhongyue Luo <lzyeval@gmail.com> | 2012-06-06 21:33:01 +0800 |
| commit | e67d7775a7a3347c795a5ff3ed8166f850b8598e (patch) | |
| tree | 40200e63126477e7e2e46488dc596d8205db3565 | |
| parent | c1f45745e240f9cc0d4e6522a71a895471aa94b3 (diff) | |
| download | oslo-e67d7775a7a3347c795a5ff3ed8166f850b8598e.tar.gz oslo-e67d7775a7a3347c795a5ff3ed8166f850b8598e.tar.xz oslo-e67d7775a7a3347c795a5ff3ed8166f850b8598e.zip | |
Add nova time util functions to timeutils
Fixes bug #1009410
1. Add the following functions from nova/utils.py
- strtime
- parse_strtime
- is_older_than
- utcnow_ts
- advance_time_delta
- advance_time_seconds
2. Write unittests in tests/unit/test_timeutils.py
Change-Id: Ie0bba90833e2ed31bb5ab867a7c1a76a9901cacb
| -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): |
