*** Settings ***
Documentation       Check the indicator LEDs on the system can set the assert
...                 property to the correct state.

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


*** Test Cases ***

Verify LED Lamp Test Asserted At Standby
    [Documentation]  Verify the LED asserted at standby is set to off or blinking.
    [Tags]  Verify_LED_Lamp_Test_Asserted_At_Standby
    [Template]  Set and Verify Lamp LED Indicator

    # pre_req_state     asserted     expected_indicator_led
    Off                 1            Blinking
    Off                 0            Off


Verify LED Lamp Test Asserted At Runtime
    [Documentation]  Verify the LED asserted at runtime is set to off or blinking.
    [Tags]  Verify_LED_Lamp_Test_Asserted_At_Runtime
    [Template]  Set and Verify Lamp LED Indicator

    # pre_req_state     asserted     expected_indicator_led
    On                  1            Blinking
    On                  0            Off


Verify LED Power Supply Units Asserted At Standby
    [Documentation]  Verify the power supply units are asserted at standby to lit or off.
    [Tags]  Verify_LED_Power_Supply_Units_Asserted_At_Standby
    [Template]  Set and Verify LED Indicator

    # pre_req_state     asserted                                        expected_indicator_led
    Off                 "xyz.openbmc_project.Led.Physical.Action.On"    Lit
    Off                 "xyz.openbmc_project.Led.Physical.Action.Off"   Off


Verify LED Power Supply Units Asserted At Runtime
    [Documentation]  Verify the power supply units are asserted at runtime to lit or off.
    [Tags]  Verify_LED_Power_Supply_Units_Asserted_At_Runtime
    [Template]  Set and Verify LED Indicator

    # pre_req_state     asserted                                        expected_indicator_led
    On                  "xyz.openbmc_project.Led.Physical.Action.On"    Lit
    On                  "xyz.openbmc_project.Led.Physical.Action.Off"   Off


*** Keywords ***

Set and Verify Lamp LED Indicator
    [Documentation]  Verify the indicator LED for the group lamp test is asserted.
    [Arguments]  ${pre_req_state}  ${asserted}  ${expected_indicator_led}

    # Description of Arguments(s):
    # pre_req_state           The pre-requisite state of the host to perform the test (e.g. "On")
    # asserted                The assert property that sets the value to 0 - Off or 1 - Blinking (e.g. "1")
    # expected_indicator_led  The expected value of the IndicatorLED attribute for all the
    #                         LEDs after the lamp test is initiated (e.g. "Blinking")

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

    Redfish.Put  ${LED_LAMP_TEST_ASSERTED_URI}attr/Asserted  body={"data":${asserted}}

    # Example result:
    # power_supplies:
    #   [0]:
    #     [MemberId]:                                   powersupply0
    #     [PartNumber]:                                 02CL396
    #     [IndicatorLED]:                               Blinking
    #     [EfficiencyPercent]:                          90
    #     [Status]:
    #       [Health]:                                   OK
    #       [State]:                                    Enabled

    Verify Indicator LEDs  ${expected_indicator_led}


Set and Verify LED Indicator
    [Documentation]  Verify the indicator LED for the power supply units are asserted.
    [Arguments]  ${pre_req_state}  ${asserted}  ${expected_indicator_led}

    # Description of Arguments(s):
    # pre_req_state           The pre-requisite state of the host to perform the test (e.g. "On")
    # asserted                The assert property that sets the value (e.g. "xyz.openbmc_project.Led.Physical.Action.On")
    # expected_indicator_led  The expected value of the IndicatorLED attribute for all the
    #                         power supplies units are initiated (e.g. "Lit")

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

    # Put both power supply LEDs On/Off to check all units are asserted
    Redfish.Put  ${LED_PHYSICAL_PS0_URI}attr/State  body={"data":${asserted}}
    Redfish.Put  ${LED_PHYSICAL_PS1_URI}attr/State  body={"data":${asserted}}

    # Example output:
    # power_supplies:
    #   [0]:
    #     [MemberId]:                                   powersupply0
    #     [IndicatorLED]:                               Lit
    #     [Status]:
    #       [Health]:                                   OK
    #       [State]:                                    Enabled
    #   [1]:
    #     [MemberId]:                                   powersupply1
    #     [IndicatorLED]:                               Lit
    #     [Status]:
    #       [Health]:                                   OK
    #       [State]:                                    Enabled

    Verify Indicator LEDs  ${expected_indicator_led}


Verify Indicator LEDs
    [Documentation]  Verify the LEDs on the power supply units are set according to caller's expectation.
    [Arguments]  ${expected_indicator_led}

    # Description of Arguments(s):
    # expected_indicator_led  The expected value of the IndicatorLED attribute for all the
    #                         LEDs after the lamp test is initiated (e.g. "Blinking")

    ${power_supplies}=  Redfish.Get Attribute  ${REDFISH_CHASSIS_POWER_URI}  PowerSupplies
    Rprint Vars  power_supplies
    FOR  ${power_supply_leds}  IN  @{power_supplies}
        Valid Value  power_supply_leds['IndicatorLED']  [${expected_indicator_led}]
    END


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
