Automation: Enable / Disable Watchdog

Added following testcases
- Disable Watchdog Timer And Verify Attributes
- Enable Watchdog Timer And Verify Attributes
- Modify And Verify Watchdog Timer Interval
- Modify And Verify Watchdog TimeRemaining
- Verify Watchdog URL When Host Is On And Off

Resolves openbmc/openbmc-test-automation#691

Change-Id: Ia074b4a149a96f84b11a0e78e764c38cae9e0812
Signed-off-by: Sridevi Ramesh <sridevra@in.ibm.com>
diff --git a/data/variables.py b/data/variables.py
index e5306ea..e975b35 100644
--- a/data/variables.py
+++ b/data/variables.py
@@ -36,6 +36,7 @@
 BMC_STATE_URI = '/xyz/openbmc_project/state/bmc0/'
 HOST_STATE_URI = '/xyz/openbmc_project/state/host0/'
 CHASSIS_STATE_URI = '/xyz/openbmc_project/state/chassis0/'
+HOST_WATCHDOG_URI = '/xyz/openbmc_project/watchdog/host0/'
 
 # Logging URI variables
 BMC_LOGGING_URI = '/xyz/openbmc_project/logging/'
diff --git a/extended/test_watchdog.robot b/extended/test_watchdog.robot
new file mode 100644
index 0000000..31381af
--- /dev/null
+++ b/extended/test_watchdog.robot
@@ -0,0 +1,130 @@
+*** Settings ***
+Documentation          This suite tests HOST watchdog timer in Open BMC.
+
+Resource               ../lib/rest_client.robot
+Resource               ../lib/openbmc_ffdc.robot
+Resource               ../lib/utils.robot
+Resource               ../lib/resource.txt
+Resource               ../lib/boot_utils.robot
+
+Suite Setup            Watchdog Timer Test Setup
+Suite Teardown         Restore Watchdog Default Setting
+Test Teardown          FFDC On Test Case Fail
+
+*** Variables ***
+# "skip" boots that aren't needed to get to desired state.
+${stack_mode}  skip
+
+*** Test Cases ***
+Verify Watchdog Setting With Watchdog Disabled
+    [Documentation]  Disable watchdog timer and verify watchdog settings
+    ...              i.e Enabled, Interval, TimeRemaining.
+    [Tags]  Verify_Watchdog_Setting_With_Watchdog_Disabled
+
+    ${initial_interval}=  Read Attribute  ${HOST_WATCH_DOG_URI}  Interval
+    Set Watchdog Setting Using REST  Enabled  ${False}
+
+    # Check if watchdog has default settings.
+    ${properties}=  Read Properties  /xyz/openbmc_project/watchdog/host0
+    Should Be Equal As Strings  ${properties["Enabled"]}  0
+    Should Be Equal As Strings  ${properties["Interval"]}  ${initial_interval}
+    Should Be Equal As Strings  ${properties["TimeRemaining"]}  0
+
+Verify Watchdog Setting With Watchdog Enabled
+    [Documentation]  Enable watchdog timer and check if host OS is rebooted
+    ...              and verify hostdog settings are reset to default when
+    ...              host OS is up.
+    [Tags]  Verify_Watchdog_Setting_With_Watchdog_Enabled
+
+    ${initial_interval}=  Read Attribute  ${HOST_WATCHDOG_URI}  Interval
+
+    Trigger Host Watchdog Error  2000  60
+
+    # Verify if watchdog settings are enabled and timeremaining is reduced.
+    ${properties}=  Read Properties  /xyz/openbmc_project/watchdog/host0
+    Should Be Equal As Strings  ${properties["Enabled"]}  1
+    Should Not Be Equal As Strings  ${properties["TimeRemaining"]}  0
+
+    Wait Until Keyword Succeeds  120 sec  20 sec  Is Host Rebooted
+    Wait For Host To Ping  ${OS_HOST}  5min  10
+    Wait for OS
+
+    # Check if watchdog settings are reset when host OS is up.
+    ${properties}=  Read Properties  /xyz/openbmc_project/watchdog/host0
+    Should Be Equal As Strings  ${properties["Enabled"]}  0
+    Should Be Equal As Strings  ${properties["Interval"]}  ${initial_interval}
+    Should Be Equal As Strings  ${properties["TimeRemaining"]}  0
+
+Modify And Verify Watchdog Timer Interval
+    [Documentation]  Modify and verify watchdog timer interval.
+    [Tags]  Modify_And_Verify_Watchdog_Timer_Interval
+    [Teardown]  Set Watchdog Setting Using REST  Interval  ${initial_interval}
+
+    ${initial_interval}=  Read Attribute  ${HOST_WATCHDOG_URI}  Interval
+    ${random_int}=  Evaluate  random.randint(10000, 20000)  modules=random
+    Set Watchdog Setting Using REST  Interval  ${random_int}
+    ${modified_time_interval}=  Read Attribute  ${HOST_WATCHDOG_URI}  Interval
+    Should Be Equal As Strings  ${modified_time_interval}  ${random_int}
+
+Modify and verify Watchdog TimeRemaining
+    [Documentation]  Modify and verify watchdog 'TimeRemaining'.
+    [Tags]  Modify_And_Verify_Watchdog_TimeRemaining
+
+    ${random_int}=  Evaluate  random.randint(10000, 20000)  modules=random
+    Set Watchdog Setting Using REST  TimeRemaining  ${random_int}
+    ${modified_timeremain}=
+    ...  Read Attribute  ${HOST_WATCHDOG_URI}  TimeRemaining
+    Should Not Be Equal As Strings  ${random_int}  ${modified_timeremain}
+
+Verify Watchdog URL When Host Is On And Off
+    [Documentation]  Verify watchdog URL when host is running
+    ...              and when host is off.
+    [Tags]           Verify_Watchdog_URL_When_Host_Is_On_And_Off
+
+    ${resp}=  OpenBMC Get Request  ${HOST_WATCHDOG_URI}
+    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
+
+    REST Power Off
+    ${resp}=  OpenBMC Get Request  ${HOST_WATCHDOG_URI}
+    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND}
+
+*** Keywords ***
+
+Watchdog Timer Test Setup
+    [Documentation]   Do test initialization setup.
+    # Check input parameters & check if host OS is up.
+
+    Should Not Be Empty
+    ...   ${OS_HOST}  msg=You must provide the host name/host IP address.
+    Should Not Be Empty
+    ...   ${OS_USERNAME}  msg=You must provide OS host user name.
+    Should Not Be Empty
+    ...   ${OS_PASSWORD}  msg=You must provide OS host user password.
+
+    # Boot to OS.
+    REST Power On
+
+Restore Watchdog Default Setting
+    [Documentation]  Restore watchdog Default setting.
+
+    # Boot to OS.
+    REST Power On
+    Set Watchdog Setting Using REST  Enabled  ${False}
+
+    Close All Connections
+
+Set Watchdog Setting Using REST
+    [Documentation]  Set watchdog setting using REST with a given input
+    ...              attribute values.
+    [Arguments]  ${setting_name}  ${value}
+
+    # Description of argument(s):
+    # setting_name  The name of the watchdog setting
+    #               (e.g. "Enabled", "Interval", etc.).
+    # value         Watchdog setting value(e.g. "Enabled":boolean,
+    #               "Interval":Integer, "TimeRemaining":Integer)
+
+    ${valueDict}=  Create Dictionary  data=${value}
+    ${resp}=  OpenBMC Put Request  ${HOST_WATCHDOG_URI}/attr/${setting_name}
+    ...       data=${valueDict}
+    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}