def test_process_preprepare_on_old_view_pre_prepares_reply( external_bus, internal_bus, orderer, is_primary, initial_view_no, pre_prepares): # !!!SETUP!!! orderer._data.view_no = initial_view_no + 1 new_view = create_new_view( initial_view_no=initial_view_no, stable_cp=200, batches=create_batches_from_preprepares(pre_prepares)) orderer._data.new_view_votes.add_new_view(new_view, orderer._data.primary_name) orderer._data.prev_view_prepare_cert = new_view.batches[-1].pp_seq_no # !!!EXECUTE!!! rep = OldViewPrePrepareReply(0, [pp._asdict() for pp in pre_prepares]) orderer._network.process_incoming( rep, generateName("node1", orderer._data.inst_id)) # !!!CHECK!!! if not orderer.is_master: # no re-ordering is expected on non-master assert orderer._data.preprepared == [] assert orderer._data.prepared == [] return # check that PPs were added assert orderer._data.preprepared == [ BatchID(view_no=initial_view_no + 1, pp_view_no=pp.viewNo, pp_seq_no=pp.ppSeqNo, pp_digest=pp.digest) for pp in pre_prepares ] # check that sent_preprepares is updated in case of Primary and prePrepares in case of non-primary updated_prepares_collection = orderer.prePrepares if not is_primary else orderer.sent_preprepares non_updated_prepares_collection = orderer.sent_preprepares if not is_primary else orderer.prePrepares for pp in pre_prepares: new_pp = updateNamedTuple(pp, viewNo=initial_view_no + 1, originalViewNo=pp.viewNo) assert (initial_view_no + 1, new_pp.ppSeqNo) in updated_prepares_collection assert updated_prepares_collection[(initial_view_no + 1, new_pp.ppSeqNo)] == new_pp assert not non_updated_prepares_collection # check that Prepare is sent in case of non primary if not is_primary: check_prepares_sent(external_bus, pre_prepares, initial_view_no + 1) else: assert len(external_bus.sent_messages) == 0 # we don't have a quorum of Prepares yet assert orderer._data.prepared == []
def test_process_preprepare_on_new_view_checkpoint_applied( internal_bus, external_bus, orderer, is_primary, all_ordered, initial_view_no, pre_prepares, stored_old_view_pre_prepares): # !!!SETUP!!! orderer._data.view_no = initial_view_no + 1 batches = create_batches_from_preprepares(pre_prepares) orderer._data.prev_view_prepare_cert = batches[-1].pp_seq_no new_view = create_new_view(initial_view_no=initial_view_no, stable_cp=200, batches=batches) # emulate that we received all PrePrepares before View Change orderer._update_old_view_preprepares(stored_old_view_pre_prepares) # emulate that we've already ordered the PrePrepares if all_ordered and stored_old_view_pre_prepares: orderer.last_ordered_3pc = (initial_view_no, stored_old_view_pre_prepares[-1].ppSeqNo) # !!!EXECUTE!!! # send NewViewCheckpointsApplied internal_bus.send( NewViewCheckpointsApplied(view_no=initial_view_no + 1, view_changes=new_view.viewChanges, checkpoint=new_view.checkpoint, batches=new_view.batches)) # !!!CHECK!!! if not orderer.is_master: # no re-ordering is expected on non-master assert orderer._data.preprepared == [] assert orderer._data.prepared == [] return # check that PPs were added stored_batch_ids = [ preprepare_to_batch_id(pp) for pp in stored_old_view_pre_prepares ] assert orderer._data.preprepared == [ BatchID(view_no=initial_view_no + 1, pp_view_no=initial_view_no, pp_seq_no=batch_id.pp_seq_no, pp_digest=batch_id.pp_digest) for batch_id in new_view.batches if batch_id in stored_batch_ids ] # check that sentPrePrepares is updated in case of Primary and prePrepares in case of non-primary updated_prepares_collection = orderer.prePrepares if not is_primary else orderer.sent_preprepares non_updated_prepares_collection = orderer.sent_preprepares if not is_primary else orderer.prePrepares for pp in stored_old_view_pre_prepares: new_pp = updateNamedTuple(pp, viewNo=initial_view_no + 1, originalViewNo=pp.viewNo) assert (initial_view_no + 1, new_pp.ppSeqNo) in updated_prepares_collection assert updated_prepares_collection[(initial_view_no + 1, new_pp.ppSeqNo)] == new_pp assert not non_updated_prepares_collection # check that Prepare is sent in case of non primary if not is_primary: check_prepares_sent(external_bus, stored_old_view_pre_prepares, initial_view_no + 1) else: # only MessageReqs are sent assert len(external_bus.sent_messages ) == len(pre_prepares) - len(stored_old_view_pre_prepares) # we don't have a quorum of Prepares yet assert orderer._data.prepared == [] # check that missing PrePrepares have been requested expected_requested_batches = [ batch_id for batch_id in new_view.batches if batch_id not in stored_batch_ids ] check_request_old_view_preprepares_sent(external_bus, expected_requested_batches)