def test_different_view_change_messages_have_different_digests(random):
    batches = create_batches(view_no=0)
    assert view_change_digest(create_view_change(initial_view_no=0, stable_cp=100, batches=batches)) != \
           view_change_digest(create_view_change(initial_view_no=1, stable_cp=100, batches=batches))
    assert view_change_digest(create_view_change(initial_view_no=1, stable_cp=100, batches=batches)) != \
           view_change_digest(create_view_change(initial_view_no=1, stable_cp=101, batches=batches))
    assert view_change_digest(
        create_view_change(initial_view_no=1, stable_cp=100, batches=create_batches(view_no=0))) != \
           view_change_digest(create_view_change(initial_view_no=1, stable_cp=100, batches=create_batches(view_no=1)))
    assert view_change_digest(create_view_change(initial_view_no=0, stable_cp=100, batches=batches)) == \
           view_change_digest(create_view_change(initial_view_no=0, stable_cp=100, batches=batches))
示例#2
0
def test_update_shared_data_on_view_change_started(internal_bus, orderer):
    orderer._data.preprepared = create_batches(view_no=3)
    orderer._data.prepared = create_batches(view_no=3)
    old_data = copy_shared_data(orderer._data)

    internal_bus.send(ViewChangeStarted(view_no=4))

    new_data = copy_shared_data(orderer._data)
    check_service_changed_only_owned_fields_in_shared_data(OrderingService, old_data, new_data)
    assert orderer._data.preprepared == []
    assert orderer._data.prepared == []
示例#3
0
def test_do_nothing_on_new_view_accepted(internal_bus, orderer):
    orderer._data.preprepared = create_batches(view_no=0)
    orderer._data.prepared = create_batches(view_no=0)
    old_data = copy_shared_data(orderer._data)

    initial_view_no = 3
    new_view = create_new_view(initial_view_no=initial_view_no, stable_cp=200)
    internal_bus.send(NewViewAccepted(view_no=initial_view_no + 1,
                                      view_changes=new_view.viewChanges,
                                      checkpoint=new_view.checkpoint,
                                      batches=new_view.batches))

    new_data = copy_shared_data(orderer._data)
    assert old_data == new_data
def test_view_change_digest_is_256_bit_hexdigest(random):
    digest = view_change_digest(
        create_view_change(initial_view_no=0,
                           stable_cp=random.integer(0, 10000),
                           batches=create_batches(view_no=0)))
    assert isinstance(digest, str)
    assert len(digest) == 64
    assert all(v in string.hexdigits for v in digest)
def test_send_instance_change_on_new_view_with_incorrect_batches(
        internal_bus, external_bus, validators, primary,
        view_change_service_builder, initial_view_no, some_item, is_master):
    # TODO: Need to decide on how we handle this case
    if not is_master:
        return

    next_view_no = initial_view_no + 1
    primary_name = primary(next_view_no)
    non_primary_name = some_item(validators, exclude=[primary_name])
    service = view_change_service_builder(non_primary_name)

    vc = create_view_change(initial_view_no)
    service._data.preprepared = vc.preprepared
    service._data.prepared = vc.prepared
    service._data.stable_checkpoint = vc.stableCheckpoint
    service._data.checkpoints = vc.checkpoints

    # start view change
    internal_bus.send(NeedViewChange())
    external_bus.sent_messages.clear()

    # receive quorum of ViewChanges and ViewChangeAcks
    non_primaries = [item for item in validators if item != primary_name]
    non_primaries = random.sample(non_primaries,
                                  service._data.quorums.view_change.value)
    for vc_frm in non_primaries:
        external_bus.process_incoming(
            vc, generateName(vc_frm, service._data.inst_id))
        for ack, ack_frm in create_view_change_acks(vc, vc_frm, non_primaries):
            external_bus.process_incoming(
                ack, generateName(ack_frm, service._data.inst_id))

    new_view = create_new_view_from_vc(
        vc, non_primaries, batches=create_batches(view_no=initial_view_no + 2))

    # send NewView by Primary
    init_network_msg_count = len(external_bus.sent_messages)
    external_bus.process_incoming(
        new_view, generateName(primary_name, service._data.inst_id))

    # we don't go to new view, just send Instance Change
    assert service._data.view_no == initial_view_no + 1
    assert init_network_msg_count + 1 == len(external_bus.sent_messages)
    msg, dst = external_bus.sent_messages[-1]
    assert dst is None  # broadcast
    assert isinstance(msg, InstanceChange)
    assert msg.viewNo == initial_view_no + 2
    assert msg.reason == Suspicions.NEW_VIEW_INVALID_BATCHES.code
def test_new_view_incorrect_batches(internal_bus, validators, primary,
                                    view_change_service_builder,
                                    initial_view_no, some_item):
    next_view_no = initial_view_no + 1
    primary_name = primary(next_view_no)
    non_primary_name = some_item(validators, exclude=[primary_name])
    service = view_change_service_builder(non_primary_name)

    vc = create_view_change(initial_view_no)
    service._data.preprepared = vc.preprepared
    service._data.prepared = vc.prepared
    service._data.stable_checkpoint = vc.stableCheckpoint
    service._data.checkpoints = vc.checkpoints

    # start view change
    internal_bus.send(NeedViewChange())
    service._network.sent_messages.clear()

    handler = Mock()
    internal_bus.subscribe(NeedViewChange, handler)

    # receive quorum of ViewChanges and ViewChangeAcks
    non_primaries = [item for item in validators if item != primary_name]
    non_primaries = random.sample(non_primaries,
                                  service._data.quorums.view_change.value)
    for vc_frm in non_primaries:
        service._network.process_incoming(vc, vc_frm)
        for ack, ack_frm in create_view_change_acks(vc, vc_frm, non_primaries):
            service._network.process_incoming(ack, ack_frm)

    new_view = create_new_view_from_vc(
        vc, non_primaries, batches=create_batches(view_no=initial_view_no + 2))

    # send NewView by Primary
    service._network.process_incoming(new_view, primary_name)

    # make sure that NeedViewChange is called
    handler.assert_called_with(NeedViewChange())

    # make sure that we get to the next view
    assert service._data.view_no == initial_view_no + 2
    assert service._data.waiting_for_new_view