| # Copyright 2017 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unit tests for loop.""" |
| |
| import contextlib |
| from unittest import mock |
| |
| from chromite.lib import cros_test_lib |
| from chromite.scripts.sysmon import loop |
| |
| |
| # pylint: disable=protected-access |
| |
| |
| class _MockTime: |
| """Mock time and sleep. |
| |
| Provides mock behavior for time.time() and time.sleep() |
| """ |
| |
| def __init__(self, sleep_delta) -> None: |
| """Instantiate instance. |
| |
| Args: |
| sleep_delta: Modify sleep time by this many seconds. But sleep will |
| always be at least 1. |
| """ |
| self.current_time = 0 |
| self._sleep_delta = sleep_delta |
| |
| def time(self): |
| return self.current_time |
| |
| def sleep(self, secs): |
| actual_sleep = max(secs + self._sleep_delta, 1) |
| self.current_time += actual_sleep |
| return actual_sleep |
| |
| |
| @contextlib.contextmanager |
| def _patch_time(sleep_delta): |
| """Mock out time and sleep. |
| |
| Patches behavior for time.time() and time.sleep() |
| """ |
| mock_time = _MockTime(sleep_delta) |
| with mock.patch("time.time", mock_time.time), mock.patch( |
| "time.sleep", mock_time.sleep |
| ): |
| yield mock_time |
| |
| |
| class TestForceSleep(cros_test_lib.TestCase): |
| """Tests for _force_sleep.""" |
| |
| def test__force_sleep_at_least_given_secs(self) -> None: |
| with _patch_time(sleep_delta=-7) as mock_time: |
| loop._force_sleep(10) |
| self.assertGreaterEqual(mock_time.current_time, 10) |