*** Settings ***
Variables   common.py
Variables   wellknown_acl.py

Library     container.py
Library     epoch.py
Library     neofs_verbs.py
Library     node_management.py
Library     storage_policy.py
Library     utility_keywords.py

Library     Collections

Resource    payment_operations.robot
Resource    setup_teardown.robot

*** Variables ***
${EXPECTED_COPIES} =    ${2}

*** Test cases ***
NeoFS Object Replication
    [Documentation]         Testcase to validate NeoFS object replication.
    [Tags]                  Migration  Replication
    [Timeout]               25 min

    [Setup]                 Setup

    Log    Check replication mechanism
    Check Replication
    Log    Check Sticky Bit with SYSTEM Group via replication mechanism
    Check Replication    ${STICKYBIT_PUB_ACL}

    [Teardown]      Teardown    replication

*** Keywords ***
Check Replication
    [Arguments]    ${ACL}=${EMPTY}

    ${WALLET}   ${_}     ${_} =    Prepare Wallet And Deposit
    ${CID} =                Create Container    ${WALLET}    basic_acl=${ACL}

    ${FILE}    ${_} =       Generate file    ${SIMPLE_OBJ_SIZE}

    ${S_OID} =              Put Object    ${WALLET}    ${FILE}    ${CID}

    ${COPIES} =             Get Object Copies   Simple      ${WALLET}   ${CID}  ${S_OID}
                            Should Be Equal     ${EXPECTED_COPIES}  ${COPIES}

    @{NODES_OBJ} =          Get Nodes With Object    ${WALLET}    ${CID}    ${S_OID}

    @{NODES_OBJ_STOPPED} =  Stop Nodes          1       ${NODES_OBJ}
    @{NETMAP} =             Convert To List             ${NEOFS_NETMAP}
                            Remove Values From List     ${NETMAP}   ${NODES_OBJ_STOPPED}

    # We expect that during two epochs the missed copy will be replicated.
    FOR    ${i}    IN RANGE   2
        ${COPIES} =     Get Object Copies   Simple      ${WALLET}   ${CID}  ${S_OID}
        ${PASSED} =     Run Keyword And Return Status
                        ...     Should Be Equal     ${EXPECTED_COPIES}  ${COPIES}
        Exit For Loop If    ${PASSED}
        Tick Epoch
        Sleep               ${NEOFS_CONTRACT_CACHE_TIMEOUT}
    END
    Run Keyword Unless      ${PASSED}     Fail
    ...     Storage policy for object ${S_OID} in container ${CID} isn't valid

    Start Nodes             ${NODES_OBJ_STOPPED}
    Tick Epoch

    # We have 2 or 3 copies. Expected behaviour: during two epochs potential 3rd copy should be removed.
    FOR    ${i}    IN RANGE   2
        ${COPIES} =     Get Object Copies   Simple      ${WALLET}   ${CID}  ${S_OID}
        ${PASSED} =     Run Keyword And Return Status
                        ...     Should Be Equal     ${EXPECTED_COPIES}  ${COPIES}
        Exit For Loop If    ${PASSED}
        Tick Epoch
        Sleep               ${NEOFS_CONTRACT_CACHE_TIMEOUT}
    END
    Run Keyword Unless      ${PASSED}     Fail
    ...     Storage policy for object ${S_OID} in container ${CID} isn't valid