def test_send_recv(self): """ Check sending and receiving """ def onListen(p, s, d): ds = s.connect(self.factory) ds.addCallback(onConnect, p, d) def onConnect(s, p, d): s.subscribe("tag") reactor.callLater(0.2, performTest, s, p, d) def performTest(s, p, d): p.publish("xyz", "different-tag") p.publish("abcd", "tag1") p.publish("efgh", "tag2") reactor.callLater(0.2, check, s, d) def check(s, d): result = getattr(s, "messages", []) expected = [["tag1", ["abcd"]], ["tag2", ["efgh"]]] self.failUnlessEqual(result, expected, "Message should have been received") d.callback(True) s = ZmqTestSubConnection(ZmqEndpoint(ZmqEndpointType.connect, "ipc://test-sock")) p = ZmqPubConnection(ZmqEndpoint(ZmqEndpointType.bind, "ipc://test-sock")) d = defer.Deferred() ds = p.listen(self.factory) ds.addCallback(onListen, s, d) return d
def test_send_recv_multiple_endpoints(self): """ Check send and receive using multiple endpoint """ def onP1Listen(p1, p2, s, d): dp2 = p2.listen(self.factory) dp2.addCallback(onP2Listen, p1, s, d) def onP2Listen(p2, p1, s, d): ds = s.connect(self.factory) ds.addCallback(onConnect, p1, p2, d) def onConnect(s, p1, p2, d): s.subscribe("") reactor.callLater(0.2, perform_test, s, p1, p2, d) def perform_test(s, p1, p2, d): p1.publish("111", "tag1") p2.publish("222", "tag2") reactor.callLater(0.2, check, s, d) def check(s, d): result = getattr(s, "messages", []) expected = [["tag2", ["222"]], ["tag1", ["111"]]] self.failUnlessEqual(result, expected, "Message should have been received") d.callback(True) s = ZmqTestSubConnection( ZmqEndpoint(ZmqEndpointType.connect, "tcp://127.0.0.1:5556"), ZmqEndpoint(ZmqEndpointType.connect, "inproc://endpoint"), ) p1 = ZmqPubConnection(ZmqEndpoint(ZmqEndpointType.bind, "tcp://127.0.0.1:5556")) p2 = ZmqPubConnection(ZmqEndpoint(ZmqEndpointType.bind, "inproc://endpoint")) d = defer.Deferred() ds = p1.listen(self.factory) ds.addCallback(onP1Listen, p2, s, d) return d
if __name__ == '__main__': def publish(publisher): # Write two messages, each with an envelope and content first_message = ["A", "We don't want to see this"] second_message = ["B", "We would like to see this"] third_message = ["BB", "We might see this"] print "publishing ..." publisher.publish(first_message) publisher.publish(second_message) publisher.publish(third_message) reactor.callLater(1, publish, publisher) def onListen(publisher): print "Publisher connected" publisher.setSocketOptions({constants.LINGER:0}) publish(publisher) # Prepare our context and publisher endpoint = ZmqEndpoint(ZmqEndpointType.bind, "tcp://*:5563") publisher = ZmqPubConnection(endpoint) deferred = publisher.listen(ZmqFactory()) deferred.addCallback(onListen) reactor.run()