*** Settings ***

Documentation   Test OpenBMC GUI "Network" sub-menu of "Settings".

Resource        ../../lib/gui_resource.robot
Resource        ../../../lib/bmc_network_utils.robot

Suite Setup     Suite Setup Execution
Suite Teardown  Close Browser

*** Variables ***

${xpath_network_heading}          //h1[text()="Network"]
${xpath_interface}                //h2[text()="Interface"]
${xpath_system}                   //h2[text()="System"]
${xpath_static_ipv4}              //h2[text()="IPV4"]
${xpath_static_dns}               //h2[text()="Static DNS"]
${xpath_hostname_input}           //*[@data-test-id="network-input-hostname"]
${xpath_network_save_settings}    //button[@data-test-id="network-button-saveNetworkSettings"]
${xpath_default_gateway_input}    //*[@data-test-id="network-input-gateway"]
${xpath_mac_address_input}        //*[@data-test-id="network-input-macAddress"]
${xpath_static_input_ip0}         //*[@data-test-id="network-input-staticIpv4-0"]
${xpath_static_input_ip1}         //*[@data-test-id="network-input-staticIpv4-1"]
${xpath_add_static_ip}            //button[contains(text(),"Add static IP")]
${xpath_setting_success}          //*[contains(text(),"Successfully saved network settings.")]
${xpath_add_dns_server}           //button[contains(text(),"Add DNS server")]
${xpath_network_interface}        //*[@data-test-id="network-select-interface"]
${xpath_input_netmask_addr0}      //*[@data-test-id="network-input-subnetMask-0"]
${xpath_input_netmask_addr1}      //*[@data-test-id="network-input-subnetMask-1"]
${xpath_delete_static_ip}         //*[@title="Delete IPv4 row"]
${xpath_input_dns_server}         //*[@data-test-id="network-input-dnsAddress-0"]
${xpath_delete_dns_server}        //*[@title="Delete DNS row"]
${xpath_delete_static_ip}         //*[@title="Delete IPv4 row"]

@{static_name_servers}            10.10.10.10
@{null_value}                     null
@{empty_dictionary}               {}
@{string_value}                   aa.bb.cc.dd
@{special_char_value}             @@@.%%.44.11

${test_ipv4_addr}                 10.7.7.7
${test_ipv4_addr2}                10.7.7.8
${test_subnet_mask}               255.255.0.0

# Valid netmask is 4 bytes long and has continuous block of 1s.
# Maximum valid value in each octet is 255 and least value is 0.
# Maximum value of octet in netmask is 255.
${alpha_netmask}                  ff.ff.ff.ff
${out_of_range_netmask}           255.256.255.0
${more_byte_netmask}              255.255.255.0.0
${lowest_netmask}                 128.0.0.0
${test_hostname}                  openbmc

*** Test Cases ***

Verify Navigation To Network Page
    [Documentation]  Verify navigation to network page.
    [Tags]  Verify_Navigation_To_Network_Page

    Page Should Contain Element  ${xpath_network_heading}


Verify Existence Of All Sections In Network Page
    [Documentation]  Verify existence of all sections in network settings page.
    [Tags]  Verify_Existence_Of_All_Sections_In_Network_Page

    Page Should Contain Element  ${xpath_interface}
    Page Should Contain Element  ${xpath_system}
    Page Should Contain Element  ${xpath_static_ipv4}
    Page Should Contain Element  ${xpath_static_dns}
    Page Should Contain Button   ${xpath_delete_static_ip}


Verify Existence Of All Buttons In Network Page
    [Documentation]  Verify existence of all buttons in network page.
    [Tags]  Verify_Existence_Of_All_Buttons_In_Network_Page

    Page Should Contain Element  ${xpath_add_static_ip}
    Page Should Contain Element  ${xpath_add_dns_server}


Verify Network From Server Configuration
    [Documentation]  Verify ability to select "Network" sub-menu option
    ...  of "Settings".
    [Tags]  Verify_Network_From_Server_Configuration

    Page Should Contain  IP address


Verify Hostname Text Configuration
    [Documentation]  Verify hostname text is configurable from "network settings"
    ...  sub-menu.
    [Tags]  Verify_Hostname_Text_Configuration

    Wait Until Element Is Enabled  ${xpath_hostname_input}
    Input Text  ${xpath_hostname_input}  ${test_hostname}
    Click Button  ${xpath_network_save_settings}
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=10
    Wait Until Keyword Succeeds  15 sec  5 sec  Textfield Should Contain  ${xpath_hostname_input}
    ...  ${test_hostname}


