# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.1 (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.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and
# limitations under the License.
#
# The Original Code is Pika.
#
# The Initial Developers of the Original Code are LShift Ltd, Cohesive
# Financial Technologies LLC, and Rabbit Technologies Ltd.  Portions
# created before 22-Nov-2008 00:00:00 GMT by LShift Ltd, Cohesive
# Financial Technologies LLC, or Rabbit Technologies Ltd are Copyright
# (C) 2007-2008 LShift Ltd, Cohesive Financial Technologies LLC, and
# Rabbit Technologies Ltd.
#
# Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift
# Ltd. Portions created by Cohesive Financial Technologies LLC are
# Copyright (C) 2007-2009 Cohesive Financial Technologies
# LLC. Portions created by Rabbit Technologies Ltd are Copyright (C)
# 2007-2009 Rabbit Technologies Ltd.
#
# Portions created by Tony Garnock-Jones are Copyright (C) 2009-2010
# LShift Ltd and Tony Garnock-Jones.
#
# All Rights Reserved.
#
# Contributor(s): ______________________________________.
#
# Alternatively, the contents of this file may be used under the terms
# of the GNU General Public License Version 2 or later (the "GPL"), in
# which case the provisions of the GPL are applicable instead of those
# above. If you wish to allow use of your version of this file only
# under the terms of the GPL, and not to allow others to use your
# version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the
# notice and other provisions required by the GPL. If you do not
# delete the provisions above, a recipient may use your version of
# this file under the terms of any one of the MPL or the GPL.
#
# ***** END LICENSE BLOCK *****

"""
Callback Unit Test
"""
import nose
import os
import sys
sys.path.append('..')
sys.path.append(os.path.join('..', '..'))

import pika.callback as callback


def teardown():
    cm = callback.CallbackManager.instance()
    if 'a' in cm._callbacks:
        del cm._callbacks['a']


def test_callback_instance():
    cm1 = callback.CallbackManager.instance()
    cm2 = callback.CallbackManager.instance()
    if (not cm1 or not cm2) or cm1 != cm2:
        assert False, "CallbackManager.instance() failure."
    pass


@nose.with_setup(None, teardown)
def test_add_callback():

    def callback_test():
        assert False, "callback() called on add only test."

    cm = callback.CallbackManager.instance()
    cm.add('a', 'b', callback_test)

    if 'a' not in cm._callbacks:
        assert False, "Prefix not found"

    if 'a' in cm._callbacks and 'b' not in cm._callbacks['a']:
        assert False, "Prefix found but key is missing"

    if 'b' in cm._callbacks['a']:
        for item in cm._callbacks['a']['b']:
            if item['handle'] == callback_test:
                break
        else:
            assert False, "Prefix and key found but could not find callback"


@nose.with_setup(None, teardown)
def test_process_callback():
    global callback_processed
    callback_processed = False

    def callback_test():
        global callback_processed
        callback_processed = True
    cm = callback.CallbackManager.instance()
    cm.add('a', 'b', callback_test)
    cm.process('a', 'b', 'None')
    if not callback_processed:
        assert False, "Callback not processed"
    pass


@nose.with_setup(None, teardown)
def test_remove_callback():
    def callback_test():
        assert False, "callback() called on remove only test."
    cm = callback.CallbackManager.instance()
    cm.add('a', 'b', callback_test)
    cm.remove('a', 'b')
    if 'a' in cm._callbacks and 'b' in cm._callbacks['a']:
        assert False, "Prefix and key were not removed"
    pass


if __name__ == "__main__":
    nose.runmodule()
