예제 #1
0
    def test_pubsub_1_1_1(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with one message
        """
        def configure(composer: Composer):
            composer.interface.router = MagicMock()
            return composer

        def run_assertions(composer: Composer):
            callback = ReactorCommand.create_callback(
                callback=StateInput.INPUT, envelope=env)
            composer.interface.router.route_callback.assert_called_once_with(
                callback)

        env = random_envelope()

        sub = MPComposer(config_fn=configure,
                         assert_fn=run_assertions,
                         name='** SUB',
                         sk=sk1)
        pub = MPComposer(name='++ PUB', sk=sk2)

        sub.add_sub(url=URL, filter=FILTER)
        pub.add_pub(url=URL)

        time.sleep(0.2)

        pub.send_pub_env(filter=FILTER, envelope=env)

        self.start()
예제 #2
0
    def test_pubsub_1_1_1(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with one message
        """
        def config_sub(composer: Composer):
            from unittest.mock import MagicMock

            composer.manager.router = MagicMock()
            return composer

        def assert_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            cb = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                envelope=env)
            composer.manager.router.route_callback.assert_called_with(cb)

        env = random_envelope()

        sub = MPComposer(config_fn=config_sub,
                         assert_fn=assert_sub,
                         name='[MN1] SUB',
                         sk=sk1)
        pub = MPComposer(name='[Delegate1] PUB', sk=sk2)
        pub_ip = pub.ip

        sub.add_sub(vk=vk2, filter=FILTER)
        pub.add_pub(ip=pub_ip)

        time.sleep(5.0)

        pub.send_pub_env(filter=FILTER, envelope=env)

        self.start()
예제 #3
0
    def test_pubsub_n_1_n_removesub(self):
        """
        Tests pub/sub n-1, with a sub removing a publisher after its first message
        """
        def configure(composer: Composer):
            from unittest.mock import MagicMock
            composer.manager.router.route_callback = MagicMock()
            return composer

        def assert_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            from unittest.mock import call

            callback1 = ReactorCommand.create_callback(
                callback=StateInput.INPUT, envelope=env1)
            callback2 = ReactorCommand.create_callback(
                callback=StateInput.INPUT, envelope=env2)
            calls = [call(callback1), call(callback2)]

            call_args = composer.manager.router.route_callback.call_args_list
            composer.manager.router.route_callback.assert_has_calls(
                calls, any_order=True)

        env1 = random_envelope()
        env2 = random_envelope()
        env3 = random_envelope()

        sub = MPComposer(config_fn=configure,
                         assert_fn=assert_sub,
                         name='SUB [MN1]',
                         sk=sk1)
        pub1 = MPComposer(name='PUB 1 [Delegate1]', sk=sk2)
        pub2 = MPComposer(name='PUB 2 [Delegate2]', sk=sk3)

        sub.add_sub(vk=vk2, filter=FILTER)  # sub to pub1
        sub.add_sub(vk=vk3, filter=FILTER)  # sub to pub2

        pub1.add_pub(ip=pub1.ip)  # Pub on its own URL
        pub2.add_pub(ip=pub2.ip)  # Pub on its own URL

        time.sleep(5.0)

        pub1.send_pub_env(filter=FILTER, envelope=env1)
        pub2.send_pub_env(filter=FILTER, envelope=env2)

        time.sleep(1.0)  # allow messages to go through
        sub.remove_sub(vk=vk3)  # unsub to pub2
        time.sleep(1.0)  # allow remove_sub_url command to go through

        pub2.send_pub_env(
            filter=FILTER, envelope=env3
        )  # this should not be recv by sub, as he removed this guy's url

        time.sleep(
            5.0
        )  # allow messages to go through before we start checking assertions

        self.start()
