Revision: 3663
Author: pekka.klarck
Date: Sat May 29 10:19:46 2010
Log: 1) Log the 'x seconds left' debug message before running timeouts to avoid playing with the signal handler (and passing logger) unnecessarily. 2) Small changes to how activity is determined.
http://code.google.com/p/robotframework/source/detail?r=3663

Modified:
 /trunk/src/robot/running/handlers.py
 /trunk/src/robot/running/timeouts.py
 /trunk/utest/running/test_timeouts.py

=======================================
--- /trunk/src/robot/running/handlers.py        Sat May 29 07:28:57 2010
+++ /trunk/src/robot/running/handlers.py        Sat May 29 10:19:46 2010
@@ -109,8 +109,8 @@

     def _runner_for(self, handler, output, positional, named, timeout):
         if timeout and timeout.active:
- return lambda: timeout.run(handler, args=positional, kwargs=named,
-                                       logger=output)
+            output.debug(timeout.get_message())
+ return lambda: timeout.run(handler, args=positional, kwargs=named)
         return lambda: handler(*positional, **named)

     def _run_with_output_captured_and_signal_monitor(self, runner, output):
=======================================
--- /trunk/src/robot/running/timeouts.py        Sat May 29 08:34:30 2010
+++ /trunk/src/robot/running/timeouts.py        Sat May 29 10:19:46 2010
@@ -18,8 +18,6 @@
 from robot.utils.robotthread import ThreadedRunner
 from robot.errors import TimeoutError, DataError, FrameworkError

-from signalhandler import STOP_SIGNAL_MONITOR
-

 class _Timeout(object):

@@ -27,7 +25,7 @@
         self.string = timeout or ''
         self.message = message
         self.secs = -1
-        self.starttime = 0
+        self.starttime = -1
         self.error = None
         if variables:
             self.replace_variables(variables)
@@ -38,7 +36,7 @@

     @property
     def active(self):
-        return self.secs > 0
+        return self.starttime > 0

     def replace_variables(self, variables):
         try:
@@ -53,11 +51,12 @@
self.error = 'Setting %s failed: %s' % (self.type.lower(), unicode(err))

     def start(self):
-        self.starttime = time.time()
+        if self.secs > 0:
+            self.starttime = time.time()

     def time_left(self):
-        if self.starttime == 0:
-            raise FrameworkError('Timeout not started')
+        if not self.active:
+            return -1
         elapsed = time.time() - self.starttime
         return self.secs - elapsed

@@ -71,16 +70,12 @@
         return cmp(not self.active, not other.active) \
             or cmp(self.time_left(), other.time_left())

-    def run(self, runnable, args=None, kwargs=None, logger=None):
+    def run(self, runnable, args=None, kwargs=None):
         if self.error:
             raise DataError(self.error)
         if not self.active:
             raise FrameworkError('Timeout is not active')
         timeout = self.time_left()
-        STOP_SIGNAL_MONITOR.stop_running_keyword()
-        if logger:
-            logger.debug(self.get_message())
-        STOP_SIGNAL_MONITOR.start_running_keyword()
         if timeout <= 0:
             raise TimeoutError(self.get_message())
         runner = ThreadedRunner(runnable, args, kwargs)
@@ -89,8 +84,8 @@
         try:
             runner.stop_thread()
         except:
-            raise TimeoutError('Stopping keyword after %s failed: %s' %
- (self.type.lower(), utils.get_error_message()))
+            raise TimeoutError('Stopping keyword after %s failed: %s'
+ % (self.type.lower(), utils.get_error_message()))
         raise TimeoutError(self.get_message())

     def get_message(self):
=======================================
--- /trunk/utest/running/test_timeouts.py       Sat May 29 08:34:43 2010
+++ /trunk/utest/running/test_timeouts.py       Sat May 29 10:19:46 2010
@@ -103,31 +103,19 @@
         return touts


