Author: philharveyonline
Date: Wed Mar 20 22:46:30 2013
New Revision: 1459089

URL: http://svn.apache.org/r1459089
Log:
PROTON-214: fixed Messenger test race condition affecting the teardown and run 
methods.

In teardown(), the client sets running=false and sends a message (intended to
cause the server to promptly exit). If this completes before the server has
started (in run()), the server *never* starts, so the client send() times out.

This is particularly likely when tearing down testSendBogus() because the test
method completes very quickly.

I addressed this race condition using an Event to delay the client until the
server has decided to start.

This test is still racy because the client doesn't have a way of waiting until
the server has actually started so has to approximate it with a generous
timeout, but this is unavoidable given the current Messenger threading model.

Modified:
    qpid/proton/trunk/tests/python/proton_tests/messenger.py

Modified: qpid/proton/trunk/tests/python/proton_tests/messenger.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/messenger.py?rev=1459089&r1=1459088&r2=1459089&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/messenger.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/messenger.py Wed Mar 20 
22:46:30 2013
@@ -19,38 +19,45 @@
 
 import os, common
 from proton import *
-from threading import Thread
+from threading import Thread, Event
 from time import sleep, time
 
 class Test(common.Test):
 
   def setup(self):
+    # Very high timeout expected to only be exceeded by a genuine functional
+    # problem, not by CI server slowness.
+    self.long_timeout_millis = 100000
+
     self.server_credit = 10
     self.server_received = 0
     self.server = Messenger("server")
-    self.server.timeout=10000
+    self.server.timeout = self.long_timeout_millis
     self.server.start()
     self.server.subscribe("amqp://~0.0.0.0:12345")
-    self.thread = Thread(name="server-thread", target=self.run)
-    self.thread.daemon = True
+    self.server_thread = Thread(name="server-thread", target=self.run_server)
+    self.server_thread.daemon = True
+    self.server_is_running_event = Event()
     self.running = True
 
     self.client = Messenger("client")
-    self.client.timeout=1000
+    self.client.timeout= self.long_timeout_millis
 
   def start(self):
-    self.thread.start()
+    self.server_thread.start()
+    self.server_is_running_event.wait(self.long_timeout_millis/1000)
     self.client.start()
 
   def teardown(self):
     if self.running:
+      # send a message to cause the server to promptly exit
       self.running = False
       msg = Message()
       msg.address="amqp://0.0.0.0:12345"
       self.client.put(msg)
       self.client.send()
     self.client.stop()
-    self.thread.join()
+    self.server_thread.join()
     self.client = None
     self.server = None
 
@@ -58,14 +65,12 @@ REJECT_ME = "*REJECT-ME*"
 
 class MessengerTest(Test):
 
-  def run(self):
+  def run_server(self):
     msg = Message()
-    try:
-      while self.running:
-        self.server.recv(self.server_credit)
-        self.process_incoming(msg)
-    except Timeout:
-      print "server timed out"
+    while self.running:
+      self.server_is_running_event.set()
+      self.server.recv(self.server_credit)
+      self.process_incoming(msg)
     self.server.stop()
     self.running = False
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to