You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gm...@apache.org on 2018/05/08 13:27:55 UTC
qpid-dispatch git commit: DISPATCH-927 - System test for fix. Makes
sure both detaches are echoed back
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 945cac6fd -> 7e4dfd733
DISPATCH-927 - System test for fix. Makes sure both detaches are echoed back
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/7e4dfd73
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/7e4dfd73
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/7e4dfd73
Branch: refs/heads/master
Commit: 7e4dfd7334ea994719e178cba78998c1933f60dc
Parents: 945cac6
Author: Fernando Giorgetti <fg...@redhat.com>
Authored: Mon May 7 22:31:36 2018 -0300
Committer: Fernando Giorgetti <fg...@redhat.com>
Committed: Mon May 7 22:37:42 2018 -0300
----------------------------------------------------------------------
tests/system_tests_link_routes.py | 110 +++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7e4dfd73/tests/system_tests_link_routes.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_link_routes.py b/tests/system_tests_link_routes.py
index 1f95e4f..da48d6d 100644
--- a/tests/system_tests_link_routes.py
+++ b/tests/system_tests_link_routes.py
@@ -32,6 +32,7 @@ from system_tests_drain_support import DrainMessagesHandler, DrainOneMessageHand
from qpid_dispatch.management.client import Node
from qpid_dispatch.management.error import NotFoundStatus
+
class LinkRouteTest(TestCase):
"""
Tests the linkRoute property of the dispatch router.
@@ -732,6 +733,18 @@ class LinkRouteTest(TestCase):
def test_same_name_route_senders_through_C(self):
self._multi_link_send_receive(self.routers[2].addresses[0], self.routers[0].addresses[0], "send_through_C")
+ def test_echo_detach_received(self):
+ """
+ Create two receivers to link routed address org.apache.dev
+ Create a sender to the same address that the receiver is listening on and send 100 messages.
+ After the receivers receive 10 messages each, the receivers will detach and expect to receive ten
+ detaches in response.
+
+ """
+ test = EchoDetachReceived(self.routers[2].addresses[0], self.routers[2].addresses[0])
+ test.run()
+ self.assertEqual(None, test.error)
+
class Timeout(object):
def __init__(self, parent):
@@ -1102,6 +1115,103 @@ class DetachMixedCloseTest(MessagingHandler):
def run(self):
Container(self).run()
+
+# Test to validate fix for DISPATCH-927
+class EchoDetachReceived(MessagingHandler):
+ def __init__(self, sender_address, recv_address):
+ super(EchoDetachReceived, self).__init__()
+ self.sender_address = sender_address
+ self.recv_address = recv_address
+ self.dest = "org.apache.dev"
+ self.num_msgs = 100
+ self.num_receivers = 10
+ self.msgs_sent = 0
+ self.receiver_conn = None
+ self.sender_conn = None
+ self.sender = None
+ self.receiver_dict = {}
+ self.error = None
+ self.receiver_attaches = 0
+ self.timer = None
+ self.sender_attached = False
+ self.received_msgs_dict = {}
+ self.receiver_detach_dict = {}
+ self.num_detaches_echoed = 0
+
+ @property
+ def msgs_received(self):
+ return sum(self.received_msgs_dict.values())
+
+ def timeout(self):
+
+ self.bail("Timeout Expired: msgs_sent=%d msgs_received=%d, number of detaches received=%d"
+ % (self.msgs_sent, self.msgs_received, self.num_detaches_echoed))
+
+ def on_start(self, event):
+ self.timer = event.reactor.schedule(TIMEOUT, Timeout(self))
+
+ # Create two separate connections for sender and receivers
+ self.receiver_conn = event.container.connect(self.recv_address)
+ self.sender_conn = event.container.connect(self.sender_address)
+ for i in range(self.num_receivers):
+ name = "R%d" % i
+ self.receiver_dict[name] = event.container.create_receiver(self.receiver_conn, self.dest, name=name)
+ self.received_msgs_dict[name] = 0
+
+ def bail(self, text=None):
+ self.error = text
+ self.sender_conn.close()
+ self.receiver_conn.close()
+ self.timer.cancel()
+
+ def on_link_opened(self, event):
+ if event.receiver:
+ if event.receiver.name in list(self.receiver_dict):
+ self.receiver_attaches+=1
+ # The response receiver attaches have been received. The receiver sent attaches which was link routed
+ # all the way to the 'broker' router and the response attaches have come back.
+ # It is now time to create the sender.
+ if self.receiver_attaches == self.num_receivers:
+ self.sender = event.container.create_sender(self.sender_conn, self.dest)
+
+ elif event.sender:
+ if not self.sender_attached:
+ if event.sender == self.sender:
+ # The sender attaches were link routed as well and the response attach has been received.
+ self.sender_attached = True
+
+ def on_sendable(self, event):
+ # The sender will send 100 messages
+ if self.receiver_attaches == self.num_receivers and self.sender_attached:
+ if self.msgs_sent < self.num_msgs:
+ msg = Message(body="Hello World")
+ self.sender.send(msg)
+ self.msgs_sent += 1
+
+ def on_message(self, event):
+ if event.receiver and event.receiver.name in list(self.receiver_dict):
+ self.received_msgs_dict[event.receiver.name] += 1
+
+ if sum(self.received_msgs_dict.values()) == self.num_msgs:
+ # The receivers have received a total of 100 messages. Close the receivers. The detach sent by these
+ # receivers will travel all the way over the link route and the 'broker' router will respond with a
+ # detach
+ for receiver in list(self.receiver_dict):
+ self.receiver_dict[receiver].close()
+
+ def on_link_closed(self, event):
+ if event.receiver.name in list(self.receiver_dict) and event.receiver.name not in list(self.receiver_detach_dict):
+ self.receiver_detach_dict[event.receiver.name] = event.receiver
+ self.num_detaches_echoed += 1
+
+ # Terminate the test only if both detach frames have been received.
+ if all(receiver in list(self.receiver_detach_dict) for receiver in list(self.receiver_dict)):
+ self.bail()
+
+ def run(self):
+ Container(self).run()
+
+
class TerminusAddrTest(MessagingHandler):
"""
This tests makes sure that the link route address is visible in the output of qdstat -l command.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org