summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-08 14:28:54 +0000
committerGerrit Code Review <review@openstack.org>2012-06-08 14:28:54 +0000
commit2d9463709588d88172e125a97200ac813ee79eb4 (patch)
treebe32d79777dfee79a8a364d14dac3db85d90a35c
parent81628868c2ecf3685c9844510430d15b2ad976b7 (diff)
parente67d7775a7a3347c795a5ff3ed8166f850b8598e (diff)
downloadoslo-2d9463709588d88172e125a97200ac813ee79eb4.tar.gz
oslo-2d9463709588d88172e125a97200ac813ee79eb4.tar.xz
oslo-2d9463709588d88172e125a97200ac813ee79eb4.zip
Merge "Add nova time util functions to timeutils"
-rw-r--r--openstack/common/timeutils.py35
-rw-r--r--tests/unit/test_timeutils.py64
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):