diff options
| author | Eoghan Glynn <eglynn@redhat.com> | 2012-11-16 15:17:52 +0000 |
|---|---|---|
| committer | Eoghan Glynn <eglynn@redhat.com> | 2012-11-19 22:16:48 +0000 |
| commit | 615d76910388d3590ad77e9cfce7ded421b060c0 (patch) | |
| tree | 814a2044fa8bb9082d08f7e932fc9e9e5fd7a480 /tests | |
| parent | ce80aac98a905a07ea7ec093f37243a4c3bbb6e0 (diff) | |
Account for tasks duration in LoopingCall delay
Fixes bug 1079725
Previously the time spent executing tasks was not accounted for
when determining how much time to sleep between task runs.
Now we subtract the duration of the last tasks run from the next
sleep interval.
Change-Id: I4b3e27d4aaa21d020159d46eea40bdd80361cea7
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/unit/test_loopingcall.py | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/tests/unit/test_loopingcall.py b/tests/unit/test_loopingcall.py index 11aa7e3..8307a11 100644 --- a/tests/unit/test_loopingcall.py +++ b/tests/unit/test_loopingcall.py @@ -14,9 +14,14 @@ # License for the specific language governing permissions and limitations # under the License. +import datetime import unittest +from eventlet import greenthread +import mox + from openstack.common import loopingcall +from openstack.common import timeutils class LoopingCallTestCase(unittest.TestCase): @@ -38,15 +43,42 @@ class LoopingCallTestCase(unittest.TestCase): timer = loopingcall.LoopingCall(_raise_it) self.assertFalse(timer.start(interval=0.5).wait()) + def _wait_for_zero(self): + """Called at an interval until num_runs == 0.""" + if self.num_runs == 0: + raise loopingcall.LoopingCallDone(False) + else: + self.num_runs = self.num_runs - 1 + def test_repeat(self): self.num_runs = 2 - def _wait_for_zero(): - """Called at an interval until num_runs == 0.""" - if self.num_runs == 0: - raise loopingcall.LoopingCallDone(False) - else: - self.num_runs = self.num_runs - 1 - - timer = loopingcall.LoopingCall(_wait_for_zero) + timer = loopingcall.LoopingCall(self._wait_for_zero) self.assertFalse(timer.start(interval=0.5).wait()) + + def test_interval_adjustment(self): + """Ensure the interval is adjusted to account for task duration""" + self.num_runs = 3 + + now = datetime.datetime.utcnow() + second = datetime.timedelta(seconds=1) + smidgen = datetime.timedelta(microseconds=10000) + timeoverrides = [now, now + second - smidgen, + now, now + second + second, + now, now + second + smidgen] + + m = mox.Mox() + m.StubOutWithMock(greenthread, 'sleep') + greenthread.sleep(mox.IsAlmost(0.02)) + greenthread.sleep(mox.IsAlmost(0.0)) + greenthread.sleep(mox.IsAlmost(0.0)) + m.ReplayAll() + + try: + timeutils.set_time_override(timeoverrides) + timer = loopingcall.LoopingCall(self._wait_for_zero) + timer.start(interval=1.01).wait() + finally: + timeutils.clear_time_override() + m.UnsetStubs() + m.VerifyAll() |