Verify Default Gateway Editable
    [Documentation]  Verify default gateway text input allowed from "network
    ...  settings".
    [Tags]  Verify_Default_Gateway_Editable
    [Teardown]  Click Element  ${xpath_refresh_button}

    Wait Until Page Contains Element  ${xpath_default_gateway_input}
    Input Text  ${xpath_default_gateway_input}  10.6.6.7


Verify MAC Address Editable
    [Documentation]  Verify MAC address text input allowed from "network
    ...  settings".
    [Tags]  Verify_MAC_Address_Editable
    [Teardown]  Click Element  ${xpath_refresh_button}

    Wait Until Element Is Enabled  ${xpath_mac_address_input}
    Input Text  ${xpath_mac_address_input}  AA:E2:84:14:28:79


Verify Static IP Address Editable
    [Documentation]  Verify static IP address is editable.
    [Tags]  Verify_Static_IP_Address_Editable
    [Teardown]  Click Element  ${xpath_refresh_button}

    ${exists}=  Run Keyword And Return Status  Wait Until Page Contains Element  ${xpath_static_input_ip0}
    Run Keyword If  '${exists}' == '${False}'
    ...  Click Element  ${xpath_add_static_ip}

    Input Text  ${xpath_static_input_ip0}  ${OPENBMC_HOST}


Verify System Section In Network Setting page
    [Documentation]  Verify hostname, MAC address and default gateway
    ...  under system section of network setting page.
    [Tags]  Verify_System_Section

    ${host_name}=  Redfish_Utils.Get Attribute  ${REDFISH_NW_PROTOCOL_URI}  HostName
    Textfield Value Should Be  ${xpath_hostname_input}  ${host_name}

    ${mac_address}=  Get BMC MAC Address
    Textfield Value Should Be   ${xpath_mac_address_input}  ${mac_address}

    ${default_gateway}=  Get BMC Default Gateway
    Textfield Value Should Be  ${xpath_default_gateway_input}  ${default_gateway}


Verify Network Interface Details
    [Documentation]  Verify network interface name in network setting page.
    [Tags]  Verify_Network_Interface_Details

    ${active_channel_config}=  Get Active Channel Config
    ${ethernet_interface_redfish}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
    ${ethernet_interface_gui}=  Get Text  ${xpath_network_interface}
    Should Contain  ${ethernet_interface_gui}  ${ethernet_interface_redfish}


Verify Network Static IPv4 Details
    [Documentation]  Verify network static IPv4 details.
    [Tags]  Verify_Network_static_IPv4_Details

    @{network_configurations}=  Get Network Configuration
    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    FOR  ${network_configuration}  IN  @{network_configurations}
      List Should Contain Value  ${ip_addresses}  ${network_configuration["Address"]}
    END


Configure Invalid Network Addresses And Verify
    [Documentation]  Configure invalid network addresses and verify.
    [Tags]  Configure_Invalid_Network_Addresses_And_Verify
    [Template]  Configure Invalid Network Address And Verify

    # locator                        invalid_address
    ${xpath_mac_address_input}       A.A.A.A
    ${xpath_default_gateway_input}   a.b.c.d
    ${xpath_static_input_ip0}        a.b.c.d
    ${xpath_input_netmask_addr0}     255.256.255.0


Configure And Verify Empty Network Addresses
    [Documentation]  Configure and verify empty network addresses.
    [Tags]  Configure_And_Verify_Empty_Network_Addresses
    [Template]  Configure Invalid Network Address And Verify

    # locator                       invalid_address  expected_error
    ${xpath_mac_address_input}        ${empty}       Field required
    ${xpath_default_gateway_input}    ${empty}       Field required
    ${xpath_static_input_ip0}         ${empty}       Field required
    ${xpath_input_netmask_addr0}      ${empty}       Field required
    ${xpath_hostname_input}           ${empty}       Field required


