From 11eab418ed931f19c366f6b6b03f453603805136 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Fri, 21 Sep 2018 14:21:33 +0200 Subject: [PATCH] improve exc handling and tests --- boswatch/network/client.py | 3 +-- boswatch/network/server.py | 4 +++- boswatch/utils/timer.py | 28 ++++++++++++++++++++-------- test/test_timer.py | 15 +++++++++++---- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/boswatch/network/client.py b/boswatch/network/client.py index c0eac72..a8604da 100644 --- a/boswatch/network/client.py +++ b/boswatch/network/client.py @@ -26,8 +26,7 @@ class TCPClient: def __init__(self, timeout=3): """!Create a new instance - Create a new instance of an TCP Client. - And set the timeout""" + @param timeout: timout for the client in sec. (3)""" try: self._sock = None self._timeout = timeout diff --git a/boswatch/network/server.py b/boswatch/network/server.py index f3a4be0..27df38c 100644 --- a/boswatch/network/server.py +++ b/boswatch/network/server.py @@ -75,7 +75,9 @@ class TCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): """!TCP server class""" def __init__(self, timeout=3): - """!Create a new instance""" + """!Create a new instance + + @param timeout: timeout for the server in sec. (3)""" self._server = None self._server_thread = None self._timeout = timeout diff --git a/boswatch/utils/timer.py b/boswatch/utils/timer.py index 64cf379..0416035 100644 --- a/boswatch/utils/timer.py +++ b/boswatch/utils/timer.py @@ -36,17 +36,24 @@ class RepeatedTimer: self._args = args self._kwargs = kwargs self._start = 0 + self._overdueCount = 0 self._event = Event() self._thread = None def start(self): - """!Start a new timer worker thread""" - self._event.clear() - self._thread = Thread(target=self._target) - self._thread.name = "RepTim(" + str(self._interval) + ")" - self._thread.start() - logging.debug("start repeatedTimer: %s", self._thread.name) - return True + """!Start a new timer worker thread + + @return True or False""" + try: + self._event.clear() + self._thread = Thread(target=self._target) + self._thread.name = "RepTim(" + str(self._interval) + ")" + self._thread.start() + logging.debug("start repeatedTimer: %s", self._thread.name) + return True + except: + logging.exception("cannot start timer worker thread") + return False def stop(self): """!Stop the timer worker thread @@ -78,8 +85,13 @@ class RepeatedTimer: logging.debug("ready after: %0.3f sec. - next call in: %0.3f sec.", runTime, self.restTime) else: logging.warning("timer overdue! interval: %0.3f sec. - runtime: %0.3f sec.", self._interval, runTime) - + self._overdueCount += 1 @property def restTime(self): """!Property to get remaining time till next call""" return self._interval - ((time.time() - self._start) % self._interval) + + @property + def overdueCount(self): + """!Property to get a count over all iverdues""" + return self._overdueCount diff --git a/test/test_timer.py b/test/test_timer.py index 29161ed..4c8b3c6 100644 --- a/test/test_timer.py +++ b/test/test_timer.py @@ -20,6 +20,7 @@ import pytest from boswatch.utils.timer import RepeatedTimer +# todo add more tests to overlap all testcases class Test_Timer: """!Unittest for the timer class""" @@ -28,15 +29,21 @@ class Test_Timer: logging.debug("[TEST] %s.%s", type(self).__name__, method.__name__) @staticmethod - def testTarget(): - logging.debug("run testTarget") + def testTargetFast(): + logging.debug("run testTargetFast") + + @staticmethod + def testTargetSlow(): + logging.debug("run testTargetSlow start") + time.sleep(1) + logging.debug("run testTargetSlow end") @pytest.fixture(scope="function") def useTimer(self): """!Server a RepeatedTimer instance""" - self.testTimer = RepeatedTimer(0.5, Test_Timer.testTarget) + self.testTimer = RepeatedTimer(0.5, Test_Timer.testTargetFast) time.sleep(0.1) - yield 1 + yield 1 # server the timer instance def test_timerStartStop(self, useTimer): assert self.testTimer.start()