-class MockLogger:
-    def __init__(self):
-        self.msgs = []
-    def debug(self, msg):
-        self.msgs.append(('DEBUG',msg))
-    def info(self, msg):
-        self.msgs.append(('INFO',msg))
-
-
 class TestRun(unittest.TestCase):

     def setUp(self):
         self.tout = TestTimeout('1s', variables=VariableMock())
         self.tout.start()
-        self.logger = MockLogger()

     def test_passing(self):
-        assert_none(self.tout.run(passing, logger=self.logger))
-        self._verify_debug_msg(self.logger.msgs[0])
+        assert_none(self.tout.run(passing))

     def test_returning(self):
         for arg in [ 10, 'hello', ['l','i','s','t'], unittest]:
-            ret = self.tout.run(returning, args=(arg,), logger=self.logger)
+            ret = self.tout.run(returning, args=(arg,))
             assert_equals(ret, arg)
-            self._verify_debug_msg(self.logger.msgs[-1])

     def test_failing(self):
         assert_raises_with_msg(MyException, 'hello world',
@@ -145,16 +133,14 @@

     def test_method_executed_normally_if_no_timeout(self):
         os.environ['ROBOT_THREAD_TESTING'] = 'initial value'
-        self.tout.run(sleeping, (0.05,), {}, self.logger)
-        self._verify_debug_msg(self.logger.msgs[0])
+        self.tout.run(sleeping, (0.05,))
         assert_equals(os.environ['ROBOT_THREAD_TESTING'], '0.05')

     def test_method_stopped_if_timeout(self):
         os.environ['ROBOT_THREAD_TESTING'] = 'initial value'
         self.tout.secs = 0.001
assert_raises_with_msg(TimeoutError, 'Test timeout 1 second exceeded.', - self.tout.run, sleeping, (0.05,), {}, self.logger)
-        self._verify_debug_msg(self.logger.msgs[0])
+                               self.tout.run, sleeping, (0.05,))
         time.sleep(0.1)
         assert_equals(os.environ['ROBOT_THREAD_TESTING'], 'initial value')

@@ -164,20 +150,36 @@
             assert_raises(TimeoutError, self.tout.run, sleeping, (10,))

     def test_customized_message(self):
-        self.logger.msgs = []
         tout = KeywordTimeout('1s', 'My message', VariableMock())
         tout.start()
-        tout.run(passing, logger=self.logger)
-        self._verify_debug_msg(self.logger.msgs[0], 'Keyword')
-        tout.secs = 0.01
-        time.sleep(0.02)
+        tout.run(passing)
+        tout.secs = 0.001
+        time.sleep(0.01)
         assert_raises_with_msg(TimeoutError, 'My message',
-                               tout.run, sleeping, (1,), {}, self.logger)
-
-    def _verify_debug_msg(self, msg, type='Test'):
-        assert_equals(msg[0], 'DEBUG')
- assert_true(msg[1].startswith('%s timeout 1 second active.' % type), msg[1])
-        assert_true(msg[1].endswith('seconds left.'), msg[1])
+                               tout.run, sleeping, (1,))
+
+
+class TestMessage(unittest.TestCase):
+
+    def test_non_active(self):
+ assert_equal(TestTimeout().get_message(), 'Test timeout not active.')
+
+    def test_active(self):
+        tout = KeywordTimeout('42s', variables=VariableMock())
+        tout.start()
+        msg = tout.get_message()
+ assert_true(msg.startswith('Keyword timeout 42 seconds active.'), msg)
+        assert_true(msg.endswith('seconds left.'), msg)
+
+    def test_failed_default(self):
+        tout = TestTimeout('1s', variables=VariableMock())
+        tout.starttime = time.time() - 2
+        assert_equal(tout.get_message(), 'Test timeout 1 second exceeded.')
+
+    def test_failed_custom(self):
+        tout = KeywordTimeout('1s', 'Custom message', VariableMock())
+        tout.starttime = time.time() - 2
+        assert_equal(tout.get_message(), 'Custom message')


 if __name__ == '__main__':

Reply via email to