Config And Verify DNS Server Via GUI
    [Documentation]  Configure DNS server and verify.
    [Tags]  Config_And_Verify_DNS_Server_Via_GUI
    [Setup]   DNS Test Setup Execution
    [Teardown]   Run Keywords  Delete DNS Server And Verify  ${static_name_servers}
    ...  AND  DNS Test Teardown Execution

    Add DNS Server And Verify  ${static_name_servers}


Delete And Verify DNS Server Via GUI
    [Documentation]  Delete DNS server and verify.
    [Tags]  Delete_And_Verify_DNS_Server_Via_GUI
    [Setup]   Run Keywords  DNS Test Setup Execution  AND
    ...  Add DNS Server And Verify  ${static_name_servers}
    [Teardown]  DNS Test Teardown Execution

    Delete DNS Server And Verify  ${static_name_servers}

Configure And Verify Static IP Address
    [Documentation]  Configure and verify static ip addresses.
    [Tags]  Configure_And_Verify_Static_IP_Address
    [Teardown]  Delete And Verify Static IP Address On BMC  ${test_ipv4_addr}

    Add Static IP Address And Verify  ${test_ipv4_addr}  ${test_subnet_mask}


Configure And Verify Invalid DNS Server
    [Documentation]  Configure invalid DNS server and verify error.
    [Tags]  Configure_And_Verify_Invalid_DNS_Server
    [Template]  Add DNS Server And Verify
    [Setup]  DNS Test Setup Execution
    [Teardown]  Run Keywords  Click Element  ${xpath_refresh_button}
    ...  AND  DNS Test Teardown Execution

    # invalid_ address      expected_status
    ${string_value}         Invalid format
    ${special_char_value}   Invalid format
    ${empty_dictionary}     Field required
    ${null_value}           Invalid format

Modify IP Address And Verify
    [Documentation]  Modify IP address and verify.
    [Tags]  Modify_IP_Address_And_Verify
    [Teardown]  Delete And Verify Static IP Address On BMC  ${test_ipv4_addr2}

    Add Static IP Address And Verify  ${test_ipv4_addr}  ${test_subnet_mask}
    Update IP Address And Verify  ${test_ipv4_addr}  ${test_ipv4_addr2}


Configure Netmask And Verify
    [Documentation]  Configure and verify netmask.
    [Tags]  Configure_And_Verify_Netmask
    [Template]  Add Static IP Address And Verify
    [Teardown]  Run Keywords  Click Element  ${xpath_refresh_button}
    ...  AND  Delete And Verify Static IP Address On BMC  ${test_ipv4_addr}

    # ip_addresses      subnet_masks             expected_status
    ${test_ipv4_addr}   ${lowest_netmask}        Valid format
    ${test_ipv4_addr}   ${more_byte_netmask}     Invalid format
    ${test_ipv4_addr}   ${alpha_netmask}         Invalid format
    ${test_ipv4_addr}   ${out_of_range_netmask}  Invalid format


Configure Hostname And Verify
    [Documentation]  Configure hostname and verify.
    [Tags]  Configure_Hostname_And_Verify
    [Teardown]  Configure And Verify Network Settings
    ...  ${xpath_hostname_input}  ${hostname}

    ${hostname}=  Get Value  ${xpath_hostname_input}
    Configure And Verify Network Settings  ${xpath_hostname_input}  ${test_hostname}


*** Keywords ***

Suite Setup Execution
   [Documentation]  Do test case setup tasks.

    Launch Browser And Login GUI
    Click Element  ${xpath_settings_menu}
    Click Element  ${xpath_network_sub_menu}
    Wait Until Keyword Succeeds  30 sec  10 sec  Location Should Contain  network
    ${host_name}  ${BMC_IP}=  Get Host Name IP  host=${OPENBMC_HOST}
    Set Suite Variable  ${BMC_IP}


Configure Invalid Network Address And Verify
    [Documentation]  Configure invalid network address And verify.
    [Arguments]  ${locator}  ${invalid_address}  ${expected_error}=Invalid format
    [Teardown]  Click Element  ${xpath_refresh_button}

    # Description of the argument(s):
    # locator            Xpath to identify an HTML element on a web page.
    # invalid_address    Invalid address to be added.
    # expected_error     Expected error optionally provided in testcase
    # ....               (e.g. Invalid format / Field required)

    Wait Until Element Is Enabled  ${locator}
    Clear Element Text  ${locator}
    Input Text  ${locator}  ${invalid_address}
    Click Element  ${xpath_network_save_settings}
    Page Should Contain  ${expected_error}


