*** Settings ***
Documentation  Test BMC network interface functionalities.

Resource  ../lib/rest_client.robot
Resource  ../lib/utils.robot
Resource  ../lib/bmc_network_utils.robot
Resource  ../lib/boot_utils.robot

Library  String
Library  SSHLibrary

Suite Setup  Suite Setup Execution

*** Variables ***

# AA:AA:AA:AA:AA:AA series is a valid MAC and does not exist in
# our network, so this is chosen to avoid MAC conflict.

${valid_mac}         AA:E2:84:14:28:79
${broadcast_mac}     FF:FF:FF:FF:FF:FF
${zero_mac}          00:00:00:00:00:00
${out_of_range_mac}  AA:FF:FF:FF:FF:100
${special_char_mac}  &$:AA:AA:AA:AA:^^

# There will be 6 bytes in MAC address (e.g. xx.xx.xx.xx.xx.xx)
# but trying to configure xx.xx.xx.xx.xx

${less_byte_mac}     AA:AA:AA:AA:BB

# There will be 6 bytes in MAC address (e.g. xx.xx.xx.xx.xx.xx)
# but trying to configure xx.xx.xx.xx.xx.xx.xx

${more_byte_mac}     AA:AA:AA:AA:AA:AA:BB

*** Test Cases ***

Configure Valid MAC And Verify
    [Documentation]  Configure valid MAC and verify.
    [Tags]  Configure_Valid_MAC_And_Verify

    Configure MAC Settings  ${valid_mac}  valid

    # Verify whether new MAC is configured on BMC.
    Validate MAC On BMC  ${valid_mac}

Configure Invalid MAC And Verify
    [Documentation]  Configure invalid MAC address which is a string.
    [Tags]  Configure_Invalid_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address        Expected_Result
    ${special_char_mac}  error


Configure Out Of Range MAC And Verify
    [Documentation]  Configure out-of-range MAC address.
    [Tags]  Configure_Out_Of_Range_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address        Expected_Result
    ${out_of_range_mac}  error

Configure Broadcast MAC And Verify
    [Documentation]  Configure broadcast MAC address.
    [Tags]  Configure_Broadcast_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address     Expected_Result
    ${broadcast_mac}  error

Configure Zero MAC And Verify
    [Documentation]  Configure zero MAC address.
    [Tags]  Configure_Zero_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address     Expected_Result
    ${zero_mac}  error

Configure More Byte MAC And Verify
    [Documentation]  Configure more byte MAC address.
    [Tags]  Configure_More_Byte_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address     Expected_Result
    ${more_byte_mac}  error

Configure Less Byte MAC And Verify
    [Documentation]  Configure less byte MAC address.
    [Tags]  Configure_Less_Byte_MAC_And_Verify

    [Template]  Configure MAC Settings
    # MAC Address     Expected_Result
    ${less_byte_mac}  error

Configure Valid MAC And Check Persistency
    [Documentation]  Configure valid MAC and check persistency.
    [Tags]  Configure_Valid_MAC_And_Check_Persistency

    Configure MAC Settings  ${valid_mac}  valid

    # Verify whether new MAC is configured on BMC.
    Validate MAC On BMC  ${valid_mac}

    # Reboot BMC and check whether MAC is persistent.
    OBMC Reboot (off)
    Validate MAC On BMC  ${valid_mac}

Revert To Initial MAC And Verify
    [Documentation]  Revert to initial MAC address.
    [Tags]  Revert_To_Initial_MAC_And_Verify

    Configure MAC Settings  ${macaddr}  valid

    # Verify whether new MAC is configured on BMC.
    Validate MAC On BMC  ${macaddr}

*** Keywords ***

Suite Setup Execution
    [Documentation]  Network setup.
    Open Connection And Login

    # Get BMC MAC address.
    ${macaddr}=  Read Attribute  ${NETWORK_MANAGER}eth0  MACAddress
    Validate MAC On BMC  ${macaddr}
    Set Suite Variable  ${macaddr}

Configure MAC Settings
    [Documentation]  Configure MAC settings.
    [Arguments]  ${mac_addr}  ${expected_result}

    # Description of argument(s):
    # mac_addr         MAC address of BMC.
    # expected_result  Expected status of MAC configuration.

    ${data}=  Create Dictionary  data=${mac_addr}

    Run Keyword And Ignore Error  OpenBMC Put Request
    ...  ${NETWORK_MANAGER}eth0/attr/MACAddress  data=${data}

    # After any modification on network interface, BMC restarts network
    # module, wait until it is reachable.

    Wait For Host To Ping  ${OPENBMC_HOST}
    ...  ${NETWORK_TIMEOUT}  ${NETWORK_RETRY_TIME}

    # Verify whether new MAC address is populated on BMC system.
    # It should not allow to configure invalid settings.

    ${status}=  Run Keyword And Return Status
    ...  Validate MAC On BMC  ${mac_addr}

    Run Keyword If  '${expected_result}' == 'error'
    ...      Should Be Equal  ${status}  ${False}
    ...      msg=Allowing the configuration of an invalid MAC.
    ...  ELSE
    ...      Should Be Equal  ${status}  ${True}
    ...      msg=Not allowing the configuration of a valid MAC.

