*** Settings ***
Documentation  Test IPMI FRU data.

Resource               ../lib/ipmi_client.robot
Resource               ../lib/openbmc_ffdc.robot
Library                ../lib/ipmi_utils.py


Suite Setup            Suite Setup Execution
Suite Teardown         Suite Teardown Execution
Test Teardown          Test Teardown Execution


*** Variables ***
&{ipmi_redfish_fru_field_map}  board_serial=SerialNumber  board_part_number=PartNumber

*** Test Cases ***

Test FRU Info Of Power Supplies
    [Documentation]  Verify FRU info of power supply via IPMI and Redfish.
    [Tags]  Test_FRU_Info_Of_Power_Supplies

    # IPMI FRU info.
    ${ipmi_fru_component_info}=  Get Component FRU Info  ${COMPONENT_NAME_OF_POWER_SUPPLY}
    ...  ${fru_objs}

    # Redfish FRU info.
    ${redfish_power_details}=  Redfish.Get Properties  /redfish/v1/Chassis/${CHASSIS_ID}/Power
    ${redfish_power_supply_reading}=  Set Variable  ${redfish_power_details['PowerSupplies']}

    Verify IPMI and Redfish subcomponents  ${redfish_power_supply_reading}
    ...  ${ipmi_fru_component_info}

*** Keywords ***

Verify IPMI and Redfish subcomponents
    [Documentation]  Get IPMI And Redfish subcomponents of FRU and verify.
    [Arguments]  ${redfish_fru_info}  ${ipmi_fru_info}

    # Description of argument(s):
    # ${ipmi_fru_info}       IPMI FRU component values.
    # ${redfish_fru_info}    Redfish FRU component values.

    ${sub_component_count}=  Get Length  ${redfish_fru_info}

    # Fetch each subcomponent value of IPMI and Redfish and compare.
    FOR  ${sub_component_index}  IN RANGE  0  ${sub_component_count}
      ${ipmi_fru_sub_component}=
      ...  Get From List  ${ipmi_fru_info}  ${sub_component_index}
      ${redfish_fru_sub_component}=
      ...  Get From List  ${redfish_fru_info}  ${sub_component_index}
      Compare IPMI And Redfish FRU Component  ${ipmi_fru_sub_component}
      ...  ${redfish_fru_sub_component}
    END


Compare IPMI And Redfish FRU Component
    [Documentation]  Compare IPMI And Redfish FRU Component data objects.
    [Arguments]  ${ipmi_fru_component_obj}  ${redfish_fru_component_obj}

    # Description of argument(s):
    # ${ipmi_fru_component_obj}  IPMI FRU component data in dictionary.
    # Example:
    # FRU Device Description : powersupply0 (ID 75)
    # Board Mfg Date        : Sun Dec 31 18:00:00 1995
    # Board Product         : powersupply0
    # Board Serial          : 71G303
    # Board Part Number     : 01KL471
    # ${redfish_fru_component_obj}  Redfish FRU component data in dictionary.
    # Example:
    # "Name": "powersupply0",
    # "PartNumber": "01KL471",
    # "PowerInputWatts": 114.0,
    # "SerialNumber": "71G303",

    # Get key_map from ipmi_redfish_fru_field_map.
    ${key_map}=  Get Dictionary Items   ${ipmi_redfish_fru_field_map}

    FOR    ${key}    ${value}    IN    @{key_map}
      Exit For Loop IF    "${value}" == "${EMPTY}"
      Should Contain  ${redfish_fru_component_obj['${value}']}
      ...  ${ipmi_fru_component_obj['${key}']}
      ...  msg=Comparison failed.
    END


Suite Setup Execution
    [Documentation]  Do test setup initialization.

    ${fru_objs}=  Get Fru Info
    Set Suite Variable  ${fru_objs}
    Redfish.Login


Suite Teardown Execution
    [Documentation]  Do the post suite teardown.

    Redfish.Logout


Test Teardown Execution
    [Documentation]  Do the post test teardown.

    FFDC On Test Case Fail