def test_consumers_shutdown_is_called_when_erroring(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)

        result.get(timeout=1)
    def test_consumers_shutdown_is_called_when_erroring(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)

        result.get(timeout=1)
    def test_consumers_consume_is_run(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_working_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)

        result.get(timeout=1)
    def test_consumers_consume_is_run(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_working_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)

        result.get(timeout=1)
    def test_channel_reject_is_not_called_when_erroring_after_ack(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_acking_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)
        result.get(timeout=1)

        tag = msg.delivery_info['delivery_tag']
        self.assertEqual(channel.basic.reject.mock_calls, [])
    def test_channel_reject_is_called_when_erroring(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)
        result.get(timeout=1)

        tag = msg.delivery_info['delivery_tag']
        channel.basic_reject.assert_called_once_with(tag, requeue=True)
    def test_channel_reject_is_not_called_when_erroring_after_ack(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_acking_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)
        result.get(timeout=1)

        tag = msg.delivery_info['delivery_tag']
        self.assertEqual(channel.basic.reject.mock_calls, [])
    def test_channel_reject_is_called_when_erroring(self):
        channel = MagicMock(name='channel')
        msg = MagicMock(name='msg')
        result, consumer = create_error_consumer()

        cp = ConsumerPool(channel, consumer, gevent.Greenlet)
        cp.handle(msg)
        result.get(timeout=1)

        tag = msg.delivery_info['delivery_tag']
        channel.basic_reject.assert_called_once_with(tag, requeue=True)
    def test_creates_consumer_specific_number_of_times(self):
        i = 3
        ConsumerPool(
            self.channel,
            self.consumer_class,
            self.greenlet_maker,
            i,
        )
        calls = [call() for _ in range(i)]

        self.consumer_class.assert_has_calls(calls)
def setup(logger_name, connector, connect_to_hosts):
    logger = logging.getLogger('amqp-dispatcher')

    args = get_args_from_cli()
    config = yaml.safe_load(open(args.config).read())

    startup_handler_str = config.get('startup_handler')
    if startup_handler_str is not None:
        startup_handler = load_module_object(startup_handler_str)
        startup_handler()
        logger.info('Startup handled')

    random_generator = random.SystemRandom()
    random_string = ''.join([
        random_generator.choice(string.ascii_lowercase) for i in range(10)
    ])
    connection_name = '{0}-{1}-{2}'.format(
        socket.gethostname(),
        os.getpid(),
        random_string,
    )

    hosts, user, password, vhost, port, heartbeat = parse_env()
    rabbit_logger = logging.getLogger(logger_name)
    rabbit_logger.setLevel(logging.INFO)
    conn = connect_to_hosts(
        connector,
        hosts,
        port=port,
        transport='gevent',
        user=user,
        password=password,
        vhost=vhost,
        logger=rabbit_logger,
        heartbeat=heartbeat,
        client_properties={
            'connection_name': connection_name,
        },
    )
    if conn is None:
        logger.warning("No connection -- returning")
        return

    queues = config.get('queues')
    if queues:
        create_and_bind_queues(conn, queues)

    conn = proxy_connection(conn)
    conn.add_on_close_callback(create_connection_closed_cb(conn))

    # Create message channel
    channel = conn.channel()
    channel = proxy_channel(channel)
    channel.add_close_listener(channel_closed_cb)

    for consumer in config.get('consumers', []):
        queue_name = consumer['queue']
        prefetch_count = consumer.get('prefetch_count', 1)
        consumer_str = consumer.get('consumer')
        consumer_count = consumer.get('consumer_count', 1)

        consumer_klass = load_consumer(consumer_str)
        consume_channel = conn.channel()
        consume_channel = proxy_channel(consume_channel)
        consume_channel.basic_qos(prefetch_count=prefetch_count)
        pool = ConsumerPool(
            consume_channel,
            consumer_klass,
            gevent.Greenlet,
            consumer_count
        )

        consume_channel.basic_consume(
            consumer_callback=pool.handle,
            queue=queue_name,
            no_ack=False,
        )
        gevent.sleep()

    message_pump_greenlet = gevent.Greenlet(
        message_pump_greenthread, conn)

    return message_pump_greenlet