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))
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 == []
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