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