You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ph...@apache.org on 2013/03/20 23:46:31 UTC
svn commit: r1459089 -
/qpid/proton/trunk/tests/python/proton_tests/messenger.py
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-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org