def test_forced_upgrade_handled_once_if_ordered_and_then_request_received(
        looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee,
        validUpgradeExpForceTrue):
    """
    Verifies that POOL_UPGRADE force=true request is handled one time in case
    the node commits the transaction to the ledger and only after that receives
    the request directly from the client
    """
    slow_node = getNonPrimaryReplicas(nodeSet, instId=0)[-1].node
    slow_node.clientIbStasher.delay(req_delay())

    sdk_ensure_upgrade_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
                            validUpgradeExpForceTrue)

    looper.run(
        eventually(checkUpgradeScheduled, [slow_node],
                   validUpgradeExpForceTrue[VERSION],
                   retryWait=1,
                   timeout=waits.expectedUpgradeScheduled()))

    slow_node.clientIbStasher.reset_delays_and_process_delayeds()
    looper.runFor(waits.expectedUpgradeScheduled())

    checkUpgradeScheduled([slow_node], validUpgradeExpForceTrue[VERSION])
    assert count_action_log_package(list(slow_node.upgrader._actionLog),
                                    validUpgradeExpForceTrue['package']) == 1
    assert slow_node.upgrader._actionLog.last_event.ev_type == UpgradeLog.Events.scheduled
def test_pool_upgrade_force_scheduled_only_once(validUpgradeExpForceTrue,
                                                upgradeScheduledExpForceTrue,
                                                nodeSet):
    for node in nodeSet:
        assert count_action_log_package(
            list(node.upgrader._actionLog),
            validUpgradeExpForceTrue['package']) == 1
        assert node.upgrader._actionLog.lastEvent[1] == UpgradeLog.SCHEDULED
def test_scheduled_once_after_view_change(nodeSet, validUpgrade,
                                          upgradeScheduled):
    '''
    Test that each node schedules update only once after each view change
    '''
    # emulate view changes 1-4
    emulate_view_change_pool_for_upgrade(nodeSet)
    emulate_view_change_pool_for_upgrade(nodeSet)
    emulate_view_change_pool_for_upgrade(nodeSet)
    emulate_view_change_pool_for_upgrade(nodeSet)

    # check that there are no cancel events in Upgrade log
    version = validUpgrade['version']
    upgrade_id = nodeSet[0].upgrader.scheduledAction.upgrade_id
    for node in nodeSet:
        node_id = node.poolManager.get_nym_by_name(node.name)
        when = dateutil.parser.parse(validUpgrade['schedule'][node_id])
        ev_data = UpgradeLogData(when, version, upgrade_id,
                                 validUpgrade['package'])
        assert node.upgrader.scheduledAction == ev_data
        assert count_action_log_package(list(node.upgrader._actionLog),
                                        validUpgrade['package']) == 1
        assert node.upgrader.lastActionEventInfo.ev_type == UpgradeLog.Events.scheduled
        assert node.upgrader.lastActionEventInfo.data == ev_data