예제 #4
0
    def test_pubsub_n_1_n_removesub(self):
        """
        Tests pub/sub n-1, with a sub removing a publisher after its first message
        """
        def configure(composer: Composer):
            composer.interface.router.route_callback = MagicMock()
            return composer

        def assert_sub(composer: Composer):
            callback1 = ReactorCommand.create_callback(
                callback=StateInput.INPUT, envelope=env1)
            callback2 = ReactorCommand.create_callback(
                callback=StateInput.INPUT, envelope=env2)
            calls = [call(callback1), call(callback2)]

            # i = 10 / 0

            call_args = composer.interface.router.route_callback.call_args_list

            assert len(call_args) == 2, "route_callback should be called exactly twice, not {} times with {}"\
                                        .format(len(call_args), call_args)
            composer.interface.router.route_callback.assert_has_calls(
                calls, any_order=True)

        env1 = random_envelope()
        env2 = random_envelope()
        env3 = random_envelope()

        sub = MPComposer(config_fn=configure,
                         assert_fn=assert_sub,
                         name='** SUB',
                         sk=sk1)
        pub1 = MPComposer(name='++ PUB 1', sk=sk2)
        pub2 = MPComposer(name='++ PUB 2', sk=sk3)

        sub.add_sub(url=URLS[0], filter=FILTER)  # sub to pub1
        sub.add_sub(url=URLS[1], filter=FILTER)  # sub to pub2

        pub1.add_pub(url=URLS[0])
        pub2.add_pub(url=URLS[1])

        time.sleep(0.2)

        pub1.send_pub_env(filter=FILTER, envelope=env1)
        pub2.send_pub_env(filter=FILTER, envelope=env2)

        time.sleep(0.1)  # allow messages to go through
        sub.remove_sub_url(url=URLS[1])  # unsub to pub2
        time.sleep(0.1)  # allow remove_sub_url command to go through

        pub2.send_pub_env(
            filter=FILTER, envelope=env3
        )  # this should not be recv by sub, as he removed this guy's url

        time.sleep(
            0.2
        )  # allow messages to go through before we start checking assertions

        self.start()
예제 #5
0
def run_mgmt():
    from cilantro.logger import get_logger
    from cilantro.utils.test import MPComposer

    log = get_logger(__name__)
    sk = masternodes[0]['sk']
    vk = wallet.get_vk(sk)
    s, v = wallet.new()
    mpc = MPComposer(name='mgmt', sk=s)
    mpc.add_sub(filter='a', vk=vk)
    def test_pubsub_n_1_n(self):
        """
        Tests pub/sub with 2 pubs, 1 sub, and multiple messages and the same filter
        """
        def config_sub(composer: Composer):
            from unittest.mock import MagicMock
            composer.interface.router = MagicMock()
            return composer

        def assert_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            from unittest.mock import call

            expected_calls = []
            for env in envs:
                callback = ReactorCommand.create_callback(
                    callback=StateInput.INPUT, envelope=env)
                expected_calls.append(call(callback))

            call_args = composer.interface.router.route_callback.call_args_list

            assert len(call_args) == len(expected_calls), "route_callback should be called exactly {} times, not {} " \
                                                          "times with {}".format(len(expected_calls), len(call_args), call_args)
            composer.interface.router.route_callback.assert_has_calls(
                expected_calls, any_order=True)

        envs = [random_envelope() for _ in range(4)]

        sub = MPComposer(config_fn=config_sub,
                         assert_fn=assert_sub,
                         name='** [MN1] SUB',
                         sk=sk1)
        pub1 = MPComposer(name='++ [Delegate1] PUB1', sk=sk2)
        pub2 = MPComposer(name='++ [Delegate2] PUB2', sk=sk3)

        sub.add_sub(vk=vk2, filter=FILTER)
        sub.add_sub(vk=vk3, filter=FILTER)

        pub1.add_pub(ip=pub1.ip)
        pub2.add_pub(ip=pub2.ip)

        time.sleep(3.0)

        pub1.send_pub_env(filter=FILTER, envelope=envs[0])
        pub1.send_pub_env(filter=FILTER, envelope=envs[1])

        pub2.send_pub_env(filter=FILTER, envelope=envs[2])
        pub2.send_pub_env(filter=FILTER, envelope=envs[3])

        self.start()
예제 #7
0
def run_mgmt():
    from cilantro.logger import get_logger
    from cilantro import Constants
    from cilantro.db import DB, DB_NAME
    from cilantro.utils.test import MPComposer
    from cilantro.protocol.wallets import ED25519Wallet
    import os, time, asyncio

    log = get_logger(__name__)
    sk = Constants.Testnet.Masternodes[0]['sk']
    vk = Constants.Protocol.Wallets.get_vk(sk)
    s,v = ED25519Wallet.new()
    mpc = MPComposer(name='mgmt', sk=s)
    mpc.add_sub(filter='a', vk=vk)
