Added new script for IPMI POH Counter Support

POH (Power-On Hours) counter has the incremental count of power ON hours of the system.

Request and Response data defined under data/ipmi_raw_cmd_table.py

Testcases added -
- Get POH Counter Command Via IPMI
- Verify Get POH Counter With Invalid Data Request Via IPMI
- Verify POH Counter Reading With Wait Time
- Verify POH Counter Reading With Host Power Off
- Verify POH Counter Reading With Host Power On

Script compares Minutes per count and Counter reading for the above scenarios.

Minutes per count usually 60 minutes.

Wait Time given - 1 hour in host powered on state, 1 hour 30 minutes when Host power OFF, 1 hour after Host Power ON

Comparison between Initial POH Counter reading and reading after wait time / Power operation.

Tested: Run robot ipmi/test_ipmi_poh_counter.robot

Signed-off-by: chithrag <chithrag@ami.com>
Change-Id: I0137f42cc4af215abfdeef6ad0d9004e9dd2d2dc
diff --git a/ipmi/test_ipmi_poh_counter.robot b/ipmi/test_ipmi_poh_counter.robot
new file mode 100644
index 0000000..8f2ff85
--- /dev/null
+++ b/ipmi/test_ipmi_poh_counter.robot
@@ -0,0 +1,163 @@
+*** Settings ***
+Documentation       This suite tests IPMI POH Counter Support in OpenBMC.
+...                 Feature: IPMI POH Counter Support
+...
+...                 POH (Power-On Hours) counter is the incremental count of power ON hours in the system.
+...
+...                 Request and Response data defined under data/ipmi_raw_cmd_table.py
+...
+...                 Testcases added -
+...                 Get POH Counter Command Via IPMI
+...                 Verify Get POH Counter With Invalid Data Request Via IPMI
+...                 Verify POH Counter Reading With Wait Time
+...                 Verify POH Counter Reading With Host Power Off
+...                 Verify POH Counter Reading With Host Power On
+...
+...                 Script compares Minutes per count and Counter reading for the above scenarios.
+...
+...                 Minutes per count usually 60 minutes.
+...
+...                 Wait Time given - 1 hour, 1 hour 30minutes when Host power OFF, 1 hour after Host Power ON
+...
+...                 Comparison between Initial POH Counter reading and reading after wait time / Power operation.
+
+
+Library             Collections
+Library             ../lib/ipmi_utils.py
+Resource            ../lib/ipmi_client.robot
+Resource            ../lib/openbmc_ffdc.robot
+Variables           ../data/ipmi_raw_cmd_table.py
+
+Suite Setup      Suite Setup Execution
+Suite Teardown   Suite Teardown Execution
+
+Test Teardown    FFDC On Test Case Fail
+
+
+*** Variables ***
+
+
+*** Test Cases ***
+
+Get POH Counter Command Via IPMI
+    [Documentation]  Verify get POH counter command Via IPMI.
+    [Tags]  Get_POH_Counter_Command_Via_IPMI
+
+    # Verify get POH counter command via IPMI.
+    ${resp}=  Run IPMI Command
+    ...  ${IPMI_RAW_CMD['Get']['POH_Counter'][0]}
+    Should Not Contain  ${resp}  ${IPMI_RAW_CMD['Get']['POH_Counter'][1]}
+
+
+Verify Get POH Counter With Invalid Data Request Via IPMI
+    [Documentation]  Verify get POH counter with invalid data request via IPMI.
+    [Tags]  Verify_Get_POH_Counter_With_Invalid_Data_Request_Via_IPMI
+
+    # verify get POH counter command with invalid data request Via IPMI.
+    ${resp}=  Run Keyword and Expect Error  *Request data length invalid*
+    ...  Run IPMI Command  ${IPMI_RAW_CMD['Get']['POH_Counter'][0]} 0x00
+
+
+Verify POH Counter Reading With Wait Time
+    [Documentation]  Verify POH counter reading with wait time via IPMI.
+    [Tags]  Verify_POH_Counter_Reading_With_Wait_Time
+
+    # Get initial POH command counter reading.
+    ${poh_counter_1}=  Run Get POH Command And Return Counter Reading
+
+    # Sleep for given time.
+    Sleep  1h
+
+    # Get POH Counter Reading after waiting for given time period.
+    ${poh_counter_2}=  Run Get POH Command And Return Counter Reading
+
+    # Verify difference between initial and present counter readings.
+    # The counter reading should always be incremented by 1 for each hour.
+    ${difference}=  Evaluate   ${poh_counter_2} - ${poh_counter_1}
+    Should Be Equal As Integers  ${difference}  1
+
+
+Verify POH Counter Reading With Host Power Off
+    [Documentation]  Verify POH counter reading with wait time after host power off.
+    [Tags]  Verify_POH_Counter_Reading_With_Host_Power_Off
+
+    # Get initial POH command counter reading.
+    ${poh_counter_1}=  Run Get POH Command And Return Counter Reading
+
+    # Power off the system.
+    IPMI Power Off
+
+    # Sleep for given time.
+    Sleep  1 hours 30 minutes
+
+    # Get POH counter reading after waiting for given time period.
+    ${poh_counter_2}=  Run Get POH Command And Return Counter Reading
+
+    # Once the system is powered off,
+    # the poh counter reading should not increment.
+    Should Be Equal As Integers  ${poh_counter_2}  ${poh_counter_1}
+
+
+Verify POH Counter Reading With Host Power On
+    [Documentation]  Verify Get POH Counter with wait time after host power on.
+    [Tags]  Verify_POH_Counter_Reading_With_Host_Power_On
+
+    # Get initial POH command counter reading.
+    ${poh_counter_1}=  Run Get POH Command And Return Counter Reading
+
+    # Power on the system.
+    IPMI Power On
+
+    # Sleep for given time.
+    Sleep  1h
+
+    # Get POH Counter reading after waiting for given time period.
+    ${poh_counter_2}=  Run Get POH Command And Return Counter Reading
+
+    # Once the system is powered on,
+    # the pon counter reading should increment by 1.
+    ${difference}=  Evaluate   ${poh_counter_2} - ${poh_counter_1}
+    Should Be Equal As Integers  ${difference}  1
+
+
+*** Keywords ***
+
+Run Get POH Command And Return Counter Reading
+    [Documentation]  Run the IPMI command to Get POH Counter.
+
+    # Get POH counter Via IPMI.
+    ${resp}=  Run IPMI Command
+    ...  ${IPMI_RAW_CMD['Get']['POH_Counter'][0]}
+
+    # Verify Minutes per count.
+    ${data}=  Split String  ${resp}
+    Should Be Equal  ${data[0]}  3c
+
+    # Get POH Command counter reading.
+    ${poh_counter_reading}=  Set Variable  ${data[1:]}
+    Reverse List  ${poh_counter_reading}
+    ${poh_counter_reading}=  Evaluate  "".join(${poh_counter_reading})
+    ${poh_counter_reading}=  Convert To Integer  ${poh_counter_reading}  16
+
+    [Return]  ${poh_counter_reading}
+
+
+Suite Setup Execution
+    [Documentation]  Suite Setup Execution.
+
+    Redfish.Login
+
+    # Check Host current status.
+    ${current_host_state}=  Get Host State Via Redfish
+
+    # If Host state is 'On' then the condition will not be executed.
+    # Host may take approx 5 - 6 minutes to complete power ON process.
+    Run Keyword If  '${current_host_state}' == 'Off'
+    ...  IPMI Power On
+
+
+Suite Teardown Execution
+    [Documentation]  Suite Teardown Execution.
+
+    IPMI Power On
+    Redfish.Logout