| *** Settings *** | 
 | Documentation          This suite is for testing System time in Open BMC. | 
 |  | 
 | Resource               ../lib/rest_client.robot | 
 | Resource               ../lib/ipmi_client.robot | 
 | Resource               ../lib/openbmc_ffdc.robot | 
 | Resource               ../lib/state_manager.robot | 
 | Resource               ../lib/resource.robot | 
 |  | 
 | Library                OperatingSystem | 
 | Library                DateTime | 
 |  | 
 | Test Setup             Open Connection And Log In | 
 | Test Teardown          Post Test Case Execution | 
 |  | 
 | Force Tags  Clock_Time | 
 |  | 
 | *** Variables *** | 
 | ${SYSTEM_TIME_INVALID}      01/01/1969 00:00:00 | 
 | ${SYSTEM_TIME_VALID}        02/29/2016 09:10:00 | 
 | ${ALLOWED_TIME_DIFF}        3 | 
 | # Equivalent epoch time for 02/17/2017 04:11:40 | 
 | ${SYSTEM_TIME_VALID_EPOCH}  ${1487304700000000} | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | Get System Time | 
 |     [Documentation]  Get system time using IPMI and verify that it matches | 
 |     ...              with BMC date time. | 
 |     [Tags]  Get_System_Time | 
 |  | 
 |     ${resp}=  Run IPMI Standard Command  sel time get | 
 |     ${ipmidate}=  Convert Date  ${resp}  date_format=%m/%d/%Y %H:%M:%S | 
 |     ...  exclude_millis=yes | 
 |     ${bmcdate}=  Get BMC Time Using IPMI | 
 |     ${diff}=  Subtract Date From Date  ${bmcdate}  ${ipmidate} | 
 |     ${diff}=  Convert To Number  ${diff} | 
 |     Should Be True  ${diff} < ${ALLOWED_TIME_DIFF} | 
 |     ...  Open BMC time does not match with IPMI sel time | 
 |  | 
 |  | 
 | Set Valid System Time | 
 |     [Documentation]  Set system time using IPMI and verify that it is | 
 |     ...              correctly set in BMC. | 
 |     [Tags]  Set_Valid_System_Time | 
 |  | 
 |     Set Time Mode  ${MANUAL_MODE} | 
 |  | 
 |     # Added delay for NTP mode to get disabled fully | 
 |     Sleep  30s | 
 |  | 
 |     ${resp}=  Run IPMI Standard Command  sel time set "${SYSTEM_TIME_VALID}" | 
 |     ${setdate}=  Convert Date  ${SYSTEM_TIME_VALID} | 
 |     ...  date_format=%m/%d/%Y %H:%M:%S  exclude_millis=yes | 
 |     ${bmcdate}=  Get BMC Time Using IPMI | 
 |     ${diff}=  Subtract Date From Date  ${bmcdate}  ${setdate} | 
 |     ${diff}=  Convert To Number  ${diff} | 
 |     Should Be True  ${diff} < ${ALLOWED_TIME_DIFF} | 
 |     ...  Open BMC time does not match with set time | 
 |  | 
 |  | 
 | Set Invalid System Time | 
 |     [Documentation]  Set system time with invalid time using IPMI and verify | 
 |     ...              that it should throw error. | 
 |     [Tags]  Set_Invalid_System_Time | 
 |  | 
 |     Set Time Mode  ${MANUAL_MODE} | 
 |  | 
 |     ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command | 
 |     ...  sel time set "${SYSTEM_TIME_INVALID}" | 
 |     Should Start With  ${msg}  Specified time could not be parsed | 
 |  | 
 | Set System Time with no time | 
 |     [Documentation]  Set system time with no time using IPMI and verify | 
 |     ...              that it should throw error. | 
 |     [Tags]  Set_System_Time_with_no_time | 
 |  | 
 |     Set Time Mode  ${MANUAL_MODE} | 
 |  | 
 |     ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command | 
 |     ...  sel time set "" | 
 |     Should Start With  ${msg}  Specified time could not be parsed | 
 |  | 
 |  | 
 | Set BMC Time With BMC And Manual | 
 |     [Documentation]  Set BMC time when time owner is BMC and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_BMC_Time_With_BMC_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation    Owner          Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${BMC_OWNER}   ${MANUAL_MODE}  ok      Set       Change | 
 |  | 
 |  | 
 | Set BMC Time With Both And Manual | 
 |     [Documentation]  Set BMC time when time owner is Both and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_BMC_Time_With_Both_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |     #Operation    Owner          Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${BOTH_OWNER}  ${MANUAL_MODE}  ok      Set       Change | 
 |  | 
 |  | 
 | Set BMC Time With Split And Manual | 
 |     [Documentation]  Set BMC time when time owner is Split and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_BMC_Time_With_Split_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${SPLIT_OWNER}  ${MANUAL_MODE}  ok      Set       No Change | 
 |  | 
 |  | 
 | Set BMC Time With BMC And NTP | 
 |     [Documentation]  Set BMC time when time owner is BMC and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_BMC_Time_With_BMC_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${BMC_OWNER}    ${NTP_MODE}     error   Not Set   No Change | 
 |  | 
 |  | 
 | Set BMC Time With Host And Manual | 
 |     [Documentation]  Set BMC time when time owner is Host and time mode is | 
 |     ...              Manual. | 
 |     [Tags]  Set_BMC_Time_With_Host_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${HOST_OWNER}   ${MANUAL_MODE}  error   Not Set   No Change | 
 |  | 
 |  | 
 | Set BMC Time With Both And NTP | 
 |     [Documentation]  Set BMC time when time owner is Both and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_BMC_Time_With_Both_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${BOTH_OWNER}   ${NTP_MODE}     error   Not Set   No Change | 
 |  | 
 |  | 
 | Set BMC Time With Split And NTP | 
 |     [Documentation]  Set BMC time when time owner is Split and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_BMC_Time_With_Split_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${SPLIT_OWNER}  ${NTP_MODE}     error   Not Set   No Change | 
 |  | 
 |  | 
 | Set BMC Time With Host And NTP | 
 |     [Documentation]  Set BMC time when time owner is Host and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_BMC_Time_With_Host_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation    Owner           Mode            Status  BMC Time  Host Time | 
 |     Set BMC Time  ${HOST_OWNER}   ${NTP_MODE}     error   Not Set   No Change | 
 |  | 
 |  | 
 | Set Host Time With Host And Manual | 
 |     [Documentation]  Set host time when time owner is host and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_Host_Time_With_Host_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner          Mode            Status  BMC Time  Host Time | 
 |     Set Host Time  ${HOST_OWNER}  ${MANUAL_MODE}  ok      Change    Set | 
 |  | 
 |  | 
 | Set Host Time With Both And NTP | 
 |     [Documentation]  Set host time when time owner is both and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_Host_Time_With_Both_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode           Status  BMC Time   Host Time | 
 |     Set Host Time  ${BOTH_OWNER}   ${NTP_MODE}    error   No Change  Not Set | 
 |  | 
 |  | 
 | Set Host Time With Split And Manual | 
 |     [Documentation]  Set host time when time owner is split and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_Host_Time_With_Split_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode            Status  BMC Time   Host Time | 
 |     Set Host Time  ${SPLIT_OWNER}  ${MANUAL_MODE}  ok      No Change  Set | 
 |  | 
 |  | 
 | Set Host Time With Split And NTP | 
 |     [Documentation]  Set host time when time owner is split and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_Host_Time_With_Split_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode            Status   BMC Time   HOST Time | 
 |     Set Host Time  ${SPLIT_OWNER}  ${NTP_MODE}     ok       No Change  Set | 
 |  | 
 |  | 
 | Set Host Time With BMC And Manual | 
 |     [Documentation]  Set host time when time owner is BMC and time mode is | 
 |     ...              Manual. | 
 |     [Tags]  Set_Host_Time_With_BMC_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode            Status   BMC Time   HOST Time | 
 |     Set Host Time  ${BMC_OWNER}    ${MANUAL_MODE}  error    No Change  Not Set | 
 |  | 
 |  | 
 | Set Host Time With BMC Owner NTP | 
 |     [Documentation]  Set host time when time owner is BMC and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_Host_Time_With_BMC_Owner_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode            Status   BMC Time   HOST Time | 
 |     Set Host Time  ${BMC_OWNER}    ${NTP_MODE}     error    No Change  Not Set | 
 |  | 
 |  | 
 | Set Host Time With Host And NTP | 
 |     [Documentation]  Set host time when time owner is Host and time mode is | 
 |     ...              NTP. | 
 |     [Tags]  Set_Host_Time_With_Host_And_NTP | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner           Mode            Status  BMC Time    Host Time | 
 |     Set Host Time  ${HOST_OWNER}   ${NTP_MODE}     error   Not Change  No Set | 
 |  | 
 |  | 
 | Set Host Time With Both And Manual | 
 |     [Documentation]  Set host time when time owner is both and time mode is | 
 |     ...              manual. | 
 |     [Tags]  Set_Host_Time_With_Both_And_Manual | 
 |     [Template]  Set Time Using REST | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     #Operation     Owner          Mode            Status  BMC Time  Host Time | 
 |     Set Host Time  ${BOTH_OWNER}  ${MANUAL_MODE}  ok      Change    Set | 
 |  | 
 |  | 
 | Set Invalid Time Mode | 
 |     [Documentation]  Set time mode with invalid value using REST and verify | 
 |     ...              that it should throw error. | 
 |     [Tags]  Set_Invalid_Time_Mode | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     ${timemode}= | 
 |     ...  Set Variable  xyz.openbmc_project.Time.Synchronization.Method.abc | 
 |     ${valueDict}=  Create Dictionary  data=${timemode} | 
 |  | 
 |     ${resp}=  OpenBMC Put Request | 
 |     ...  ${TIME_MANAGER_URI}sync_method/attr/TimeSyncMethod  data=${valueDict} | 
 |     ${jsondata}=  to JSON  ${resp.content} | 
 |     Should Be Equal  ${jsondata['status']}  error | 
 |  | 
 |     ${mode}=  Read Attribute  ${TIME_MANAGER_URI}sync_method  TimeSyncMethod | 
 |     Should Not Be Equal  ${mode} | 
 |     ...  xyz.openbmc_project.Time.Synchronization.Method.abc | 
 |  | 
 |  | 
 | Set Invalid Time Owner | 
 |     [Documentation]  Set time owner with invalid value using REST and verify | 
 |     ...              that it should throw error. | 
 |     [Tags]  Set_Invalid_Time_Owner | 
 |     [Teardown]  Run Keywords  Set Time Owner  ${BMC_OWNER}  AND  Post Test Case Execution | 
 |  | 
 |     ${timeowner}=  Set Variable  xyz.openbmc_project.Time.Owner.Owners.xyz | 
 |     ${valueDict}=  Create Dictionary  data=${timeowner} | 
 |  | 
 |     ${resp}=  OpenBMC Put Request | 
 |     ...  ${TIME_MANAGER_URI}owner/attr/TimeOwner  data=${valueDict} | 
 |     ${jsondata}=  to JSON  ${resp.content} | 
 |     Should Be Equal  ${jsondata['status']}  error | 
 |  | 
 |     ${owner}=  Read Attribute  ${TIME_MANAGER_URI}owner  TimeOwner | 
 |     Should Not Be Equal  ${owner}  xyz.openbmc_project.Time.Owner.Owners.xyz | 
 |  | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Get BMC Time Using IPMI | 
 |     [Documentation]  Returns BMC time of the system via IPMI | 
 |  | 
 |     ${stdout}  ${stderr}  ${output}= | 
 |     ...  Execute Command  date "+%m/%d/%Y %H:%M:%S" | 
 |     ...  return_stdout=True  return_stderr= True  return_rc=True | 
 |     Should Be Equal  ${output}  ${0}  msg=${stderr} | 
 |  | 
 |     ${resp}=  Convert Date  ${stdout}  date_format=%m/%d/%Y %H:%M:%S | 
 |     ...  exclude_millis=yes | 
 |     Should Not Be Empty  ${resp} | 
 |     [Return]  ${resp} | 
 |  | 
 |  | 
 | Set Time Owner | 
 |     [Arguments]  ${args} | 
 |     [Documentation]  Set time owner of the system via REST | 
 |  | 
 |     ${timeowner}=  Set Variable  ${args} | 
 |     ${valueDict}=  Create Dictionary  data=${timeowner} | 
 |  | 
 |     ${resp}=  OpenBMC Put Request | 
 |     ...  ${TIME_MANAGER_URI}owner/attr/TimeOwner  data=${valueDict} | 
 |     ${jsondata}=  to JSON  ${resp.content} | 
 |  | 
 |     ${host_state}=  Get Host State | 
 |  | 
 |     Run Keyword If  '${host_state}' == 'Off' | 
 |     ...  Log  System is in off state so owner change will get applied. | 
 |     ...  ELSE   Run keyword | 
 |     ...  Initiate Host PowerOff | 
 |  | 
 |     ${owner}=  Read Attribute  ${TIME_MANAGER_URI}owner  TimeOwner | 
 |     Should Be Equal  ${owner}  ${args} | 
 |  | 
 |     [Return]  ${jsondata['status']} | 
 |  | 
 |  | 
 | Verify Set Time Via REST | 
 |     [Documentation]  Verify set time via REST. | 
 |     [Arguments]  ${target}  ${expected_status} | 
 |     # Description of argument(s): | 
 |     # target           The target of the set time operation: "bmc" or "host". | 
 |     # expected_status  Expected status of set time operation | 
 |  | 
 |     ${time_owner_url}=  Set Variable  ${TIME_MANAGER_URI}${target} | 
 |  | 
 |     ${args}=  Create Dictionary  data=${SYSTEM_TIME_VALID_EPOCH} | 
 |     ${resp}=  OpenBMC Put Request | 
 |     ...  ${time_owner_url}/attr/Elapsed  data=${args} | 
 |     ${jsondata}=  to Json  ${resp.content} | 
 |     Run Keyword If  "${expected_status}" == "ok" | 
 |     ...  Should Not Be Equal As Strings  ${jsondata['message']}  403 Forbidden | 
 |     Should Be Equal As Strings  ${jsondata['status']}  ${expected_status} | 
 |  | 
 |  | 
 | Set Time Mode | 
 |     [Arguments]  ${args} | 
 |     [Documentation]  Set time mode of the system via REST | 
 |  | 
 |     ${timemode}=  Set Variable  ${args} | 
 |     ${valueDict}=  Create Dictionary  data=${timemode} | 
 |  | 
 |     ${resp}=  OpenBMC Put Request | 
 |     ...  ${TIME_MANAGER_URI}sync_method/attr/TimeSyncMethod  data=${valueDict} | 
 |     ${jsondata}=  to JSON  ${resp.content} | 
 |     Sleep  5s | 
 |  | 
 |     ${mode}=  Read Attribute  ${TIME_MANAGER_URI}sync_method  TimeSyncMethod | 
 |     Should Be Equal  ${mode}  ${args} | 
 |  | 
 |  | 
 | Get BMC Time Using REST | 
 |     [Documentation]  Returns BMC time of the system via REST | 
 |     ...              Time Format : epoch time in microseconds | 
 |     ...              e.g 1507809604687329 | 
 |  | 
 |     ${resp}=  Read Attribute  ${TIME_MANAGER_URI}/bmc  Elapsed | 
 |     [Return]  ${resp} | 
 |  | 
 |  | 
 | Get HOST Time Using REST | 
 |     [Documentation]  Returns HOST time of the system via REST | 
 |     ...              Time Format : epoch time in microseconds | 
 |     ...              e.g 1507809604687329 | 
 |  | 
 |     ${resp}=  Read Attribute  ${TIME_MANAGER_URI}/host  Elapsed | 
 |     [Return]  ${resp} | 
 |  | 
 |  | 
 | Set Time Using REST | 
 |     [Arguments]  ${operation}  ${owner}  ${mode}  ${status}  ${bmc_time} | 
 |     ...  ${host_time} | 
 |     [Documentation]  Set BMC or Host time on system via REST. | 
 |     ...              Description of arguments: | 
 |     ...              operation :  Set BMC/Host time | 
 |     ...              owner: Time owner | 
 |     ...              mode:  Time mode | 
 |     ...              status:   Expected status of set BMC time URI | 
 |     ...              bmc_time:   Status of BMC time after operation | 
 |     ...              host_time:  Status of HOST time after operation | 
 |     ...                Set - Given time is set | 
 |     ...                Not Set - Given time is not set | 
 |     ...                Change - time is change | 
 |     ...                No Change - time is not change | 
 |  | 
 |     Set Time Owner  ${owner} | 
 |     Set Time Mode  ${mode} | 
 |  | 
 |     ${setdate}=  Set Variable  ${SYSTEM_TIME_VALID_EPOCH} | 
 |  | 
 |     ${start_time}=  Get Current Date | 
 |  | 
 |     ${old_bmc_time}=  Get BMC Time Using REST | 
 |     ${old_host_time}=  Get HOST Time Using REST | 
 |  | 
 |     Run Keyword If  '${operation}' == 'Set BMC Time' | 
 |     ...  Wait Until Keyword Succeeds  1 min  20 sec  Verify Set Time Via REST | 
 |     ...  bmc  ${status} | 
 |     ...  ELSE IF  '${operation}' == 'Set Host Time' | 
 |     ...  Wait Until Keyword Succeeds  1 min  20 sec  Verify Set Time Via REST | 
 |     ...  host  ${status} | 
 |  | 
 |  | 
 |     ${new_bmc_time}=  Get BMC Time Using REST | 
 |     ${new_host_time}=  Get HOST Time Using REST | 
 |  | 
 |     ${end_time}=  Get Current Date | 
 |     ${time_duration}=  Subtract Date From Date  ${start_time}  ${end_time} | 
 |     ${time_duration}  Evaluate  abs(${time_duration}) | 
 |  | 
 |     # Convert epoch to date format: YYYY-MM-DD hh:mm:ss.mil | 
 |     ${setdate}=  Convert epoch to date  ${setdate} | 
 |     ${new_bmc_time}=  Convert epoch to date  ${new_bmc_time} | 
 |     ${old_bmc_time}=  Convert epoch to date  ${old_bmc_time} | 
 |     ${new_host_time}=  Convert epoch to date  ${new_host_time} | 
 |     ${old_host_time}=  Convert epoch to date  ${old_host_time} | 
 |  | 
 |  | 
 |     ${bmc_diff_set_new}= | 
 |     ...  Subtract Date From Date  ${setdate}  ${new_bmc_time} | 
 |     ${bmc_diff_set_new}=  Evaluate  abs(${bmc_diff_set_new}) | 
 |     ${bmc_diff_old_new}= | 
 |     ...  Subtract Date From Date  ${old_bmc_time}  ${new_bmc_time} | 
 |     ${bmc_diff_old_new}=  Evaluate  abs(${bmc_diff_old_new}) | 
 |  | 
 |     ${host_diff_set_new}= | 
 |     ...  Subtract Date From Date  ${setdate}  ${new_host_time} | 
 |     ${host_diff_set_new}=  Evaluate  abs(${host_diff_set_new}) | 
 |     ${host_diff_old_new}= | 
 |     ...  Subtract Date From Date  ${old_host_time}  ${new_host_time} | 
 |     ${host_diff_old_new}=  Evaluate  abs(${host_diff_old_new}) | 
 |  | 
 |     Run Keyword If   '${bmc_time}' == 'Not Set' | 
 |     ...    Should Be True  ${bmc_diff_set_new} >= ${time_duration} | 
 |     ...  ELSE IF  '${bmc_time}' == 'Set' | 
 |     ...    Should Be True  ${bmc_diff_set_new} <= ${time_duration} | 
 |     ...  ELSE IF  '${bmc_time}' == 'No Change' | 
 |     ...    Should Be True  ${bmc_diff_old_new} <= ${time_duration} | 
 |     ...  ELSE IF  '${bmc_time}' == 'Change' | 
 |     ...    Should Be True  ${bmc_diff_old_new} >= ${time_duration} | 
 |  | 
 |     Run Keyword If  '${host_time}' == 'No Change' | 
 |     ...    Should Be True  ${host_diff_old_new} <= ${time_duration} | 
 |     ...  ELSE IF  '${host_time}' == 'Change' | 
 |     ...    Should Be True  ${host_diff_old_new} >= ${time_duration} | 
 |     ...  ELSE IF  '${host_time}' == 'Not Set' | 
 |     ...    Should Be True  ${host_diff_set_new} >= ${time_duration} | 
 |     ...  ELSE IF  '${host_time}' == 'Set' | 
 |     ...    Should Be True  ${host_diff_set_new} <= ${time_duration} | 
 |  | 
 | Convert epoch to date | 
 |     [Documentation]  Convert epoch time to date format. | 
 |     [Arguments]  ${epoch_time} | 
 |     # Description of argument(s): | 
 |     # epoch_time  epoch time in milliseconds. | 
 |     #             (e.g. 1487304700000000) | 
 |  | 
 |     # Convert epoch_time into floating point number. | 
 |     ${epoch_time}=  Convert To Number  ${epoch_time} | 
 |  | 
 |     # Convert epoch time from microseconds to seconds | 
 |     ${epoch_time_sec}=  Evaluate  ${epoch_time}/1000000 | 
 |  | 
 |     # Convert epoch time to date format: YYYY-MM-DD hh:mm:ss.mil | 
 |     # e.g. 2017-02-16 22:14:11.000 | 
 |     ${date}=  Convert Date  ${epoch_time_sec} | 
 |  | 
 |     [Return]  ${date} | 
 |  | 
 |  | 
 | Post Test Case Execution | 
 |     [Documentation]  Do the post test teardown. | 
 |     ...  1. Capture FFDC on test failure. | 
 |     ...  2. Sets defaults for time mode and owner. | 
 |     ...  3. Close all open SSH connections. | 
 |  | 
 |     FFDC On Test Case Fail | 
 |     Set Time Mode  ${NTP_MODE} | 
 |     Close All Connections |