예제 #8
0
    def test_pubsub_1_1_1_with_unauth_sub(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with one message, and one
        unauthorized veriying key
        """
        def config_sub(composer: Composer):
            from unittest.mock import MagicMock
            composer.interface.router = MagicMock()
            return composer

        def assert_good_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            cb = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                envelope=env)
            composer.interface.router.route_callback.assert_called_once_with(
                cb)

        def assert_bad_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            from unittest.mock import call
            cb = call(
                ReactorCommand.create_callback(callback=StateInput.INPUT,
                                               envelope=env))
            assert cb not in composer.interface.router.route_callback.call_args_list

        env = random_envelope()
        evil_env = random_envelope()

        sub = MPComposer(config_fn=config_sub,
                         assert_fn=assert_good_sub,
                         name='** [MN1] SUB',
                         sk=sk1)
        pub = MPComposer(name='++ [Delegate1] PUB', sk=sk2)
        no_auth_sub = MPComposer(name='++ [Mr. Evil] SUB',
                                 config_fn=config_sub,
                                 assert_fn=assert_bad_sub,
                                 sk=sk_sketch)

        sub.add_sub(vk=vk2, filter=FILTER)
        no_auth_sub.add_sub(vk=vk2, filter=FILTER)

        pub.add_pub(ip=pub.ip)

        time.sleep(3.0)  # allow add pub/add sub to go through
        pub.send_pub_env(filter=FILTER, envelope=env)
        time.sleep(3.0)  # allow PUB envelopes to go through

        self.start()
예제 #9
0
def run_mgmt():
    from cilantro.logger import get_logger
    from cilantro import Constants
    from cilantro.db import DB, DB_NAME
    from cilantro.utils.test import MPComposer
    from cilantro.protocol.wallets import ED25519Wallet
    import os, time, asyncio

    log = get_logger("MANAGEMENT NODE")
    sk = Constants.Testnet.Masternode.Sk
    vk = Constants.Protocol.Wallets.get_vk(sk)
    s, v = ED25519Wallet.new()
    mpc = MPComposer(name='mgmt', sk=s)
    log.critical("trying to look at vk: {}".format(vk))
    mpc.add_sub(filter='a', url='tcp://{}:33333'.format(vk))
예제 #10
0
    def test_pubsub_1_1_2_mult_filters(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with 2 message each on a different filter
        """
        def configure(composer: Composer):
            from unittest.mock import MagicMock
            composer.manager.router = MagicMock()
            return composer

        def run_assertions(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            from unittest.mock import call

            cb1 = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                 envelope=env1)
            cb2 = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                 envelope=env2)
            composer.manager.router.route_callback.assert_has_calls(
                [call(cb1), call(cb2)], any_order=True)

        env1 = random_envelope()
        env2 = random_envelope()
        filter1 = FILTERS[0]
        filter2 = FILTERS[1]

        sub = MPComposer(config_fn=configure,
                         assert_fn=run_assertions,
                         name='SUB',
                         sk=sk1)
        pub = MPComposer(name='PUB', sk=sk2)

        sub.add_sub(vk=vk2, filter=filter2)
        sub.add_sub(vk=vk2, filter=filter1)
        pub.add_pub(ip=pub.ip)

        time.sleep(
            5.0)  # allow time for VK lookups before we start sending things

        # Send 2 envelopes on 2 different filters
        pub.send_pub_env(filter=filter1, envelope=env1)
        pub.send_pub_env(filter=filter2, envelope=env2)

        self.start()
예제 #11
0
def subscriber():
    from cilantro.logger import get_logger
    from cilantro.utils.test import MPComposer
    import time, os, sys

    log = get_logger("Sub")

    d_info = delegates[1]
    d_info['ip'] = os.getenv('HOST_IP')

    pub_info = delegates[0]
    pub_info['ip'] = os.getenv('HOST_IP')

    sub = MPComposer(sk=d_info['sk'])
    sub.add_sub(filter='0', vk=pub_info['vk'])

    log.critical("Sub sleeping")
    time.sleep(26)
    log.critical("Sub done. Exiting.")

    sys.exit(0)
    exit