Add DNS Server And Verify
    [Documentation]  Add DNS server on BMC and verify it via BMC CLI.
    [Arguments]  ${static_name_servers}   ${expected_status}=Valid format

    # Description of the argument(s):
    # static_name_servers  A list of static name server IPs to be
    #                      configured on the BMC.
    # expected_status      Expected status while adding DNS server address
    # ...                  (e.g. Invalid format / Field required).

    Wait Until Page Contains Element  ${xpath_add_dns_server}
    ${length}=  Get Length   ${static_name_servers}
    FOR  ${i}  IN RANGE  ${length}
      Click Button  ${xpath_add_dns_server}
      Input Text  //*[@data-test-id="network-input-dnsAddress-${i}"]
      ...  ${static_name_servers}[${i}]
    END

    Click Button  ${xpath_network_save_settings}
    Run keyword if  '${expected_status}' != 'Valid format'
    ...  Run keywords  Page Should Contain  ${expected_status}  AND  Return From Keyword

    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=15
    Sleep  ${NETWORK_TIMEOUT}s
    Verify Static Name Server Details On GUI  ${static_name_servers}
    # Check if newly added DNS server is configured on BMC.
    ${cli_name_servers}=  CLI Get Nameservers
    List Should Contain Sub List  ${cli_name_servers}  ${static_name_servers}


Delete DNS Server And Verify
    [Documentation]  Delete static name servers.
    [Arguments]  ${static_name_servers}

    # Description of the argument(s):
    # static_name_servers  A list of static name server IPs to be
    #                      configured on the BMC.

    ${length}=  Get Length  ${static_name_servers}
    FOR  ${i}  IN RANGE   ${length}
       ${status}=  Run Keyword And Return Status
       ...  Page Should Contain Element  ${xpath_delete_dns_server}
       Exit For Loop If   "${status}" == "False"
       Wait Until Element Is Enabled  ${xpath_delete_dns_server}
       Click Button  ${xpath_delete_dns_server}
    END

    Click Button  ${xpath_network_save_settings}
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=15

    Sleep  ${NETWORK_TIMEOUT}s
    Page Should Not Contain Element  ${xpath_input_dns_server}
    # Check if all name servers deleted on BMC.
    ${nameservers}=  CLI Get Nameservers
    Should Be Empty  ${nameservers}


DNS Test Setup Execution
    [Documentation]  Do DNS test setup execution.

    ${original_name_server}=  CLI Get Nameservers
    Set Suite Variable   ${original_name_server}
    Run Keyword If  ${original_name_server} != @{EMPTY}
    ...  Delete DNS Server And Verify  ${original_name_server}


DNS Test Teardown Execution
    [Documentation]  Do DNS test teardown execution.

    Run Keyword If  ${original_name_server} != @{EMPTY}
    ...  Add DNS Server And Verify  ${original_name_server}


Verify Static Name Server Details On GUI
    [Documentation]  Verify static name servers on GUI.
    [Arguments]   ${static_name_servers}

    # Description of the argument(s):
    # static_name_servers  A list of static name server IPs to be
    #                      configured on the BMC.

    ${length}=  Get Length  ${static_name_servers}
    FOR  ${i}  IN RANGE  ${length}
       Page Should Contain Element  //*[@data-test-id="network-input-dnsAddress-${i}"]
       Textfield Value Should Be   //*[@data-test-id="network-input-dnsAddress-${i}"]
       ...  ${static_name_servers}[${i}]
    END

