# 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."""

# pylint: disable=protected-access

from __future__ import absolute_import

import contextlib
from unittest import mock

from chromite.lib import cros_test_lib
from chromite.scripts.sysmon import loop


class _MockTime:
    """Mock time and sleep.

    Provides mock behavior for time.time() and time.sleep()
    """

    def __init__(self, sleep_delta):
        """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):
        with _patch_time(sleep_delta=-7) as mock_time:
            loop._force_sleep(10)
        self.assertGreaterEqual(mock_time.current_time, 10)
