sysmon: Add sysmon.loop tests

BUG=chromium:736911
TEST=None

Change-Id: Ifbdabbe974d4044a64a060831697f4449a23714f
Reviewed-on: https://chromium-review.googlesource.com/570634
Commit-Ready: Allen Li <ayatane@chromium.org>
Tested-by: Allen Li <ayatane@chromium.org>
Reviewed-by: Allen Li <ayatane@chromium.org>
diff --git a/scripts/sysmon/loop_unittest.py b/scripts/sysmon/loop_unittest.py
new file mode 100644
index 0000000..7bc4980
--- /dev/null
+++ b/scripts/sysmon/loop_unittest.py
@@ -0,0 +1,63 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# 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
+from __future__ import print_function
+
+import contextlib
+
+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)