*** Settings ***
Documentation      Utility keywords for FFDC

Library            String
Library            DateTime
Library            openbmc_ffdc_list.py
Resource           resource.robot
Resource           connection_client.robot
Resource           utils.robot

*** Variables ***

${PRINT_LINE}      ------------------------------------------------------------------------

${MSG_INTRO}       This report contains the following information:
${MSG_DETAIL}      ${\n}\t\t[ Detailed Logs Captured Section ]
${HEADER_MSG}      ${\n}\t\t---------------------------
...                ${\n}\t\t FIRST FAILURE DATA CAPTURE
...                ${\n}\t\t---------------------------
${FOOTER_MSG}      ${\n}${PRINT_LINE} ${\n}

${FFDC_LOG_PATH}   ${EXECDIR}${/}logs${/}
${TEST_HISTORY}    ${FFDC_LOG_PATH}${/}test_history.txt

*** Keywords ***

Get Test Dir and Name
    [Documentation]    SUITE_NAME and TEST_NAME are automatic variables
    ...                and is populated dynamically by the robot framework
    ...                during execution
    ${suite_name}=     Get strip string   ${SUITE_NAME}
    ${suite_name}=     Catenate  SEPARATOR=    ${FFDC_TIME}_   ${suite_name}
    ${test_name}=      Get strip string   ${TEST_NAME}
    ${test_name}=   Catenate  SEPARATOR=  ${FFDC_TIME}_   ${test_name}
    [Return]  ${suite_name}   ${test_name}


Create FFDC Directory
    [Documentation]    Creates directory and report file
    Create Directory   ${FFDC_DIR_PATH}
    Create FFDC Report File


Create FFDC Report File
    [Documentation]     Create a generic file name for ffdc
    Set Suite Variable
    ...  ${FFDC_FILE_PATH}   ${FFDC_DIR_PATH}${/}${FFDC_TIME}_BMC_general.txt
    Create File         ${FFDC_FILE_PATH}


Write Data To File
    [Documentation]     Write data to the ffdc report document
    [Arguments]         ${data}=      ${filepath}=${FFDC_FILE_PATH}
    Append To File      ${filepath}   ${data}


Get Current Time Stamp
    [Documentation]     Get the current time stamp data
    ${cur_time}=    Get Current Date   result_format=%Y-%m-%d %H:%M:%S:%f
    ${cur_time}=    Get strip string   ${cur_time}
    [Return]   ${cur_time}


Header Message
    [Documentation]     Write header message to the report document manifest
    ...                 and return a list of generated files.
    ...                 TEST_NAME, TEST_MESSAGE,SUITE_SOURCE, TEST_DOCUMENTATION
    ...                 are auto variables and are populated dynamically by the
    ...                 robot framework during execution.
    ...                 1. Write opening statement headers message.
    ...                 2. Add test setup and config information.
    ...                 3. Print types of data collection.


    ${ffdc_file_list}=  Create List  ${FFDC_FILE_PATH}
    Return From Keyword If  '${TEST_MODE}'  ${ffdc_file_list}

    ${TEST_NAME}=  Get Variable Value  ${TEST_NAME}
    ${TEST_MESSAGE}=  Get Variable Value  ${TEST_MESSAGE}
    ${TEST_DOCUMENTATION}=  Get Variable Value  ${TEST_DOCUMENTATION}
    Write Data To File  ${HEADER_MSG}
    Write Data To File  ${FOOTER_MSG}
    Write Data To File  Test Suite File\t\t: ${SUITE_NAME} ${\n}
    Write Data To File  Test Case Name\t\t: ${TEST_NAME}${\n}
    Write Data To File  Test Source File\t: ${SUITE_SOURCE}${\n}
    Write Data To File  Failure Time Stamp\t: ${FFDC_TIME}${\n}
    Write Data To File  Test Error Message\t: ${TEST_MESSAGE}${\n}
    Write Data To File  Test Documentation\t:${\n}${TEST_DOCUMENTATION}${\n}
    Write Data To File  ${FOOTER_MSG}

    Test Setup Info

    Write Data To File  ${\n}${MSG_INTRO}${\n}

    # --- FFDC header notes ---
    @{entries}=  Get ffdc cmd index
    FOR  ${index}  IN  @{entries}
        Write Data To File  * ${index.upper()}
        Write Data To File  ${\n}
    END

    Write Data To File  ${MSG_DETAIL}
    [Return]  ${ffdc_file_list}


Write Cmd Output to FFDC File
    [Documentation]      Write cmd output data to the report document
    [Arguments]          ${name_str}   ${cmd}

    Write Data To File   ${FOOTER_MSG}
    Write Data To File   ${ENTRY_INDEX.upper()} : ${name_str}\t
    Write Data To File   Executed : ${cmd}
    Write Data To File   ${FOOTER_MSG}


Test Setup Info
    [Documentation]      BMC IP, Model and other information

    Write Data To File  ${\n}-----------------------${\n}
    Write Data To File  Test Setup Information:
    Write Data To File  ${\n}-----------------------${\n}
    Write Data To File  OPENBMC HOST \t: ${OPENBMC_HOST}${\n}
    ${model_name}=  Get BMC System Model
    Write Data To File  SYSTEM TYPE \t: ${model_name}


Error Logs Should Not Exist
    [Documentation]  Verify that error logs do not exist.

    ${resp}=  OpenBMC Get Request  ${BMC_LOGGING_ENTRY}list  quiet=${1}
    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND}
    ...  msg=Unexpected BMC error log(s) present.


Error Logs Should Exist
    [Documentation]  Verify that error logs exist.

    ${resp}=  OpenBMC Get Request  ${BMC_LOGGING_ENTRY}list  quiet=${1}
    Run Keyword If  ${resp.status_code} != ${HTTP_OK}  Fail
    ...  msg=Expected BMC error log(s) are not present.