예제 #12
0
    def test_pubsub_1_1_2_mult_filters(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with 2 message each on a different filter
        """
        def configure(composer: Composer):
            composer.interface.router = MagicMock()
            return composer

        def run_assertions(composer: Composer):
            cb1 = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                 envelope=env1)
            cb2 = ReactorCommand.create_callback(callback=StateInput.INPUT,
                                                 envelope=env2)
            composer.interface.router.route_callback.assert_has_calls(
                [call(cb1), call(cb2)], any_order=True)

        env1 = random_envelope()
        env2 = random_envelope()
        filter1 = FILTERS[0]
        filter2 = FILTERS[1]

        sub = MPComposer(config_fn=configure,
                         assert_fn=run_assertions,
                         name='** SUB',
                         sk=sk1)
        pub = MPComposer(name='++ PUB', sk=sk2)

        sub.add_sub(url=URL, filter=filter2)
        sub.add_sub(url=URL, filter=filter1)
        pub.add_pub(url=URL)

        time.sleep(0.2)

        pub.send_pub_env(filter=filter1, envelope=env1)
        pub.send_pub_env(filter=filter2, envelope=env2)

        self.start()
예제 #13
0
def subscriber():
    SLEEP_TIME = 1
    MAX_TIME = 10
    from cilantro.logger import get_logger, overwrite_logger_level
    from cilantro.utils.test import MPComposer
    import time, os

    log = get_logger("Subscriber")

    d_info = delegates[1]
    d_info['ip'] = os.getenv('HOST_IP')

    pub_info = delegates[0]
    pub_info['ip'] = os.getenv('HOST_IP')

    sub = MPComposer(sk=d_info['sk'])
    sub.add_sub(filter='0', vk=pub_info['vk'])

    log.critical(
        "Starting Subscriber, and exiting after {} seconds".format(SLEEP_TIME))
    time.sleep(MAX_TIME)

    sub.teardown()
    log.critical("Done with experiment!")
예제 #14
0
def subscriber():
    MAX_TIME = 90
    from cilantro.logger import get_logger, overwrite_logger_level
    from cilantro.utils.test import MPComposer
    from cilantro.constants.testnet import TESTNET_DELEGATES
    import time, os

    log = get_logger("Subscriber")

    d_info = TESTNET_DELEGATES[1]
    d_info['ip'] = os.getenv('HOST_IP')

    pub_info = TESTNET_DELEGATES[0]
    pub_info['ip'] = os.getenv('HOST_IP')

    sub = MPComposer(sk=d_info['sk'])
    sub.add_sub(filter='0', vk=pub_info['vk'])

    log.important2(
        "Starting Subscriber, and exiting after {} seconds".format(MAX_TIME))
    time.sleep(MAX_TIME)

    sub.teardown()
    log.important2("Done with experiment!")
예제 #15
0
    def test_pubsub_1_1_1_with_unauth_pub(self):
        """
        Tests pub/sub 1-1 (one sub one pub) with one message, and one
        unauthorized veriying key
        """
        def config_sub(composer: Composer):
            from unittest.mock import MagicMock

            composer.manager.router = MagicMock()
            return composer

        def assert_sub(composer: Composer):
            from cilantro.messages.reactor.reactor_command import ReactorCommand
            from cilantro.protocol.states.decorators import StateInput
            from unittest.mock import call
            # cb = ReactorCommand.create_callback(callback=StateInput.INPUT, envelope=env)
            # composer.interface.router.route_callback.assert_called_once_with(cb)

            expected_cb = call(
                ReactorCommand.create_callback(callback=StateInput.INPUT,
                                               envelope=env))
            unexpected_cb = call(
                ReactorCommand.create_callback(
                    callback=StateInput.LOOKUP_FAILED, envelope=evil_env))

            call_args = composer.manager.router.route_callback.call_args_list

            # # DEBUG STUFF
            # from cilantro.logger.base import get_logger
            # l = get_logger("assert sub")
            # l.debug('EXPECTED')
            # l.critical(expected_cb)
            # l.debug('UNEXPECTED')
            # l.critical(unexpected_cb)
            # l.important2("got dat call args: {}".format(call_args))
            # # END DEBUG STUFF

            # composer.interface.router.route_callback.assert_has_calls([expected_cb], any_order=True)

            assert expected_cb in call_args, "Expected callback {} to be in call_args {}".format(
                expected_cb, call_args)
            assert unexpected_cb not in call_args, "Did not expect callback {} to be in call_args {}".format(
                unexpected_cb, call_args)

            # assert len(call_args) == 2, "route_callback should be called exactly twice, not {} times with {}"\
            #                             .format(len(call_args), call_args)
            # composer.interface.router.route_callback.assert_has_calls(calls, any_order=True)

        env = random_envelope()
        evil_env = random_envelope()

        sub = MPComposer(config_fn=config_sub,
                         assert_fn=assert_sub,
                         name='** [MN1] SUB',
                         sk=sk1)
        pub = MPComposer(name='++ [Delegate1] PUB', sk=sk2)
        no_auth_pub = MPComposer(name='++ [Mr. Evil] PUB', sk=sk_sketch)

        sub.add_sub(vk=vk2, filter=FILTER)
        sub.add_sub(vk=vk_sketch, filter=FILTER)

        pub.add_pub(ip=pub.ip)
        no_auth_pub.add_pub(ip=no_auth_pub.ip)

        time.sleep(3.0)

        pub.send_pub_env(filter=FILTER, envelope=env)

        no_auth_pub.send_pub_env(filter=FILTER, envelope=evil_env)

        time.sleep(3.0)  # allow PUB envelopes to go through

        self.start()