Add new force tags for test suites

Comments:
   - Added new tags for the test suites

Tested:
   - NA

Change-Id: Ibd7eb9e821290c44bd1255d47a52e596e6135cbf
Signed-off-by: George Keishing <gkeishin@in.ibm.com>
diff --git a/redfish/task_service/test_tasks_service.robot b/redfish/task_service/test_tasks_service.robot
new file mode 100644
index 0000000..73d959b
--- /dev/null
+++ b/redfish/task_service/test_tasks_service.robot
@@ -0,0 +1,278 @@
+*** 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
+
+Force Tags          Tasks_Service
+
+*** 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/${MANAGER_ID}/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_PATH}
+    ${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}