blob: ab8001de50b2779ba4f4f7c16d5ea6cf120edaf4 [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Allen Lic54362d2017-07-12 18:21:26 -07002# Copyright 2017 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Unit tests for loop."""
7
8# pylint: disable=protected-access
9
10from __future__ import absolute_import
11from __future__ import print_function
12
13import contextlib
14
15import mock
16
17from chromite.lib import cros_test_lib
18from chromite.scripts.sysmon import loop
19
20
21class _MockTime(object):
22 """Mock time and sleep.
23
24 Provides mock behavior for time.time() and time.sleep()
25 """
26
27 def __init__(self, sleep_delta):
28 """Instantiate instance.
29
30 Args:
31 sleep_delta: Modify sleep time by this many seconds.
32 But sleep will always be at least 1.
33 """
34 self.current_time = 0
35 self._sleep_delta = sleep_delta
36
37 def time(self):
38 return self.current_time
39
40 def sleep(self, secs):
41 actual_sleep = max(secs + self._sleep_delta, 1)
42 self.current_time += actual_sleep
43 return actual_sleep
44
45
46@contextlib.contextmanager
47def _patch_time(sleep_delta):
48 """Mock out time and sleep.
49
50 Patches behavior for time.time() and time.sleep()
51 """
52 mock_time = _MockTime(sleep_delta)
53 with mock.patch('time.time', mock_time.time), \
54 mock.patch('time.sleep', mock_time.sleep):
55 yield mock_time
56
57
58class TestForceSleep(cros_test_lib.TestCase):
59 """Tests for _force_sleep."""
60
61 def test__force_sleep_at_least_given_secs(self):
62 with _patch_time(sleep_delta=-7) as mock_time:
63 loop._force_sleep(10)
64 self.assertGreaterEqual(mock_time.current_time, 10)