*** 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}  witherspoon1
    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}
    ...  witherspoon1


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="networ-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}

