Пример #1
0
def test_internal_bus_sequentially_routes_multiple_messages_of_different_types(
):
    all_messages = [
        create_some_message() if random() < 0.5 else create_other_message()
        for _ in range(100)
    ]
    some_handler1 = Mock()
    some_handler2 = Mock()
    other_handler = Mock()

    bus = InternalBus()
    bus.subscribe(SomeMessage, some_handler1)
    bus.subscribe(SomeMessage, some_handler2)
    bus.subscribe(OtherMessage, other_handler)
    for message in all_messages:
        bus.send(message)

    assert some_handler1.mock_calls == [
        call(msg) for msg in all_messages if isinstance(msg, SomeMessage)
    ]
    assert some_handler2.mock_calls == [
        call(msg) for msg in all_messages if isinstance(msg, SomeMessage)
    ]
    assert other_handler.mock_calls == [
        call(msg) for msg in all_messages if isinstance(msg, OtherMessage)
    ]
Пример #2
0
def internal_bus():
    def rp_handler(ib, msg):
        ib.msgs.setdefault(type(msg), []).append(msg)

    ib = InternalBus()
    ib.msgs = {}
    ib.subscribe(RequestPropagates, rp_handler)
    return ib
Пример #3
0
def test_internal_bus_doesnt_route_unregistered_message():
    handler = Mock()

    bus = InternalBus()
    bus.subscribe(SomeMessage, handler)
    bus.send(create_other_message())

    handler.assert_not_called()
Пример #4
0
    def __init__(self,
                 name: str,
                 validators: List[str],
                 primary_name: str,
                 timer: TimerService,
                 bus: InternalBus,
                 network: ExternalBus,
                 write_manager: WriteRequestManager,
                 bls_bft_replica: BlsBftReplica = None):
        # ToDo: Maybe ConsensusSharedData should be initiated before and passed already prepared?
        self._internal_bus = bus
        self._data = ConsensusSharedData(name, validators, 0)
        self._data.primary_name = generateName(primary_name,
                                               self._data.inst_id)
        self.config = getConfig()
        self.stasher = StashingRouter(self.config.REPLICA_STASH_LIMIT,
                                      buses=[bus, network])
        self._write_manager = write_manager
        self._primaries_selector = RoundRobinNodeRegPrimariesSelector(
            self._write_manager.node_reg_handler)
        self._orderer = OrderingService(
            data=self._data,
            timer=timer,
            bus=bus,
            network=network,
            write_manager=self._write_manager,
            bls_bft_replica=bls_bft_replica,
            freshness_checker=FreshnessChecker(
                freshness_timeout=self.config.STATE_FRESHNESS_UPDATE_INTERVAL),
            primaries_selector=self._primaries_selector,
            stasher=self.stasher)
        self._checkpointer = CheckpointService(self._data, bus, network,
                                               self.stasher,
                                               write_manager.database_manager)
        self._view_changer = ViewChangeService(self._data, timer, bus, network,
                                               self.stasher,
                                               self._primaries_selector)
        self._message_requestor = MessageReqService(self._data, bus, network)

        self._add_ledgers()

        # TODO: This is just for testing purposes only
        self._data.checkpoints.append(
            Checkpoint(instId=0,
                       viewNo=0,
                       seqNoStart=0,
                       seqNoEnd=0,
                       digest='4F7BsTMVPKFshM1MwLf6y23cid6fL3xMpazVoF9krzUw'))

        # ToDo: it should be done in Zero-view stage.
        write_manager.on_catchup_finished()
        self._data.primaries = self._view_changer._primaries_selector.select_primaries(
            self._data.view_no)

        # ToDo: ugly way to understand node_reg changing
        self._previous_node_reg = self._write_manager.node_reg_handler.committed_node_reg

        bus.subscribe(Ordered, self.emulate_ordered_processing)
Пример #5
0
def test_event_bus_routes_no_params_message():
    message = NoParamsMessage()
    handler = Mock()

    bus = InternalBus()
    bus.subscribe(NoParamsMessage, handler)
    bus.send(message)

    handler.assert_called_once_with(message)
Пример #6
0
def test_event_bus_routes_registered_message():
    message = create_some_message()
    handler = Mock()

    bus = InternalBus()
    bus.subscribe(SomeMessage, handler)
    bus.send(message)

    handler.assert_called_once_with(message)
Пример #7
0
def test_internal_bus_can_route_messages_with_side_arguments():
    message = create_some_message()
    handler = Mock()

    bus = InternalBus()
    bus.subscribe(SomeMessage, handler)
    bus.send(message, 'some_arg', 'other_arg')

    handler.assert_called_once_with(message, 'some_arg', 'other_arg')
Пример #8
0
def test_internal_bus_routes_messages_to_all_subscribers():
    message = create_some_message()
    handler1 = Mock()
    handler2 = Mock()

    bus = InternalBus()
    bus.subscribe(SomeMessage, handler1)
    bus.subscribe(SomeMessage, handler2)
    bus.send(message)

    handler1.assert_called_once_with(message)
    handler2.assert_called_once_with(message)
Пример #9
0
def test_event_bus_understands_different_no_params_messages():
    a = NoParamsMessage()
    b = OtherNoParamsMessage()
    handler_a = Mock()
    handler_b = Mock()

    bus = InternalBus()
    bus.subscribe(NoParamsMessage, handler_a)
    bus.subscribe(OtherNoParamsMessage, handler_b)

    bus.send(b)
    handler_a.assert_not_called()
    handler_b.assert_called_once_with(b)

    bus.send(a)
    handler_a.assert_called_once_with(a)
    handler_b.assert_called_once_with(b)