| *** Settings *** | 
 |  | 
 | Documentation       Test task service and tasks URI functionality of OpenBMC. | 
 |  | 
 | Library             OperatingSystem | 
 |  | 
 | Resource            ../../lib/resource.robot | 
 | Resource            ../../lib/bmc_redfish_resource.robot | 
 | Resource            ../../lib/dump_utils.robot | 
 | Resource            ../../lib/openbmc_ffdc.robot | 
 |  | 
 | Suite Setup         Suite Setup Execution | 
 | Suite Teardown      Suite Teardown Execution | 
 | Test Teardown       FFDC On Test Case Fail | 
 |  | 
 | *** Variables *** | 
 | ${TIME_REGEXP_PATTERN}   (.+)[\\-|\\+]\\d\\d\\:\\d\\d | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | Verify Task Service Attributes | 
 |     [Documentation]  Validate attributes and default values in task service URI. | 
 |     [Tags]  Verify_Task_Service_Attributes | 
 |  | 
 |     # { | 
 |     #     "@odata.id": "/redfish/v1/TaskService", | 
 |     #     "@odata.type": "#TaskService.v1_1_4.TaskService", | 
 |     #     "CompletedTaskOverWritePolicy": "Oldest", | 
 |     #     "DateTime": "2022-08-08T06:04:11+00:00", | 
 |     #     "Id": "TaskService", | 
 |     #     "LifeCycleEventOnTaskStateChange": true, | 
 |     #     "Name": "Task Service", | 
 |     #     "ServiceEnabled": true, | 
 |     #     "Status": { | 
 |     #         "Health": "OK", | 
 |     #         "HealthRollup": "OK", | 
 |     #         "State": "Enabled" | 
 |     #     }, | 
 |     #     "Tasks": { | 
 |     #         "@odata.id": "/redfish/v1/TaskService/Tasks" | 
 |     #     } | 
 |     # } | 
 |  | 
 |     ${resp}=  Redfish.Get Properties  /redfish/v1/TaskService | 
 |  | 
 |     # Verify CompletedTaskOverWritePolicy is a valid value. | 
 |     Should Be True | 
 |     ...  '${resp["CompletedTaskOverWritePolicy"]}' in ${allowed_completed_task_overwrite_policy} | 
 |  | 
 |     # Verify service enabled property. | 
 |     Should Be Equal  ${resp["ServiceEnabled"]}  ${TRUE} | 
 |  | 
 |     # Verify status. | 
 |     Dictionaries Should Be Equal  ${resp["Status"]}  ${valid_status} | 
 |  | 
 |     # Get current time from BMC console. | 
 |     ${cur_time}=  Get Current Date from BMC | 
 |  | 
 |     # Remove offset from task service time. | 
 |     ${bmc_time}=  Get Regexp Matches  ${resp["DateTime"]} | 
 |     ...  ${TIME_REGEXP_PATTERN}  1 | 
 |  | 
 |     ${time_diff}=  Subtract Date From Date  ${cur_time}  ${bmc_time[0]} | 
 |     ...  date1_format=%m/%d/%Y %H:%M:%S  date2_format=%Y-%m-%dT%H:%M:%S | 
 |  | 
 |     # Compare system time and time displayed in task service URI. | 
 |     ${time_diff}=  Evaluate  ${time_diff} < 5 | 
 |  | 
 |     Should Be Equal  ${time_diff}  ${TRUE} | 
 |     ...  Time Difference between BMC time and time displayed in task URI is higher. | 
 |  | 
 |  | 
 | Test Generated Task Instance Validity And Task State | 
 |     [Documentation]  Trigger a Redfish event that generates task instance and | 
 |     ...  verify the values of generated task instance. | 
 |     [Tags]  Test_Generated_Task_Instance_Validity_And_Task_State | 
 |  | 
 |     # { | 
 |     #     "@odata.id": "/redfish/v1/TaskService/Tasks/3", | 
 |     #     "@odata.type": "#Task.v1_4_3.Task", | 
 |     #     "Id": "3", | 
 |     #     "Messages": [ | 
 |     #         { | 
 |     #             "@odata.type": "#Message.v1_0_0.Message", | 
 |     #             "Message": "The task with id 3 has started.", | 
 |     #             "MessageArgs": [ | 
 |     #                 "3" | 
 |     #             ], | 
 |     #             "MessageId": "TaskEvent.1.0.1.TaskStarted", | 
 |     #             "Resolution": "None.", | 
 |     #             "Severity": "OK" | 
 |     #         } | 
 |     #     ], | 
 |     #     "Name": "Task 3", | 
 |     #     "Payload": { | 
 |     #         "HttpHeaders": [ | 
 |     #             "User-Agent: PostmanRuntime/7.26.8", | 
 |     #             "Accept: */*", | 
 |     #             "Host: 10.0.123.113", | 
 |     #             "Accept-Encoding: gzip, deflate, br", | 
 |     #             "Connection: keep-alive", | 
 |     #             "Content-Length: 41" | 
 |     #         ], | 
 |     #         "HttpOperation": "POST", | 
 |     #         "JsonBody": "{\n  \"DiagnosticDataType\": \"Manager\"\n}", | 
 |     #         "TargetUri": "/redfish/v1/Managers/bmc/LogServices/Dump/Actions | 
 |     #                      /LogService.CollectDiagnosticData" | 
 |     #     }, | 
 |     #     "PercentComplete": 0, | 
 |     #     "StartTime": "2022-08-09T12:57:06+00:00", | 
 |     #     "TaskMonitor": "/redfish/v1/TaskService/Tasks/3/Monitor", | 
 |     #     "TaskState": "Running", | 
 |     #     "TaskStatus": "OK" | 
 |     # } | 
 |  | 
 |     # Trigger a Redfish event that generates task instance. | 
 |     ${task_id}  ${resp_obj}=  Generate Task Instance | 
 |  | 
 |     # Verify task monitor before task completion. | 
 |     ${resp}=  Redfish.Get  /redfish/v1/TaskService/Tasks/${task_id}/Monitor | 
 |     ...  valid_status_codes=[${HTTP_ACCEPTED}] | 
 |  | 
 |     # Get current time from BMC console before generating task. | 
 |     ${cur_time}=  Get Current Date from BMC | 
 |  | 
 |     # Verify task start time is within 10s of current time. | 
 |     ${resp}=  Redfish.Get Properties  /redfish/v1/TaskService/Tasks/${task_id} | 
 |  | 
 |     ${start_time}=  Get Regexp Matches  ${resp["StartTime"]} | 
 |     ...  ${TIME_REGEXP_PATTERN}  1 | 
 |  | 
 |     # Compare system time and time displayed in task service URI. | 
 |     ${time_diff}=  Subtract Date From Date  ${cur_time}  ${start_time[0]} | 
 |     ...  date1_format=%m/%d/%Y %H:%M:%S  date2_format=%Y-%m-%dT%H:%M:%S | 
 |  | 
 |  | 
 |     ${time_diff}=  Evaluate  ${time_diff} < 10 | 
 |     Should Be Equal  ${time_diff}  ${TRUE}  Time difference greater than 10 seconds. | 
 |  | 
 |     # Verify HttpOperation in task payload. | 
 |     Should Be Equal  ${resp["Payload"]["HttpOperation"]}  POST | 
 |  | 
 |     # Verify TargetUri. | 
 |     Should Be Equal  ${resp["Payload"]["TargetUri"]} | 
 |     ...  ${resp_obj.request.path} | 
 |  | 
 |     Wait For Task Completion  ${task_id}  ${allowed_task_completion_state} | 
 |     ...  check_state=${TRUE} | 
 |  | 
 |     # Verify task monitor URI after task completion. | 
 |     ${resp}=  Redfish.Get  /redfish/v1/TaskService/Tasks/${task_id}/Monitor | 
 |     ...  valid_status_codes=[${HTTP_NOT_FOUND}] | 
 |  | 
 |     # Verify end time is greater than start time post task completion. | 
 |     ${resp}=  Redfish.Get Properties  /redfish/v1/TaskService/Tasks/${task_id} | 
 |  | 
 |     ${end_time}=  Get Regexp Matches  ${resp["EndTime"]} | 
 |     ...  ${TIME_REGEXP_PATTERN}  1 | 
 |  | 
 |     # Compare start time and end time displayed in task service URI. | 
 |     ${time_diff}=  Subtract Date From Date  ${end_time[0]}  ${start_time[0]} | 
 |  | 
 |     ${time_diff}=  Evaluate  ${time_diff} >= 0 | 
 |  | 
 |     Should Be Equal  ${time_diff}  ${TRUE} | 
 |     ...  End time not greater than start time. | 
 |  | 
 |  | 
 | Verify Task Persistency Post BMC Reboot | 
 |     [Documentation]  Verify task collection persistency post BMC reboot. | 
 |     [Tags]  Verify_Task_Persistency_Post_BMC_Reboot | 
 |  | 
 |     Verify Generate Task Instance Completion | 
 |  | 
 |     ${initial_task_count}=  Redfish.Get Attribute  /redfish/v1/TaskService/Tasks | 
 |     ...  Members@odata.count | 
 |  | 
 |     Redfish BMC Reset Operation  reset_type=ForceRestart | 
 |  | 
 |     ${current_task_count}=  Redfish.Get Attribute  /redfish/v1/TaskService/Tasks | 
 |     ...  Members@odata.count | 
 |  | 
 |     Should Be Equal As Integers  ${initial_task_count}  ${current_task_count} | 
 |  | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Suite Setup Execution | 
 |     [Documentation]  Do suite setup operation. | 
 |  | 
 |     Redfish.login | 
 |     Load Task Service Properties Data | 
 |  | 
 |  | 
 | Suite Teardown Execution | 
 |     [Documentation]  Do suite teardown operation. | 
 |  | 
 |     Run Keyword And Ignore Error  Redfish.Logout | 
 |     Close All Connections | 
 |  | 
 |  | 
 | Generate Task Instance | 
 |     [Documentation]  Trigger Redfish event to generate task instance | 
 |     ...  and return the task id. | 
 |     [Arguments]  ${task_type}=bmc_dump | 
 |  | 
 |     # Description of argument(s): | 
 |     # task_type         Default value for task_type is bmc_dump. When 'task_type' | 
 |     #                   is 'bmc_dump', then keyword will initiate bmc user dump | 
 |     #                   creation and will return the task id and response object. | 
 |  | 
 |     IF  '${task_type}' == 'bmc_dump' | 
 |         ${task_id}  ${resp}=  Create BMC User Dump | 
 |     ELSE | 
 |         Fail  Task type "${task_type}" is unknown. | 
 |     END | 
 |  | 
 |     Return From Keyword  ${task_id}  ${resp} | 
 |  | 
 |  | 
 | Verify Generate Task Instance Completion | 
 |     [Documentation]  Trigger Redfish event to generate task and wait until | 
 |     ...  task gets completed. | 
 |     [Arguments]  ${task_type}=bmc_dump | 
 |  | 
 |     # Description of argument(s): | 
 |     # task_type         If 'task_type' set as 'bmc_dump', the keyword will | 
 |     #                   initiate bmc user dump creation and wait until | 
 |     #                   task is completed. Default value of task_type | 
 |     #                   is bmc_dump. | 
 |  | 
 |     ${task_id}  ${resp}=  Generate Task Instance  ${task_type} | 
 |     Wait For Task Completion  ${task_id}  ${allowed_task_completion_state} | 
 |  | 
 |  | 
 | Load Task Service Properties Data | 
 |     [Documentation]  Load the task service related properties from json file. | 
 |  | 
 |     # User input -v TASK_JSON_FILE_PATH:<path> else default path. | 
 |     ${task_json_file}=  Get Variable Value  ${TASK_JSON_FILE_PATH}  data/task_state.json | 
 |  | 
 |     ${json}=  OperatingSystem.Get File  ${task_json_file} | 
 |     ${properties}=  Evaluate  json.loads('''${json}''')  json | 
 |  | 
 |     Set Suite Variable  ${allowed_completed_task_overwrite_policy} | 
 |     ...  ${properties["TaskService"]["CompletedTaskOverWritePolicy"]["AllowedValues"]} | 
 |  | 
 |     Set Suite Variable  ${allowed_task_state} | 
 |     ...  ${properties["Task"]["TaskState"]["AllowedValues"]} | 
 |  | 
 |     Set Suite Variable  ${allowed_task_completion_state} | 
 |     ...  ${properties["Task"]["TaskState"]["AllowedCompletionTaskState"]} | 
 |  | 
 |     Set Suite Variable  ${valid_status} | 
 |     ...  ${properties["TaskService"]["Status"]} | 
 |  | 
 |  | 
 | Get Current Date from BMC | 
 |     [Documentation]  Runs the date command from BMC and returns current date and time. | 
 |  | 
 |     # Get Current Date from BMC | 
 |     ${date}  ${stderr}  ${rc}=  BMC Execute Command   date | 
 |  | 
 |     # Split the string and remove first and 2nd last value from | 
 |     # the list and join to form %d %b %H:%M:%S %Y date format. | 
 |  | 
 |    ${date}=  Split String  ${date} | 
 |  | 
 |     Remove From List  ${date}  0 | 
 |     Remove From List  ${date}  -2 | 
 |     ${date}=  Evaluate  " ".join(${date}) | 
 |  | 
 |     # Convert the date format to %m/%d/%Y %H:%M:%S | 
 |     ${date}=  Convert Date  ${date}  date_format=%b %d %H:%M:%S %Y  result_format=%m/%d/%Y %H:%M:%S  exclude_millis=True | 
 |  | 
 |     [Return]   ${date} |