# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2011 OpenStack, LLC
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

"""Functional test case to check RabbitMQ """
try:
    import pika
except ImportError:
    pika = None
from kong import tests

from pprint import pprint
#RABBITMQ_HOST = get_config("rabbitmq/host")
#RABBITMQ_USERNAME = get_config("rabbitmq/user")
#RABBITMQ_PASSWORD = get_config("rabbitmq/password")


class TestRabbitMQ(tests.FunctionalTest):
    @tests.skip_unless(pika, "pika not available")
    def test_000_ghetto(self):
        """
        This sets the host, user, and pass self variables so they
        are accessible by all other methods
        """
        self.rabbitmq['host'] = self.config['rabbitmq']['host']
        self.rabbitmq['user'] = self.config['rabbitmq']['user']
        self.rabbitmq['pass'] = self.config['rabbitmq']['password']
    test_000_ghetto.tags = ['rabbitmq']

    def _cnx(self):
        # TODO: Figuring out what's going with creds
        # creds = pika.credentials.PlainCredentials(
        #     self.rabbitmq['user'], self.rabbitmq['pass']
        connection = pika.BlockingConnection(pika.ConnectionParameters(
                host=self.rabbitmq['host']))
        channel = connection.channel()
        return (channel, connection)

    @tests.skip_unless(pika, "pika not available")
    def test_001_connect(self):
        channel, connection = self._cnx()
        self.assert_(channel)
        connection.close()
    test_001_connect.tags = ['rabbitmq']

    @tests.skip_unless(pika, "pika not available")
    def test_002_send_receive_msg(self):
        unitmsg = 'Hello from unittest'
        channel, connection = self._cnx()
        channel.queue_declare(queue='u1')
        channel.basic_publish(exchange='',
                              routing_key='u1',
                              body=unitmsg)
        connection.close()

        channel, connection = self._cnx()

        def callback(ch, method, properties, body):
            self.assertEquals(body, unitmsg)
            ch.stop_consuming()

        channel.basic_consume(callback,
                              queue='u1',
                              no_ack=True)
        channel.start_consuming()
    test_002_send_receive_msg.tags = ['rabbitmq']

    @tests.skip_unless(pika, "pika not available")
    def test_003_send_receive_msg_with_persistense(self):
        unitmsg = 'Hello from unittest with Persistense'
        channel, connection = self._cnx()
        channel.queue_declare(queue='u2', durable=True)
        prop = pika.BasicProperties(delivery_mode=2)
        channel.basic_publish(exchange='',
                              routing_key='u2',
                              body=unitmsg,
                              properties=prop,
                              )
        connection.close()

        channel, connection = self._cnx()
        channel.queue_declare(queue='u2', durable=True)

        def callback(ch, method, properties, body):
            self.assertEquals(body, unitmsg)
            ch.basic_ack(delivery_tag=method.delivery_tag)
            ch.stop_consuming()

        channel.basic_qos(prefetch_count=1)
        channel.basic_consume(callback,
                              queue='u2')

        channel.start_consuming()
    test_003_send_receive_msg_with_persistense.tags = ['rabbitmq']