Add Static IP Address And Verify
    [Documentation]  Add static IP on BMC and verify.
    [Arguments]  ${ip_address}  ${subnet_mask}  ${expected_status}=Valid format

    # Description of argument(s):
    # ip_address          IP address to be added (e.g. 10.7.7.7).
    # subnet_masks        Subnet mask for the IP to be added (e.g. 255.255.0.0).
    # expected_status     Expected status while adding static ipv4 address
    # ....                (e.g. Invalid format / Field required).

    ${available_ip_addresses}=  Get Static IPv4 Addresses From GUI

    # New IP address location is GUI is equivalent to the available IP address
    # in Redfish. i.e. if two IP address are available in GUI then location
    # on IP address in GUI is also 2.
    ${location}=  Get Length  ${available_ip_addresses}
    Wait Until Element Is Enabled  ${xpath_add_static_ip}
    Click Button  ${xpath_add_static_ip}

    Input Text
    ...  //*[@data-test-id="network-input-staticIpv4-${location}"]  ${ip_address}
    Input Text
    ...  //*[@data-test-id="network-input-subnetMask-${location}"]  ${subnet_mask}

    Click Button  ${xpath_network_save_settings}
    Run keyword if  '${expected_status}' != 'Valid format'
    ...  Run keywords  Page Should Contain  ${expected_status}  AND  Return From Keyword
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=15
    Click Element  ${xpath_refresh_button}
    Wait Until Page Contains Element  ${xpath_static_input_ip0}
    Validate Network Config On BMC
    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    Should Contain  ${ip_addresses}  ${ip_address}


Delete And Verify Static IP Address On BMC
    [Documentation]  Delete static IP address and verify
    [Arguments]  ${ip_address}

    # Description of argument(s):
    # ip_address       IP address to be deleted (e.g. "10.7.7.7").

    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    Should Contain  ${ip_addresses}  ${ip_address}  msg=${ip_address} does not exist on BMC

    ${delete_ip_buttons}=  Get WebElements  ${xpath_delete_static_ip}
    FOR  ${location}  IN RANGE  len(${ip_addresses})
       ${gui_ip}=  Get Value  //*[@data-test-id="network-input-staticIpv4-${location}"]
       Run Keyword If  '${gui_ip}' == '${ip_address}' and '${gui_ip}' != '${BMC_IP}'
       ...  Run Keywords  Click Element  ${delete_ip_buttons}[${location}]
       ...  AND  Exit For Loop
    END

    Click Button  ${xpath_network_save_settings}
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=15
    Wait Until Page Contains Element  ${xpath_static_input_ip0}
    Validate Network Config On BMC
    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    Should Not Contain  ${ip_addresses}  ${ip_address}


Update IP Address And Verify
    [Documentation]  Update and verify static IP address on BMC.
    [Arguments]  ${ip}  ${new_ip}

    # Description of argument(s):
    # ip                  IP address to be replaced (e.g. "10.7.7.7").
    # new_ip              New IP address to be configured.

    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    Should Contain  ${ip_addresses}  ${ip}  msg=${ip} does not exist on BMC

    FOR  ${location}  IN RANGE  len(${ip_addresses})
       ${gui_ip}=  Get Value  //*[@data-test-id="network-input-staticIpv4-${location}"]
       Run Keyword If  '${gui_ip}' == '${ip}'
       ...  Run Keywords
       ...  Clear Element Text  //*[@data-test-id="network-input-staticIpv4-${location}"]
       ...  AND  Input Text
       ...  //*[@data-test-id="network-input-staticIpv4-${location}"]  ${new_ip}
       ...  AND  Exit For Loop
    END
    Click Button  ${xpath_network_save_settings}
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=15
    Click Element  ${xpath_refresh_button}
    Wait Until Page Contains Element  ${xpath_static_input_ip0}
    Validate Network Config On BMC
    ${ip_addresses}=  Get Static IPv4 Addresses From GUI
    Should Contain  ${ip_addresses}  ${new_ip}


Get Static IPv4 Addresses From GUI
    [Documentation]  Get static IPV4 addresses from GUI.

    ${availble_ip_addresses}=  Get Network Configuration
    ${static_ipv4_addresses}=  Create List

    FOR   ${locator}   IN RANGE  len(${availble_ip_addresses})
       ${ip_address}=  Get value  //*[@data-test-id="network-input-staticIpv4-${locator}"]
       Append To List  ${static_ipv4_addresses}  ${ip_address}
    END

    [Return]  ${static_ipv4_addresses}


Configure And Verify Network Settings
    [Documentation]  Configure and verify network settings.
    [Arguments]  ${xpath}  ${nw_settings}

    # Description of argument(s):
    # xpath  xpath of the network settings.
    # nw_settings  The mac address, hostname etc.

    Wait Until Element Is Enabled  ${xpath}
    Input Text  ${xpath}  ${nw_settings}
    Click Button  ${xpath_network_save_settings}
    Wait Until Page Contains Element  ${xpath_setting_success}  timeout=10
    Textfield Value Should Be  ${xpath}  ${nw_settings}

