*** Settings ***

Documentation  Test Suite for Supported Fan Modules.

Resource         ../../lib/rest_client.robot
Resource         ../../lib/bmc_redfish_resource.robot
Resource         ../../lib/bmc_redfish_utils.robot
Resource         ../../lib/openbmc_ffdc.robot
Resource         ../../lib/resource.robot
Resource         ../../lib/boot_utils.robot
Library          ../../lib/gen_robot_valid.py
Library          ../../lib/gen_robot_keyword.py

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


*** Variables ***

@{VALID_MODE_VALUES}   DEFAULT  CUSTOM  HEAVY_IO  MAX_BASE_FAN_FLOOR


*** Test Cases ***

Verify Current Fan Thermal Mode
    [Documentation]  Check current thermal fan mode is a valid mode value.
    [Tags]  Verify_Current_Fan_Thermal_Mode

    # Example:
    #  /xyz/openbmc_project/control/thermal/0
    #
    # Response code:200, Content: {
    # "data": {
    #         "Current": "DEFAULT",
    #         "Supported": [
    #           "DEFAULT",
    #           "CUSTOM",
    #           "HEAVY_IO",
    #           "MAX_BASE_FAN_FLOOR"
    #         },
    #         },
    # "message": "200 OK",
    # "status": "ok"
    # }

    ${current}=  Read Attribute  ${THERMAL_CONTROL_URI}  Current
    Rprint Vars  current

    Valid Value  current  valid_values=${VALID_MODE_VALUES}


Verify Supported Fan Thermal Modes Available
    [Documentation]  Check supported fan thermal modes are valid mode values.
    [Tags]  Verify_Supported_Fan_Thermal_Modes_Available

    ${supported}=  Read Attribute  ${THERMAL_CONTROL_URI}  Supported
    Rprint Vars  supported

    Valid List  supported  valid_values=${VALID_MODE_VALUES}


Verify Supported Fan Thermal Modes Switch At Standby
    [Documentation]  Check that supported modes are set successfully at standby.
    [Tags]  Verify_Supported_Fan_Thermal_Modes_Switch_At_Standby
    [Template]  Set and Verify Thermal Mode Switches

    # pre_req_state      thermal_mode_type
    Off                  DEFAULT
    Off                  CUSTOM
    Off                  HEAVY_IO
    Off                  MAX_BASE_FAN_FLOOR


Verify Supported Fan Thermal Modes Switch At Runtime
    [Documentation]  Check that supported modes are set successfully at runtime.
    [Tags]  Verify_Supported_Fan_Thermal_Modes_Switch_At_Runtime
    [Template]  Set and Verify Thermal Mode Switches

    # pre_req_state      thermal_mode
    On                   DEFAULT
    On                   CUSTOM
    On                   HEAVY_IO
    On                   MAX_BASE_FAN_FLOOR


Verify Supported Fan Thermal Mode Remains Set After Boot
    [Documentation]  Check that supported modes remain set at runtime.
    [Tags]  Verify_Supported_Fan_Thermal_Mode_Remains_Set_After_Boot
    [Template]  Set and Verify Thermal Mode After Boot

    # pre_req_state      thermal_mode_type
    Off                  DEFAULT
    Off                  CUSTOM
    Off                  HEAVY_IO
    Off                  MAX_BASE_FAN_FLOOR


*** Keywords ***

Set and Verify Thermal Mode Switches
    [Documentation]  Verify the thermal mode switches successfully at standby or runtime.
    [Arguments]  ${pre_req_state}  ${thermal_mode}

    # Description of Arguments(s):
    # thermal_mode       Read the supported thermal mode (e.g. "CUSTOM")
    # pre_req_state      Set the state of the host to Standby or Runtime (e.g. "Running")

    Run Key U  Redfish Power ${pre_req_state} \ stack_mode=skip \ quiet=1
    Redfish.Login

    ${mode}=  Redfish.Put  ${THERMAL_CONTROL_URI}/attr/Current  body={"data": "${thermal_mode}"}

    ${current}=  Read Attribute  ${THERMAL_CONTROL_URI}  Current
    Should Be Equal As Strings  ${thermal_mode}  ${current}
    ...  msg=The thermal mode does not match the current fan mode.
    Rprint Vars  current


Set and Verify Thermal Mode After Boot
    [Documentation]  Verify the thermal mode remains set at runtime.
    [Arguments]  ${pre_req_state}  ${thermal_mode}

    Set and Verify Thermal Mode Switches  ${pre_req_state}  ${thermal_mode}

    Run Key U  Redfish Power On \ stack_mode=normal \ quiet=1
    Redfish.Login

    ${current}=  Read Attribute  ${THERMAL_CONTROL_URI}  Current
    Should Be Equal As Strings  ${thermal_mode}  ${current}
    ...  msg=The current thermal fan mode switched successfully.
    Rprint Vars  current


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

    Redfish.Logout


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

    Printn
    Redfish.Login


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

    FFDC On Test Case Fail