*** 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
