def test_create_fixed_address(self):
     self.assert_create_ok(FIXED_ADDRESS, 'fixed1', dict(prefix='fixed1'))
     msgr = self.messenger()
     address = self.router.addresses[0]+'/fixed1'
     msgr.subscribe(address)
     msgr.put(message(address=address, body='hello'))
     self.assertEqual('hello', msgr.fetch().body)
    def test_create_connector_waypoint(self):
        """Test creating waypoint, connector and fixedAddress
        Create a waypoint that leads out and back from a second router.
        """
        conf = Qdrouterd.Config([
            ('router', {'mode': 'standalone', 'routerId': 'wp-router'}),
            ('listener', {'port':self.get_port(), 'role':'normal'}),
            ('fixedAddress', {'prefix':'foo'})
        ])
        wp_router = self.qdrouterd('wp-router', conf)
        wp_router.wait_ready()

        # Configure the router
        for c in [
                (FIXED_ADDRESS, 'a1', {'prefix':'foo', 'phase':0, 'fanout':'single', 'bias':'spread'}),
                (FIXED_ADDRESS, 'a2', {'prefix':'foo', 'phase':1, 'fanout':'single', 'bias':'spread'}),
                (CONNECTOR, 'wp_connector', {'addr': '127.0.0.1', 'port':str(wp_router.ports[0]), 'saslMechanisms': 'ANONYMOUS', 'role': 'on-demand'}),
                (WAYPOINT, 'wp', {'address': 'foo', 'inPhase': 0, 'outPhase': 1, 'connector': 'wp_connector'})
        ]:
            self.assert_create_ok(*c)
        assert retry(lambda: self.router.is_connected, wp_router.ports[0])

        # Verify the entities
        id = 'connector/127.0.0.1:%s' % wp_router.ports[0]
        connector = self.node.read(identity=id)
        self.assertEqual(
            [connector.name, connector.addr, connector.port, connector.role],
            ['wp_connector', '127.0.0.1', str(wp_router.ports[0]), 'on-demand'])

        # Pause to allow the waypoint to settle down
        sleep(1)

        # Send a message through self.router, verify it goes via wp_router
        address=self.router.addresses[0]+"/foo"
        mr = self.messenger()
        mr.subscribe(address)
        messages = ['a', 'b', 'c']
        for m in messages:
            mr.put(message(address=address, body=m)); mr.send()

        # Check messages arrived
        self.assertEqual(messages, [mr.fetch().body for i in messages])

        # Check log files to verify that the messages went via wp_router
        # TODO aconway 2014-07-07: should be able to check this via management
        # stats instead.
        try:
            f = open('wp-router.log')
            self.assertEqual(6, len(re.findall(r'MESSAGE.*to=.*/foo', f.read())))
        finally:
            f.close()
 def test_create_config_address_pattern(self):
     self.assert_create_ok(CONFIG_ADDRESS, 'patternAddr', dict(pattern='a.*.b'))
     self.assert_read_ok(CONFIG_ADDRESS, 'patternAddr',
                         dict(prefix=None, pattern='a.*.b'))
     msgr = self.messenger()
     address = self.router.addresses[0]+'/a.HITHERE.b'
     msgr.subscribe(address)
     msgr.put(message(address=address, body='hello'))
     self.assertEqual('hello', msgr.fetch().body)
     msgr.stop()
     del msgr
     self.node.delete(CONFIG_ADDRESS, name='patternAddr')
     self.assertRaises(NotFoundStatus, self.node.read,
                       type=CONFIG_ADDRESS, name='patternAddr')
 def test_create_config_address_pattern(self):
     self.assert_create_ok(CONFIG_ADDRESS, 'patternAddr',
                           dict(pattern='a.*.b'))
     self.assert_read_ok(CONFIG_ADDRESS, 'patternAddr',
                         dict(prefix=None, pattern='a.*.b'))
     msgr = self.messenger()
     address = self.router.addresses[0] + '/a.HITHERE.b'
     msgr.subscribe(address)
     msgr.put(message(address=address, body='hello'))
     self.assertEqual('hello', msgr.fetch().body)
     msgr.stop()
     del msgr
     self.node.delete(CONFIG_ADDRESS, name='patternAddr')
     self.assertRaises(NotFoundStatus,
                       self.node.read,
                       type=CONFIG_ADDRESS,
                       name='patternAddr')
        def verify_equal_spread(self, send_addresses, receive_addresses):
            """Verify we send/receive to the queue the load was spread over the brokers.
            Send to each of the send_addresses in turn, subscribe to all of the receive_addresses.
            """
            msgr = self.messenger()
            for a in receive_addresses:
                msgr.subscribe(a)
            msgr.flush()
            n = 20  # Messages per broker
            r = ["x-%02d" % i for i in range(n * len(self.qpidds))]
            for b, a in zip(r, cycle(send_addresses)):
                msgr.put(message(address=a, body=b))
            msgr.flush()
            messages = sorted(msgr.fetch().body for i in r)
            msgr.flush()
            self.assertEqual(r, messages)

            qs = [q.management.getQueue(self.testq) for q in self.qpidds]
            enq = sum(q.msgTotalEnqueues for q in qs)
            deq = sum(q.msgTotalDequeues for q in qs)
            self.assertEquals((enq, deq), (len(r), len(r)))
            # Verify each broker handled a reasonable share of the messages.
            self.assert_fair([q.msgTotalEnqueues for q in qs])
        def verify_equal_spread(self, send_addresses, receive_addresses):
            """Verify we send/receive to the queue the load was spread over the brokers.
            Send to each of the send_addresses in turn, subscribe to all of the receive_addresses.
            """
            msgr = self.messenger()
            for a in receive_addresses:
                msgr.subscribe(a)
            msgr.flush()
            n = 20                  # Messages per broker
            r = ["x-%02d"%i for i in range(n*len(self.qpidds))]
            for b, a in zip(r, cycle(send_addresses)):
                msgr.put(message(address=a, body=b))
            msgr.flush()
            messages = sorted(msgr.fetch().body for i in r)
            msgr.flush()
            self.assertEqual(r, messages)

            qs = [q.management.getQueue(self.testq) for q in self.qpidds]
            enq = sum(q.msgTotalEnqueues for q in qs)
            deq = sum(q.msgTotalDequeues for q in qs)
            self.assertEquals((enq, deq), (len(r), len(r)))
            # Verify each broker handled a reasonable share of the messages.
            self.assert_fair([q.msgTotalEnqueues for q in qs])
    def test_create_connector_waypoint(self):
        """Test creating waypoint, connector and fixedAddress
        Create a waypoint that leads out and back from a second router.
        """
        conf = Qdrouterd.Config([('router', {
            'mode': 'standalone',
            'routerId': 'wp-router'
        }), ('listener', {
            'port': self.get_port(),
            'role': 'normal'
        }), ('fixedAddress', {
            'prefix': 'foo'
        })])
        wp_router = self.qdrouterd('wp-router', conf)
        wp_router.wait_ready()

        # Configure the router
        for c in [(FIXED_ADDRESS, 'a1', {
                'prefix': 'foo',
                'phase': 0,
                'fanout': 'single',
                'bias': 'spread'
        }),
                  (FIXED_ADDRESS, 'a2', {
                      'prefix': 'foo',
                      'phase': 1,
                      'fanout': 'single',
                      'bias': 'spread'
                  }),
                  (CONNECTOR, 'wp_connector', {
                      'addr': '127.0.0.1',
                      'port': str(wp_router.ports[0]),
                      'saslMechanisms': 'ANONYMOUS',
                      'role': 'on-demand'
                  }),
                  (WAYPOINT, 'wp', {
                      'address': 'foo',
                      'inPhase': 0,
                      'outPhase': 1,
                      'connector': 'wp_connector'
                  })]:
            self.assert_create_ok(*c)
        assert retry(lambda: self.router.is_connected, wp_router.ports[0])

        # Verify the entities
        id = 'connector/127.0.0.1:%s' % wp_router.ports[0]
        connector = self.node.read(identity=id)
        self.assertEqual([
            connector.name, connector.addr, connector.port, connector.role
        ], ['wp_connector', '127.0.0.1',
            str(wp_router.ports[0]), 'on-demand'])

        # Pause to allow the waypoint to settle down
        sleep(1)

        # Send a message through self.router, verify it goes via wp_router
        address = self.router.addresses[0] + "/foo"
        mr = self.messenger()
        mr.subscribe(address)
        messages = ['a', 'b', 'c']
        for m in messages:
            mr.put(message(address=address, body=m))
            mr.send()

        # Check messages arrived
        self.assertEqual(messages, [mr.fetch().body for i in messages])

        # Check log files to verify that the messages went via wp_router
        # TODO aconway 2014-07-07: should be able to check this via management
        # stats instead.
        try:
            f = open('wp-router.log')
            self.assertEqual(6, len(re.findall(r'MESSAGE.*to=.*/foo',
                                               f.read())))
        finally:
            f.close()