def test_node_request_propagates(looper, setup, txnPoolNodeSet,
                                 sdk_wallet_client, sdk_pool_handle, tconf):
    """
    One of node lacks sufficient propagates
    """
    faulty_node, recv_client_requests = setup

    old_count_recv_ppg = get_count(faulty_node, faulty_node.processPropagate)
    old_count_recv_req = get_count(faulty_node, faulty_node.processRequest)

    def sum_of_sent_batches():
        return faulty_node.replicas[0].lastPrePrepareSeqNo + \
               faulty_node.replicas[1].lastPrePrepareSeqNo

    old_sum_of_sent_batches = sum_of_sent_batches()
    old_count_request_propagates = sum_of_request_propagates(faulty_node)

    sent_reqs = 1
    sdk_send_random_and_check(looper, txnPoolNodeSet, sdk_pool_handle,
                              sdk_wallet_client, sent_reqs)
    looper.runFor(tconf.PROPAGATE_REQUEST_DELAY)

    if recv_client_requests:
        assert get_count(faulty_node,
                         faulty_node.processRequest) > old_count_recv_req
        assert get_count(faulty_node,
                         faulty_node.processPropagate) == old_count_recv_ppg
        assert sum_of_request_propagates(
            faulty_node) == old_count_request_propagates
    else:
        assert get_count(faulty_node,
                         faulty_node.processPropagate) > old_count_recv_ppg
        assert get_count(faulty_node,
                         faulty_node.processRequest) == old_count_recv_req
        # Attempt to request PROPAGATEs was made as many number of times as the
        # number of sent batches in both replicas since both replicas
        # independently request PROPAGATEs
        assert sum_of_request_propagates(faulty_node) - \
               old_count_request_propagates == (sum_of_sent_batches() -
                                                old_sum_of_sent_batches)

    faulty_node.nodeIbStasher.reset_delays_and_process_delayeds()
    sdk_ensure_pool_functional(looper,
                               txnPoolNodeSet,
                               sdk_wallet_client,
                               sdk_pool_handle,
                               num_reqs=4)
def test_replica_received_preprepare_with_unknown_request(looper,
                                                          txnPoolNodeSet,
                                                          sdk_pool_handle,
                                                          sdk_wallet_steward,
                                                          chkFreqPatched,
                                                          tconf):
    sdk_send_random_and_check(looper, txnPoolNodeSet,
                              sdk_pool_handle, sdk_wallet_steward, 1)
    replica = txnPoolNodeSet[1].master_replica
    start_request_propagate_count = sum_of_request_propagates(txnPoolNodeSet[1])
    with delay_rules(txnPoolNodeSet[1].nodeIbStasher, ppgDelay(delay=10)):
        sdk_send_random_and_check(looper, txnPoolNodeSet,
                                  sdk_pool_handle, sdk_wallet_steward, 1)

    params = replica._ordering_service.spylog.getLastParams(OrderingService.process_preprepare)
    pp = params["pre_prepare"]
    sender = params["sender"]
    looper.runFor(tconf.PROPAGATE_REQUEST_DELAY)
    assert (pp, sender, set(pp.reqIdr)) not in replica._ordering_service.prePreparesPendingFinReqs
    assert 1 == sum_of_request_propagates(txnPoolNodeSet[1]) - start_request_propagate_count