# 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(object):
    """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)
