xref: /openbmc/openbmc-test-automation/ipmi/test_ipmi_watchdog.robot (revision 6fb70d98f2f1cb9273ba912deaa2cebe3c23ea86)
1de9356efSleet*** Settings ***
2de9356efSleet
3de9356efSleetDocumentation    Module to test out of band IPMI watchdog functionality.
4de9356efSleetResource         ../lib/ipmi_client.robot
5de9356efSleetResource         ../lib/openbmc_ffdc.robot
6de9356efSleetResource         ../lib/boot_utils.robot
7de9356efSleetLibrary          ../lib/ipmi_utils.py
8de9356efSleetLibrary          String
9de9356efSleetLibrary          Collections
10de9356efSleetVariables        ../data/ipmi_raw_cmd_table.py
11de9356efSleet
12*6fb70d98SMatt FischerTest Tags       IPMI_Watchdog
1387dc442cSGeorge Keishing
14de9356efSleet*** Variables ***
15de9356efSleet
16de9356efSleet${TIMER_DELAY}          3
17011c5f3bSNagarjun B${POWER_STATE_CHANGE}   3
18de9356efSleet
19de9356efSleet*** Test Cases ***
20de9356efSleet
21de9356efSleetTest IPMI Watchdog Timer Does Not Log Bit
22de9356efSleet    [Documentation]  Execute out of band set/get do not log bit for watchdog timer.
23de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Does_Not_Log_Bit
24de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Response Data
25de9356efSleet
26de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
27de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][0]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
28de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][1]}
29de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][3]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
30de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][3]}
31de9356efSleet
32de9356efSleetTest IPMI Watchdog Timer Stop Bit
33de9356efSleet    [Documentation]  Execute out of band set/get stop/resume timer stop bit for watchdog timer.
34de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Stop_Bit
35de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Response Data After Watchdog Expires
36de9356efSleet
37de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
38de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][6]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
39de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][5]}
40de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][9]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
41de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][7]}
42de9356efSleet
43de9356efSleetTest IPMI Watchdog Timer Use Bits
44de9356efSleet    [Documentation]  Execute out of band set/get timer use bits for watchdog timer.
45de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Use_Bits
46de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Response Data
47de9356efSleet
48de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
49de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][12]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
50de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][9]}
51de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][15]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
52de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][11]}
53de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][18]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
54de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][13]}
55de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][21]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
56de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][15]}
57de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][24]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
58de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][17]}
59de9356efSleet
60de9356efSleetTest IPMI Watchdog Timer Pre-Timeout Interrupt Bits
61de9356efSleet    [Documentation]  Execute out of band set/get pre-timeout interrupt bits for watchdog timer.
62de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Pre-Timeout_Interrupt_Bits
63de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Response Data
64de9356efSleet
65de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
66de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][27]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
67de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][19]}
68de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][30]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
69de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][21]}
70de9356efSleet
71de9356efSleetTest IPMI Watchdog Timer Timeout Action Bits
72de9356efSleet    [Documentation]  Execute out of band set/get timer timeout bits for watchdog timer.
73de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Timeout_Action_Bits
74de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Response Data
75de9356efSleet
76de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
77de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][33]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
78de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][23]}
79de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][36]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
80de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][25]}
81de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][39]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
82de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][27]}
83de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][42]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
84de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][29]}
85de9356efSleet
86de9356efSleetTest IPMI Watchdog Timer Timeout Flag Bits
87de9356efSleet    [Documentation]  Execute out of band set/get timer timeout flag bits for watchdog timer.
88de9356efSleet    [Tags]  Test_IPMI_Watchdog_Timer_Timeout_Flag_Bits
89de9356efSleet    [Template]  Execute IPMI Raw Command And Verify Timer Expiration Data
90de9356efSleet
91de9356efSleet    # set_raw_cmd  get_raw_cmd  resp_expect
92de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][45]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
93de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][31]}
94de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][48]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
95de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][33]}
96de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][51]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
97de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][35]}
98de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][54]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
99de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][37]}
100de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][57]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
101de9356efSleet    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][39]}
102de9356efSleet
103de9356efSleet
104de9356efSleetVerify Timer Action For State Change
105de9356efSleet    [Documentation]  Set Watchdog via IPMI raw command and verify timer actions.
10671fd671eSGeorge Keishing    [Tags]  Verify_Timer_Action_For_State_Change
107de9356efSleet    [Template]  Validate Watchdog Timer Actions And SEL Events
108de9356efSleet
109de9356efSleet    # set action command                  power state  SEL event
110df75fea6Sganesanb    ${IPMI_RAW_CMD['Watchdog']['Set'][60]}  ['off']   Power down
111df75fea6Sganesanb    ${IPMI_RAW_CMD['Watchdog']['Set'][63]}  ['on']    Hard reset
112de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][66]}  ['on']    Power cycle
113de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][69]}  ['on']    Timer expired
114de9356efSleet
115de9356efSleet
116de9356efSleetVerify Reset Timer
117de9356efSleet    [Documentation]  Set Watchdog via IPMI raw command and verify Reset Timer functions as expected.
118de9356efSleet    [Tags]  Verify_Reset_Timer
119de9356efSleet
120de9356efSleet    # Check the chassis status.
121de9356efSleet    Power On Host And Verify
122de9356efSleet
123de9356efSleet    # Set Watchdog Timer initCount(0x3530).
124372cd862Sishwaryamathim    Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Set'][72]}
125de9356efSleet
126de9356efSleet    # Get Watchdog Timer.
127372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
128de9356efSleet    Should Contain  ${resp}  ${IPMI_RAW_CMD['Watchdog']['Get'][41]}
129de9356efSleet
130de9356efSleet    @{start_timer_value}=  Split String  ${resp}
131de9356efSleet
132de9356efSleet    # Convert start value to integer.
133de9356efSleet    # Example: Get watchdog response is 0x06 0x24 0x05 0x00 0x64 0x00 0x64 0x00.
134de9356efSleet    # Start_timer_value is bits 6 - 7; set to 0x64 0x00 (100 ms decimal).
135de9356efSleet    # Reverse bits 6 - 7 due to BMC being little endian; new value is 0x00 0x64.
136de9356efSleet    # Convert hex value 0x00 0x64 to integer; start_timer_integer = 100.
137de9356efSleet    ${value}=   Get Slice From List  ${start_timer_value}   6
138de9356efSleet    Reverse List   ${value}
139de9356efSleet    ${start_timer_string}=  Evaluate   "".join(${value})
140de9356efSleet    ${start_timer_integer} =  Convert To Integer 	${start_timer_string}  16
141de9356efSleet
142de9356efSleet    # Delay.
143de9356efSleet    Sleep   ${TIMER_DELAY}
144de9356efSleet
145de9356efSleet    # Get Watchdog Timer before reset watchdog timer.
146372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
147de9356efSleet    Should Contain  ${resp}  ${IPMI_RAW_CMD['Watchdog']['Get'][41]}
148de9356efSleet
149de9356efSleet    FOR    ${1}    IN    ${3}
150de9356efSleet
151de9356efSleet        # Reset Watchdog Timer.
152372cd862Sishwaryamathim        Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
153de9356efSleet        # Delay.
154de9356efSleet        Sleep  ${TIMER_DELAY}
155de9356efSleet        Get Watchdog Timer And Compare To Start Value  ${start_timer_integer}
156de9356efSleet
157de9356efSleet    END
158de9356efSleet
159de9356efSleet
160de9356efSleetVerify Pre-timeout Values
161de9356efSleet    [Documentation]  Set Watchdog Pre-timeout via IPMI raw command and verify via Get Watchdog Timer.
162de9356efSleet    [Tags]  Verify_Pre-timeout_Values
163de9356efSleet    [Template]  Validate Watchdog Pre-timeout
164de9356efSleet
165de9356efSleet    # command                               response
166de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][75]}  ${EMPTY}
167de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][81]}  ${EMPTY}
168de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Get'][0]}   ${IPMI_RAW_CMD['Watchdog']['Get'][43]}
169de9356efSleet
170de9356efSleetVerify Failure For Pre-Timeout Interval Greater Than Initial Count
171de9356efSleet    [Documentation]  Set Watchdog Pre-timeout via IPMI raw command and verify via Get Watchdog Timer.
172de9356efSleet    [Tags]  Verify_Failure_For_Pre-Timeout_Interval_Greater_Than_Initial_Count
173de9356efSleet
174de9356efSleet    # Expected to fail: pre-timeout interval (4000) > initial count (1000).
175de9356efSleet    Run Keyword and Expect Error  *Invalid data field*
176372cd862Sishwaryamathim    ...  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Set'][78]}
177de9356efSleet
178de9356efSleetVerify Invalid Request Data Length
179de9356efSleet    [Documentation]  Set Watchdog via IPMI raw command and verify via Get Watchdog Timer.
180de9356efSleet    [Tags]  Verify_Invalid_Request_Data_Length
181de9356efSleet    [Template]  Watchdog Invalid Request Data Length
182de9356efSleet
183de9356efSleet    # command
184de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][84]}
185de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Set'][87]}
186de9356efSleet    ${IPMI_RAW_CMD['Watchdog']['Get'][45]}
187de9356efSleet
188de9356efSleetVerify Invalid Reset Timer Request Data
189de9356efSleet    [Documentation]  Set Watchdog via IPMI raw command and verify via Get Watchdog Timer.
190de9356efSleet    [Tags]  Verify_Invalid_Reset_Timer_Request_Data
191de9356efSleet
192de9356efSleet    # Reset Watchdog Timer with one extra byte.
193de9356efSleet    Run Keyword and Expect Error  *Request data length*
194372cd862Sishwaryamathim    ...  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][3]}
195de9356efSleet
196de9356efSleet    # Reset BMC.
197372cd862Sishwaryamathim    Run IPMI Standard Command  mc reset cold -N 10 -R 1
198011c5f3bSNagarjun B    Wait Until Keyword Succeeds  ${OPENBMC_REBOOT_TIMEOUT} min  10 sec
199011c5f3bSNagarjun B    ...  Is BMC Operational
200de9356efSleet
201de9356efSleet    # Reset Watchdog Timer without initialized watchdog.
202de9356efSleet    Run Keyword and Expect Error  *Unknown*
203372cd862Sishwaryamathim    ...  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][6]}
204de9356efSleet
205de9356efSleet*** Keywords ***
206de9356efSleet
207de9356efSleetExecute IPMI Raw Command And Verify Response Data After Watchdog Expires
208de9356efSleet    [Documentation]  Execute out of band IPMI raw command and verify response data after watchdog expires.
209de9356efSleet    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
210de9356efSleet    # Description of argument(s):
211de9356efSleet    # set_raw_cmd     The request bytes for the command.
212de9356efSleet    # get_raw_cmd     The response bytes for the command.
213de9356efSleet    # resp_expect     The expected response bytes for the command.
214de9356efSleet
215372cd862Sishwaryamathim    Run IPMI Command  ${set_raw_cmd}
216372cd862Sishwaryamathim    Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
217372cd862Sishwaryamathim    Run IPMI Command  ${set_raw_cmd}
218372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${get_raw_cmd}
219de9356efSleet    Should Contain  ${resp}  ${resp_expect}  msg=Expecting ${resp_expect} but got ${resp}.
220de9356efSleet
221de9356efSleetExecute IPMI Raw Command And Verify Response Data
222de9356efSleet    [Documentation]  Execute out of band IPMI raw command and verify response data.
223de9356efSleet    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
224de9356efSleet
225de9356efSleet    # Description of argument(s):
226de9356efSleet    # set_raw_cmd     The request bytes for the command.
227de9356efSleet    # get_raw_cmd     The response bytes for the command.
228de9356efSleet    # resp_expect     The expected response bytes for the command.
229de9356efSleet
230372cd862Sishwaryamathim    Run IPMI Command  ${set_raw_cmd}
231372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${get_raw_cmd}
232de9356efSleet    Should Contain  ${resp}  ${resp_expect}  msg=Expecting ${resp_expect} but got ${resp}.
233de9356efSleet
234de9356efSleetExecute IPMI Raw Command And Verify Timer Expiration Data
235de9356efSleet    [Documentation]  Execute out of band IPMI raw command and verify timer expiration response data.
236de9356efSleet    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
237de9356efSleet
238de9356efSleet    # Description of argument(s):
239de9356efSleet    # set_raw_cmd        The request bytes for the command.
240de9356efSleet    # get_raw_cmd        The response bytes for the command.
241de9356efSleet    # resp_expect        The expected response bytes for the command.
242de9356efSleet
243372cd862Sishwaryamathim    Run IPMI Command  ${set_raw_cmd}
244372cd862Sishwaryamathim    Run IPMI Command  ${get_raw_cmd}
245372cd862Sishwaryamathim    Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
246372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${get_raw_cmd}
247de9356efSleet    Should Contain  ${resp}  ${resp_expect}  msg=Expecting ${resp_expect} but got ${resp}.
248de9356efSleet
249de9356efSleetValidate Watchdog Timer Actions And SEL Events
250de9356efSleet    [Documentation]  Verify the watchdog timer actions and the associated SEL events.
251de9356efSleet    [Arguments]  ${set_raw_cmd}  ${power_state}  ${sel_event}
252de9356efSleet
253de9356efSleet    # Description of argument(s):
254de9356efSleet    # set_raw_cmd     The set timeout action request bytes for the command.
255de9356efSleet    # power_state     The expected power state of the host.
256de9356efSleet    # sel_event     The response bytes for the command.
257de9356efSleet
258de9356efSleet    # Check the chassis status.
259de9356efSleet    Power On Host And Verify
260de9356efSleet
261de9356efSleet    # Clear SEL.
262de9356efSleet    Run IPMI Standard Command  sel clear
263de9356efSleet
264de9356efSleet    # Set watchdog timer action to perform action.
265372cd862Sishwaryamathim    Run IPMI Command  ${set_raw_cmd}
266de9356efSleet
267de9356efSleet    # Reset Watchdog Timer.
268372cd862Sishwaryamathim    Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
269de9356efSleet
270de9356efSleet    # Delay for power state.
271de9356efSleet    Sleep  ${POWER_STATE_CHANGE}
272de9356efSleet
273011c5f3bSNagarjun B    IF  '${sel_event}' == 'Hard reset' or '${sel_event}' == 'Power cycle'
274011c5f3bSNagarjun B        # If timer expire action is 'Hard Reset' then the host/chassis immediately powering on after
275011c5f3bSNagarjun B        # timer expires. So, verify host is rebooting by expecting that host is unpingable.
276011c5f3bSNagarjun B        Run Keyword If  '${sel_event}' == 'Power cycle'
277011c5f3bSNagarjun B        ...  Wait Until Keyword Succeeds  1 min  10 sec  Verify Host Power State  ['off']
278011c5f3bSNagarjun B        ...  ELSE
279011c5f3bSNagarjun B        ...  Wait Until Keyword Succeeds  20 sec  5 sec  Is Host Unpingable  ${OS_HOST}
280011c5f3bSNagarjun B        Wait Until Keyword Succeeds  5 min  30 sec  Verify Host Power State  ['on']
281011c5f3bSNagarjun B        Wait Until Keyword Succeeds  7 min  30 sec  OS Execute Command  uptime
282011c5f3bSNagarjun B    ELSE
283011c5f3bSNagarjun B        Wait Until Keyword Succeeds  1 min  20 sec  Verify Host Power State  ${power_state}
284011c5f3bSNagarjun B    END
285011c5f3bSNagarjun B
286de9356efSleet    Verify Watchdog Timer Action SEL Event  ${sel_event}
287de9356efSleet
288de9356efSleet
289de9356efSleetVerify Host Power State
290de9356efSleet    [Documentation]   Get host power state using external IPMI command and verify.
291de9356efSleet    [Arguments]  ${power_state}
292de9356efSleet
293de9356efSleet    # Description of argument(s):
294de9356efSleet    # power_state     Value of Host power state: "on" or "off".
295de9356efSleet
296de9356efSleet    ${ipmi_state}=  Get Host State Via External IPMI
297de9356efSleet    Valid Value  ipmi_state  ${power_state}
298de9356efSleet
299de9356efSleetVerify Watchdog Timer Action SEL Event
300de9356efSleet    [Documentation]   Verify_Watchdog_Timer_Action_SEL_Event.
301de9356efSleet    [Arguments]  ${sel_event}
302de9356efSleet
303de9356efSleet    # Description of argument(s):
304de9356efSleet    # sel_event   Text of SEL event after timer action.
305de9356efSleet
306de9356efSleet    ${resp}=  Run IPMI Standard Command  sel elist
307de9356efSleet    ${power_status}=  Get Lines Containing String  ${resp}  Watchdog
308de9356efSleet    Should Contain  ${power_status}  ${sel_event}
309de9356efSleet
310de9356efSleetPower On Host And Verify
311de9356efSleet    [Documentation]   Power the host on and verify.
312de9356efSleet
313de9356efSleet    IPMI Power On  stack_mode=skip  quiet=1
314de9356efSleet    ${ipmi_state}=  Get Host State Via External IPMI
315de9356efSleet    Valid Value  ipmi_state  ['on']
316de9356efSleet
317de9356efSleetWatchdog Invalid Request Data Length
318de9356efSleet    [Documentation]   Verify invalid request bytes for set watchdog returns correct error.
319de9356efSleet    [Arguments]  ${watchdog_command}
320de9356efSleet
321de9356efSleet    # Description of argument(s):
322de9356efSleet    # watchdog_command     The raw watchdog IPMI command request bytes.
323de9356efSleet
324de9356efSleet    Run Keyword and Expect Error  *Request data length*
325372cd862Sishwaryamathim    ...  Run IPMI Command  ${watchdog_command}
326de9356efSleet
327de9356efSleetValidate Watchdog Pre-timeout
328de9356efSleet    [Documentation]   Verify watchdog pre-timeout valid request bytes.
329de9356efSleet    [Arguments]  ${watchdog_command}  ${response}
330de9356efSleet
331de9356efSleet    # Description of argument(s):
332de9356efSleet    # watchdog_command     The raw watchdog IPMI command request bytes.
333de9356efSleet    # response             The expected response bytes.
334de9356efSleet
335372cd862Sishwaryamathim    ${resp}=  Run IPMI Command  ${watchdog_command}
336de9356efSleet    Should Contain  ${resp}  ${response}
337de9356efSleet
338de9356efSleetGet Watchdog Timer And Compare To Start Value
339de9356efSleet    [Documentation]   Get watchdog value, convert to integer, and compare to original start value.
340de9356efSleet    [Arguments]  ${start_timer_integer}
341de9356efSleet
342de9356efSleet    # Description of argument(s):
343de9356efSleet    # start_timer_integer     The initial value for the watchdog timer.
344de9356efSleet
345de9356efSleet    # Get Watchdog Timer.
346372cd862Sishwaryamathim     ${resp}=  Run IPMI Command  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
347de9356efSleet    @{timer_value}=  Split String  ${resp}
348de9356efSleet
349de9356efSleet    # Convert to integer and compare with start value.
350de9356efSleet    # Example: Get watchdog response is 0x06 0x24 0x05 0x00 0x64 0x00 0x64 0x00.
351de9356efSleet    # Start_timer_value is bits 6 - 7; set to 0x64 0x00 (100 ms decimal).
352de9356efSleet    # Reverse bits 6 - 7 due to BMC being little endian; new value is 0x00 0x64.
353de9356efSleet    # Convert hex value 0x00 0x64 to integer; start_timer_integer = 100.
354de9356efSleet    ${value}=   Get Slice From List  ${timer_value}   6
355de9356efSleet    Reverse List   ${value}
356de9356efSleet    ${timer_string}=   Evaluate   "".join(${value})
357de9356efSleet    ${current_timer_integer}=  Convert To Integer  ${timer_string}  16
358de9356efSleet    Should Be True   ${current_timer_integer} < ${start_timer_integer}
359