*** Settings ***
Documentation    Module to test dcmi management controller functionality.
Resource         ../../lib/ipmi_client.robot
Resource         ../../lib/openbmc_ffdc.robot
Resource         ../../lib/bmc_network_utils.robot
Resource         ../../lib/boot_utils.robot
Resource         ../../lib/bmc_redfish_utils.robot
Variables        ../../data/ipmi_raw_cmd_table.py
Variables        ../../data/dcmi_raw_cmd_table.py
Variables        ../../data/ipmi_variable.py
Library          ../../lib/ipmi_utils.py
Library          ../../lib/utilities.py
Library          ../../lib/utils.py
Library          JSONLibrary

Force Tags       DCMI_Management_Controller

*** Variables ***

${hostname_file_path}  /etc/hostname

*** Test Cases ***
Validate IPMI Response Length
    [Documentation]  Check ipmi response length.
    [Tags]  Validate_IPMI_Response_Length

    ${rsp}=  Get DCMI Management Controller Identifier String
    @{ipmi_cmd_rsp_list}=  Split String  ${rsp}
    # ipmi_cmd_rsp_list = ["00", "0a", "00", "01", "02", "03",
    #                      "04", "05", "06", "07", "08", "09"]
    # rsp_length = 10
    # string_length = 0a
    ${rsp_length}=  Get Length  ${ipmi_cmd_rsp_list[2:]}
    ${string_length}=  Get Response Length In Hex  ${rsp_length}

    # ipmi_cmd_rsp_list[1] = 0a
    # string_length = 0a
    # the above condition is equal.
    # suppose if string_length and ipmi_cmd_rsp_list[1] not matches
    #  then it will fails.
    Should Be Equal As Strings  ${ipmi_cmd_rsp_list[1]}  ${string_length}
    ...  msg=Id string length in ipmi response is showing wrongly

Test Hostname Is Same With Management Controller Identifier String
    [Documentation]  Check hostname was verified with get management
    ...              controller identifier string.
    [Tags]  Test_Hostname_Is_Same_With_Management_Controller_Identifier_String

    ${rsp}=  Get DCMI Management Controller Identifier String
    @{ipmi_cmd_rsp_list}=  Split String  ${rsp}
    ${bmc_console_hostname_bytes_list}=  Get Hostname From BMC Console

    Lists Should Be Equal  ${ipmi_cmd_rsp_list[2:]}  ${bmc_console_hostname_bytes_list}
    ...  msg=response get from dcmi get mcid cmd and hostname from "cat /etc/os-release" cmd is not same.

Test Get Management Controller Identifier String
    [Documentation]  Validate set and get mcid string.
    [Tags]  Test_Get_Management_Controller_Identifier_String
    [Setup]  Get Default MCID
    [Teardown]  Set Default MCID

    # Set Hostname via DCMI Management Controller Identifier String Command.
    ${cmd_rsp}=  Set DCMI Management Controller Identifier String
    @{cmd_rsp_list}=  Split String  ${cmd_rsp}
    Run Keyword And Continue On Failure
    ...  Valid Value  cmd_rsp_list[1]  valid_values=['${number_of_bytes_to_write}']

    ${rsp}=  Get DCMI Management Controller Identifier String
    @{ipmi_cmd_rsp_list}=  Split String  ${rsp}

    # Verify number of bytes that was set and id string length are same.
    ${string_length}=  Get Response Length In Hex  ${random_int}
    Run Keyword And Continue On Failure
    ...  Should Be Equal As Strings  ${ipmi_cmd_rsp_list[1]}  ${string_length}
    ...  msg=Number of bytes that was set and id string length are not same.

    # Verify ID String Length and data.
    # ipmi_cmd_rsp_list = ["00", "0a", "00", "01", "02", "03", "04",
    #                      "05", "06", "07", "08", "09"]
    # rsp_length = 10
    # string_length = 0a
    # ipmi_cmd_rsp_list[1] = 0a
    # ipmi_cmd_rsp_list[1] is equal to string_length
    # the above condition is equal.
    # suppose if string_length and ipmi_cmd_rsp_list[1] not matches then
    # it will fails.
    ${rsp_length}=  Get Length  ${ipmi_cmd_rsp_list[2:]}
    ${string_length}=  Get Response Length In Hex  ${rsp_length}
    Run Keyword And Continue On Failure
    ...  Should Be Equal As Strings  ${ipmi_cmd_rsp_list[1]}  ${string_length}
    ...  msg=Id string length in ipmi response is showing wrongly

    # Verify get dcmi management controller identifier string command response
    # and the bytes used for Set DCMI MCID string.
    ${set_dcmi_mcid_cmd}=
    ...  convert_prefix_hex_list_to_non_prefix_hex_list  ${string_hex_list}
    Run Keyword And Continue On Failure
    ...  Lists Should Be Equal  ${ipmi_cmd_rsp_list[2:]}  ${set_dcmi_mcid_cmd}
    ...  msg=Bytes given in dcmi set mcid command and string bytes got from dcmi get mcid command are not same

    # Verify Hostname of cat /etc/hostname and get dcmi management controller identifier string command.
    ${bytes_list}=  Get Hostname From BMC Console
    Run Keyword And Continue On Failure
    ...  Lists Should Be Equal  ${ipmi_cmd_rsp_list[2:]}  ${bytes_list}
    ...  msg=Bytes got from dcmi get mcid command and hostname from "cat /etc/os-release" command is not same.

