| *** Settings *** | 
 |  | 
 | Documentation    Test firmware boot side switch using pldmtool. | 
 |  | 
 | # Test Procedure: | 
 | # 1. Power off the host or post firmware is updated. | 
 | # 2. Check the firmware boot side ( login to BMC and execute ) | 
 | #    Example: | 
 | #    pldmtool bios GetBIOSAttributeCurrentValueByHandle -a fw_boot_side | 
 | # | 
 | #    It should return response either Temp or Perm | 
 | # 3. Set the firmware boot side to Temp or Perm accordingly | 
 | #    Example: | 
 | #    pldmtool bios SetBIOSAttributeCurrentValue -a fw_boot_side -d Temp | 
 | # | 
 | # 4. Power on | 
 | # 5. BMC take reset during power on ( expected ) | 
 | # 6. Check the system booted to Runtime | 
 | # 7. Verify the boot side is still same which was set. | 
 |  | 
 | Library          Collections | 
 | Library          ../lib/tftp_update_utils.py | 
 | Resource         ../lib/bmc_redfish_resource.robot | 
 | Resource         ../lib/openbmc_ffdc.robot | 
 |  | 
 | Test Setup       Printn | 
 | Test Teardown    FFDC On Test Case Fail | 
 |  | 
 | Test Tags       Firmware_Boot_Side | 
 |  | 
 | *** Variables *** | 
 |  | 
 | # By default 2, to ensure, it performs both Perm and Temp side switch and boot. | 
 | ${LOOP_COUNT}     2 | 
 |  | 
 | # This dictionary is for Temp -> Perm or vice versa in the test code. | 
 | &{FW_BOOT_SIDE_DICT}  Perm=Temp  Temp=Perm | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | Test Firmware Boot Side Using Pldmtool | 
 |     [Documentation]   Power off the host , set the firmware boot side via pldmtool, | 
 |     ...               power on the host and confirm the fw_boot_side attribute is | 
 |     ...               still set. | 
 |     [Tags]  Test_Firmware_Boot_Side_Using_Pldmtool | 
 |     [Template]  Firmware Side Switch Power On Loop | 
 |  | 
 |     # iteration | 
 |     ${LOOP_COUNT} | 
 |  | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Firmware Side Switch Power On Loop | 
 |     [Documentation]   Number of iteration, test should perform switch side and boot. | 
 |     [Arguments]  ${iteration} | 
 |  | 
 |     # Description of argument(s): | 
 |     # iteration      Number of switch it needs to perform. | 
 |  | 
 |     FOR  ${count}  IN RANGE  0  ${iteration} | 
 |         Print Timen  The Current Loop Count is ${count} of ${iteration} | 
 |  | 
 |         # Get the current system state before BMC reset. | 
 |         ${state}=  Get Pre Reboot State | 
 |  | 
 |         Redfish Power Off  stack_mode=skip | 
 |  | 
 |         ${cur_boot_side}=  PLDM Get BIOS Attribute  fw_boot_side | 
 |         Print Timen  Current BIOS attribute fw_boot_side: ${cur_boot_side} | 
 |  | 
 |         ${next_boot_side}=  Set Variable  ${FW_BOOT_SIDE_DICT["${cur_boot_side["CurrentValue"]}"]} | 
 |         Print Timen  Set BIOS attribute fw_boot_side: ${next_boot_side} | 
 |         PLDM Set BIOS Attribute  fw_boot_side  ${next_boot_side} | 
 |  | 
 |         ${cur_boot_side}=  PLDM Get BIOS Attribute  fw_boot_side | 
 |         Print Timen   Next boot will apply BIOS attribute fw_boot_side: ${cur_boot_side} | 
 |  | 
 |         Print Timen  Perform power on operation and expect BMC to take reset. | 
 |         Redfish Power Operation  On | 
 |         Print Timen  Wait for the BMC to take reset and come back online. | 
 |         Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}  wait_state_check=0 | 
 |  | 
 |         Print Timen  BMC rebooted, wait for host to boot to Runtime. | 
 |         # Post BMC reset, host should auto power on back to runtime. | 
 |         Wait Until Keyword Succeeds  ${power_on_timeout}  20 sec | 
 |         ...  Is Boot Progress Runtime Matched | 
 |  | 
 |         # Verify the system is booting up with the new fw_boot_side set. | 
 |         ${cur_boot_side}=  PLDM Get BIOS Attribute  fw_boot_side | 
 |         Should Be Equal As Strings  ${cur_boot_side["CurrentValue"]}  ${next_boot_side} | 
 |         Print Timen  Current: ${cur_boot_side["CurrentValue"]} and set side: ${next_boot_side} are same. | 
 |     END | 
 |  | 
 |  | 
 | Is Boot Progress Runtime Matched | 
 |     [Documentation]  Get BootProgress state and expect boot state mismatch. | 
 |  | 
 |     # Match any of the BootProgress state SystemHardwareInitializationComplete|OSBootStarted|OSRunning | 
 |     ${boot_progress}  ${host_state}=  Redfish Get Boot Progress | 
 |     Should Contain Any  ${boot_progress}  SystemHardwareInitializationComplete  OSBootStarted  OSRunning |