*** 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}
