Пример #1
0
class ZmqReqRepConnectionTestCase(unittest.TestCase):
    """
    Test case for L{tx0mq.reqrep}.
    """

    def setUp(self):
        self.factory = ZmqFactory()
        ZmqReqConnection.identity = 'client'
        self.r = ZmqTestRepConnection(ZmqEndpoint(ZmqEndpointType.bind, "ipc://#3"))
        self.s = ZmqReqConnection(ZmqEndpoint(ZmqEndpointType.connect, "ipc://#3"))
        self.count = 0


    def tearDown(self):
        ZmqReqConnection.identity = None
        self.factory.shutdown()


    def test_getNextId(self):
        self.failUnlessEqual([], self.s._uuids)
        id1 = self.s._getNextId()
        self.failUnlessEqual(self.s.UUID_POOL_GEN_SIZE - 1, len(self.s._uuids))
        self.failUnlessIsInstance(id1, str)

        id2 = self.s._getNextId()
        self.failUnlessIsInstance(id2, str)

        self.failIfEqual(id1, id2)

        ids = [self.s._getNextId() for _ in range(1000)]
        self.failUnlessEqual(len(ids), len(set(ids)))

    def test_releaseId(self):
        self.s._releaseId(self.s._getNextId())
        self.failUnlessEqual(self.s.UUID_POOL_GEN_SIZE, len(self.s._uuids))



    def test_send_recv(self):

        def get_next_id():
            self.count += 1
            return 'msg_id_%d' % (self.count,)
        self.s._getNextId = get_next_id

        def onListen(r, d):
            ds = self.s.connect(self.factory)
            ds.addCallback(onConnect, d)

        def onConnect(s, d):
            d1 = self.s.request(['aaa', 'aab'])
            d2 = self.s.request('bbb')
            reactor.callLater(0.2, check, d)
        
        def check(d):
            result = getattr(self.r, 'messages', [])
            expected = [['msg_id_1', ['aaa', 'aab']], ['msg_id_2', ['bbb']]]
            self.failUnlessEqual(
                result, expected, "Message should have been received")
            d.callback(True)

        d = defer.Deferred()
        dr = self.r.listen(self.factory)
        dr.addCallback(onListen, d)
        return d

    def test_send_recv_reply(self):
        
        def onListen(r, d):
            ds = self.s.connect(self.factory)
            ds.addCallback(onConnect, d)

        def onConnect(s, d):
            d1 = self.s.request('aaa')
            d1.addCallback(check_response, d)

        def check_response(response, d):
            self.assertEqual(response, ['aaa'])
            d.callback(True)

        d = defer.Deferred()
        dr = self.r.listen(self.factory)
        dr.addCallback(onListen, d)
        return d

    def test_lot_send_recv_reply(self):

        def onListen(r, d):
            ds = self.s.connect(self.factory)
            ds.addCallback(onConnect, d)

        def onConnect(s, d):
            reactor.callLater(0.2, perform_test, d)

        def perform_test(d):
            
            def check_response(response, identifier):
                expected = ['aaa']
                self.assertEqual(response, expected)
                return response == expected
       
            deferreds = []
            for i in range(1, 11):
                identifier = "msg_id_%d" % (i,)
                ds = self.s.request(['aaa'])
                deferreds.append(ds)
                ds.addCallback(check_response, identifier)
            dl = defer.DeferredList(deferreds)
            dl.addCallback(d.callback)
        
        d = defer.Deferred()
        dr = self.r.listen(self.factory)
        dr.addCallback(onListen, d)
        return d

    def test_cleanup_requests(self):
        """The request dict is cleanedup properly."""
        
        def onListen(r, d):
            ds = self.s.connect(self.factory)
            ds.addCallback(onConnect, d)

        def onConnect(s, d):
            d1 = self.s.request('aaa')
            d1.addCallback(check, d)

        def check(ignore, d):
            self.assertEqual(self.s._requests, {})
            self.failUnlessEqual(self.s.UUID_POOL_GEN_SIZE, len(self.s._uuids))
            d.callback(True)

        d = defer.Deferred()
        dr = self.r.listen(self.factory)
        dr.addCallback(onListen, d)
        return d