*** Keywords ***
Get Default MCID
    [Documentation]  Get default mcid.

    ${default_mcid}=  Get DCMI Management Controller Identifier String
    Set Test Variable  ${default_mcid}

Set Default MCID
    [Documentation]  Set default mcid.

    @{ipmi_cmd_rsp_list}=  Split String  ${default_mcid}
    ${number_of_bytes_to_write}=  Set Variable  ${ipmi_cmd_rsp_list[1]}
    ${bytes_in_int}=  Convert To Integer  ${number_of_bytes_to_write}  16
    ${bytes_to_write}=  Evaluate  ${bytes_in_int} + 1
    ${no_of_bytes_to_write}=  Get Response Length In Hex  ${bytes_to_write}
    @{tmp_lst}=  Create List
    FOR  ${bytes}  IN  @{ipmi_cmd_rsp_list[2:]}
      Append To List  ${tmp_lst}  0x${bytes}
    END
    ${default_hex}=  Catenate  @{tmp_lst}

    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['MANAGEMENT_CONTROLLER_IDENTIFIER_STRING']['SET']}
    ...  0x${no_of_bytes_to_write} ${default_hex}
    Run External IPMI Raw Command  ${cmd}

Get DCMI Management Controller Identifier String
    [Documentation]  Get DCMI MCID String.

    ${mcid_get_cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['MANAGEMENT_CONTROLLER_IDENTIFIER_STRING']['GET']}
    ${resp}=  Run External IPMI Raw Command  ${mcid_get_cmd}
    ${resp}=  Strip String  ${resp}  mode=right  characters=${SPACE}00\n

    [Return]  ${resp}

Set DCMI Management Controller Identifier String
    [Documentation]  Set DCMI MCID String.

    # 16 bytes maximum as per dcmi spec
    ${random_int}=  Evaluate  random.randint(1, 15)  modules=random
    ${random_string}=  Generate Random String  ${random_int}
    ${string_hex_list}=  convert_name_into_bytes_with_prefix  ${random_string}
    ${random_hex}=  Catenate  @{string_hex_list}
    ${number_of_random_string}=  Evaluate  ${random_int} + 1
    ${number_of_bytes_to_write}=  Get Response Length In Hex  ${number_of_random_string}

    ${mcid_set_cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['MANAGEMENT_CONTROLLER_IDENTIFIER_STRING']['SET']}
    ...  0x${number_of_bytes_to_write} ${random_hex} 0x00
    ${resp}=  Run External IPMI Raw Command  ${mcid_set_cmd}

    Set Test Variable  ${string_hex_list}
    Set Test Variable  ${random_int}
    Set Test Variable  ${number_of_bytes_to_write}

    [Return]  ${resp}

Get Hostname From BMC Console
    [Documentation]  Get hostname.

    ${cmd}=  Catenate  cat ${hostname_file_path}
    ${bmc_hostname}=  BMC Execute Command  ${cmd}
    ${name}=  Convert To List  ${bmc_hostname}
    ${hostname_bytes}=  convert_name_into_bytes_without_prefix  ${name[0]}

    [Return]  ${hostname_bytes}

Get Response Length In Hex
    [Documentation]  Get response length in hex.
    [Arguments]  ${resp_length}

    ${length}=  Convert To Hex  ${resp_length}
    ${length_1}=  Get Length  ${length}
    ${length_2}=  Set Variable IF
    ...  '${length_1}' == '1'  0${length}
    ...  '${length_1}' != '1'  ${length}
    ${resp_length_3}=  Convert To Lower Case  ${length_2}

    [Return]  ${resp_length_3}
