Fix race condition in mainloop unittest
authorGuido Trotter <ultrotter@google.com>
Wed, 19 May 2010 21:52:03 +0000 (22:52 +0100)
committerGuido Trotter <ultrotter@google.com>
Thu, 20 May 2010 14:52:58 +0000 (15:52 +0100)
Currently, in testDeferredCancel if the self._CancelEvent are entered
more than 0.3 seconds after the _SendSig have been entered, the test
could fail. This is unlikely but may happen. To avoid it we use
enterabs, to use absolute times.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

test/ganeti.daemon_unittest.py

index 7b0cfe5..7bf9d81 100755 (executable)
@@ -25,6 +25,7 @@ import unittest
 import signal
 import os
 import socket
+import time
 
 from ganeti import daemon
 
@@ -82,13 +83,17 @@ class TestMainloop(testutils.GanetiTestCase):
 
   def testDeferredCancel(self):
     self.mainloop.RegisterSignal(self)
-    self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGCHLD])
-    handle1 = self.mainloop.scheduler.enter(0.3, 2, self._SendSig,
-                                           [signal.SIGCHLD])
-    handle2 = self.mainloop.scheduler.enter(0.4, 2, self._SendSig,
-                                           [signal.SIGCHLD])
-    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle1])
-    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle2])
+    now = time.time()
+    self.mainloop.scheduler.enterabs(now + 0.1, 1, self._SendSig,
+                                     [signal.SIGCHLD])
+    handle1 = self.mainloop.scheduler.enterabs(now + 0.3, 2, self._SendSig,
+                                               [signal.SIGCHLD])
+    handle2 = self.mainloop.scheduler.enterabs(now + 0.4, 2, self._SendSig,
+                                               [signal.SIGCHLD])
+    self.mainloop.scheduler.enterabs(now + 0.2, 1, self._CancelEvent,
+                                     [handle1])
+    self.mainloop.scheduler.enterabs(now + 0.2, 1, self._CancelEvent,
+                                     [handle2])
     self.mainloop.scheduler.enter(0.5, 1, self._SendSig, [signal.SIGTERM])
     self.mainloop.Run()
     self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGTERM])