blob: 830772a1e8dcb39ce98943647e4492dc4257db3b [file] [log] [blame]
# 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)