blob: 83d3e4438834a206c402edd2d2b358b6c1968e8b [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for mock_time_utils module."""
from __future__ import print_function
import Queue
import threading
import unittest
import mock
import factory_common # pylint: disable=unused-import
from cros.factory.unittest_utils import mock_time_utils
from cros.factory.utils import type_utils
class TimeLineTest(unittest.TestCase):
def setUp(self):
self._timeline = mock_time_utils.TimeLine()
def AssertTime(self, t):
self.assertEqual(t, self._timeline.GetTime())
def testAdvanceTime(self):
self.AssertTime(0)
self._timeline.AdvanceTime(10)
self.AssertTime(10)
def testAddEvent(self):
handler1 = mock.Mock()
self._timeline.AddEvent(10, handler1)
handler2 = mock.Mock()
self._timeline.AddEvent(20, handler2)
self._timeline.AdvanceTime(6)
self.AssertTime(6)
handler1.assert_not_called()
handler2.assert_not_called()
self._timeline.AdvanceTime(6)
self.AssertTime(12)
handler1.assert_called_once()
handler2.assert_not_called()
self._timeline.AdvanceTime(6)
self.AssertTime(18)
handler1.assert_called_once()
handler2.assert_not_called()
self._timeline.AdvanceTime(6)
self.AssertTime(24)
handler1.assert_called_once()
handler2.assert_called_once()
def testAdvanceTimeCondition(self):
event = threading.Event()
self._timeline.AddEvent(5, event.set)
self._timeline.AdvanceTime(3, condition=event.isSet)
self.AssertTime(3)
self.assertFalse(event.isSet())
self._timeline.AdvanceTime(3, condition=event.isSet)
self.AssertTime(5)
self.assertTrue(event.isSet())
def testAdvanceTimeConditionNoTimeout(self):
event = threading.Event()
self._timeline.AddEvent(5, event.set)
self._timeline.AdvanceTime(None, condition=event.isSet)
self.AssertTime(5)
self.assertTrue(event.isSet())
def testAdvanceTimeNoEvent(self):
self.assertRaises(
type_utils.TimeoutError,
self._timeline.AdvanceTime,
None,
condition=lambda: False)
class FakeEventTest(TimeLineTest):
def setUp(self):
super(FakeEventTest, self).setUp()
self._event = mock_time_utils.FakeEvent(self._timeline)
def testWait(self):
self._timeline.AddEvent(5, self._event.set)
self.assertTrue(self._event.wait(timeout=10))
self.AssertTime(5)
def testWaitTimeout(self):
self._timeline.AddEvent(5, self._event.set)
self.assertFalse(self._event.wait(timeout=3))
self.AssertTime(3)
def testWaitBlocking(self):
self._timeline.AddEvent(5, self._event.set)
self.assertTrue(self._event.wait())
self.AssertTime(5)
def testWaitAlreadySet(self):
self._timeline.AddEvent(3, self._event.set)
self._timeline.AdvanceTime(5)
self.assertTrue(self._event.wait(timeout=3))
self.AssertTime(5)
class FakeQueueTest(TimeLineTest):
def setUp(self):
super(FakeQueueTest, self).setUp()
self._queue = mock_time_utils.FakeQueue(self._timeline)
def testGet(self):
self._timeline.AddEvent(5, lambda: self._queue.put('foo'))
self.assertEqual('foo', self._queue.get(timeout=10))
self.AssertTime(5)
def testGetTimeout(self):
self._timeline.AddEvent(5, lambda: self._queue.put('foo'))
self.assertRaises(Queue.Empty, self._queue.get, timeout=3)
self.AssertTime(3)
def testGetBlocking(self):
self._timeline.AddEvent(5, lambda: self._queue.put('foo'))
self.assertEqual('foo', self._queue.get())
self.AssertTime(5)
def testGetNotEmpty(self):
self._timeline.AddEvent(3, lambda: self._queue.put('foo'))
self._timeline.AdvanceTime(5)
self.assertEqual('foo', self._queue.get(timeout=3))
self.AssertTime(5)
def testGetMultiple(self):
self._timeline.AddEvent(3, lambda: self._queue.put('foo1'))
self._timeline.AddEvent(6, lambda: self._queue.put('foo2'))
self._timeline.AddEvent(9, lambda: self._queue.put('foo3'))
self._timeline.AddEvent(12, lambda: self._queue.put('foo4'))
self.assertEqual('foo1', self._queue.get(timeout=5))
self.AssertTime(3)
self.assertRaises(Queue.Empty, self._queue.get, timeout=2)
self.AssertTime(5)
self.assertEqual('foo2', self._queue.get(timeout=2))
self.AssertTime(6)
self.assertEqual('foo3', self._queue.get(timeout=10))
self.AssertTime(9)
self.assertEqual('foo4', self._queue.get())
self.AssertTime(12)
self.assertRaises(Queue.Empty, self._queue.get, timeout=10)
self.AssertTime(22)
if __name__ == '__main__':
unittest.main()