*** Settings ***
Documentation    Test suite to verify BIOS POST code log entries.

Resource         ../../../lib/resource.robot
Resource         ../../../lib/bmc_redfish_resource.robot
Resource         ../../../lib/openbmc_ffdc.robot
Resource         ../../../lib/logging_utils.robot

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


*** Variables ***
${max_view_count}    1000


*** Test Cases ***

Test PostCodes When Host Boots
    [Documentation]  Boot the system and verify PostCodes from host are logged.
    [Tags]  Test_PostCodes_When_Host_Boots

    Redfish Power On
    ${post_code_list}=  Redfish Get PostCodes
    Rprint Vars  post_code_list

    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    Log To Console  BIOS POST Codes count: ${post_codes['Members@odata.count']}
    Should Be True  ${post_codes['Members@odata.count']} >= 1  msg=No BIOS POST Codes populated.


Test PostCodes When Host Reboot
    [Documentation]  Initiate Host reboot the system and verify PostCodes from host are logged.
    [Tags]  Test_PostCodes_When_Host_Reboot

    # Boot to runtime and clear post codes.
    Redfish Power On  stack_mode=skip
    Redfish Clear PostCodes

    RF SYS GracefulRestart
    ${post_code_list}=  Redfish Get PostCodes
    Rprint Vars  post_code_list

    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    Log To Console  BIOS POST Codes count: ${post_codes['Members@odata.count']}
    Should Be True  ${post_codes['Members@odata.count']} >= 1  msg=No BIOS POST Codes populated.


Test PostCodes When Host Powered Off
    [Documentation]  Power off the system and verify PostCodes from host are logged.
    [Tags]  Test_PostCodes_When_Host_Powered_Off

    # Boot to runtime and clear post codes.
    Redfish Power On  stack_mode=skip
    Redfish Clear PostCodes

    Redfish Power Off
    ${post_code_list}=  Redfish Get PostCodes
    Rprint Vars  post_code_list

    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    Log To Console  BIOS POST Codes count: ${post_codes['Members@odata.count']}
    Should Be True  ${post_codes['Members@odata.count']} == 0
    ...  msg=BIOS POST Codes populated.


Test PostCode Id Value Incremented On Host Reboot
    [Documentation]  Verify the value of ID in postcode entry is incremented
    ...  on host reboot. In the ID value 'B2-49', '2' represents
    ...  the boot cycle count of the host system.
    [Tags]  Test_PostCode_Id_Value_Incremented_On_Host_Reboot
    [Setup]  Populate PostCode Logs Incase No Prior Entries Available

    # Get boot count of current postcode logs.
    ${initial_boot_count}=  Get Boot Count For Last PostCode Entry
    ${expected_boot_count}=  Evaluate  ${initial_boot_count} + 1

    # Perform host reboot and verify boot count incremented in ID value.
    RF SYS GracefulRestart
    ${current_boot_count}=  Get Boot Count For Last PostCode Entry
    Should Be True  ${current_boot_count} == ${expected_boot_count}


Test PostCode Log Perisistency After BMC Reboot
    [Documentation]  Verify the post code log entries persist after BMC reboot.
    [Tags]  Test_PostCode_Log_Perisistency_After_BMC_Reboot
    [Setup]  Populate PostCode Logs Incase No Prior Entries Available

    Redfish Power On  stack_mode=skip

    # Get log count before BMC reboot.
    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    ${initial_log_count}=  Set Variable  ${post_codes['Members@odata.count']}

    # Reboot BMC.
    OBMC Reboot (run)

    # Get log count after BMC reboot and compare with initial log count.
    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    ${current_log_count}=  Set Variable  ${post_codes['Members@odata.count']}
    Should Be True  ${current_log_count} == ${initial_log_count}


Test Clear Post Code Log Action
    [Documentation]  Verify clear log action for post code entries.
    [Tags]  Test_Clear_Post_Code_Log_Action
    [Setup]  Populate PostCode Logs Incase No Prior Entries Available

    # Perform clear postcode log action.
    Redfish Clear PostCodes
    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries

    # Verify if log count becomes zero.
    Should Be True  ${post_codes['Members@odata.count']} == 0
    ...  msg=BIOS POST code logs not cleared.


*** Keywords ***

Test Setup Execution
    [Documentation]  Do test setup operation.

    Redfish.Login
    Redfish Clear PostCodes


Test Teardown Execution
    [Documentation]  Do test teardown operation.

    FFDC On Test Case Fail


Suite Setup Execution
    [Documentation]  Do suite setup operation.

    Redfish.Login
    Redfish Power Off  stack_mode=skip

    Run Keyword And Ignore Error  Redfish Delete All BMC Dumps
    Run Keyword And Ignore Error  Redfish Purge Event Log
    Run Keyword And Ignore Error  Delete All Redfish Sessions


Suite Teardown Execution
    [Documentation]  Do suite teardown operation.

    Run Keyword And Ignore Error  Redfish Delete All BMC Dumps
    Run Keyword And Ignore Error  Redfish Purge Event Log
    Run Keyword And Ignore Error  Delete All Redfish Sessions


Get Boot Count For Last PostCode Entry
    [Documentation]  Get the latest boot count from post code log entry.
    ...  log entry has ID "B2-1000", latest boot count "2" is returned.

    # {
    #     "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries",
    #     "@odata.type": "#LogEntryCollection.LogEntryCollection",
    #     "Description": "Collection of POST Code Log Entries",
    #     "Members": [
    #         {
    #             "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries/B1-1000",
    #             "@odata.type": "#LogEntry.v1_8_0.LogEntry",
    #             "Created": "1970-01-01T00:16:40+00:00",
    #             "EntryType": "Event",
    #             "Id": "B2-1000",
    #             "Message": "Boot Count: 2; Time Stamp Offset: 117.4928 seconds; POST Code: 0xac10",
    #             "MessageArgs": [
    #                 "2",
    #                 "117.4928",
    #                 "0xac10"
    #             ],
    #             "MessageId": "OpenBMC.0.2.BIOSPOSTCode",
    #             "Name": "POST Code Log Entry",
    #             "Severity": "OK"
    #         }
    #     ],
    #     "Members@odata.count": 2240,
    #     "Members@odata.nextLink": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries?$skip=1000",
    #     "Name": "BIOS POST Code Log Entries"
    # }
    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    ${total_log_count}=  Set Variable  ${post_codes['Members@odata.count']}

    IF  ${total_log_count} > ${max_view_count}
        ${skip_count}=  Evaluate  (${total_log_count}//${max_view_count})*${max_view_count}
        ${uri}=  Set Variable
        ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries?$skip=${skip_count}
        ${post_codes}=  Redfish.Get Properties  ${uri}
    END

    ${last_id}=  Set Variable  ${post_codes['Members'][-1]['Id']}
    ${last_id}=  Split String  ${last_id}  -
    ${boot_count}=  Set Variable  ${last_id[0][1]}

    Return From Keyword  ${boot_count}


Populate PostCode Logs Incase No Prior Entries Available
    [Documentation]  Trigger Redfish graceful restart action on host system
    ...  to populate postcode logs if there are no prior log entries.

    ${post_codes}=  Redfish.Get Properties
    ...  /redfish/v1/Systems/system/LogServices/PostCodes/Entries
    Run Keyword If  ${post_codes['Members@odata.count']} == 0
    ...  RF SYS GracefulRestart

