*** Settings ***

Documentation    Module to test dcmi get temperature reading functionality.
Resource         ../../lib/ipmi_client.robot
Resource         ../../lib/openbmc_ffdc.robot
Resource         ../../lib/bmc_network_utils.robot
Resource         ../../lib/boot_utils.robot
Variables        ../../data/ipmi_raw_cmd_table.py
Variables        ../../data/dcmi_raw_cmd_table.py
Variables        ../../data/ipmi_variable.py
Library          ../../lib/bmc_network_utils.py
Library          ../../lib/ipmi_utils.py
Library          ../../lib/utilities.py
Library          JSONLibrary

Suite Setup  Suite Setup Execution

Test Tags       DCMI_Get_Temperature_Reading

*** Variables ***

${config_file_name}             dcmi_sensors.json
${dcmi_sensors_info_json_file}  /usr/share/ipmi-providers/${config_file_name}
${client_config_file_path}      ${EXEC_DIR}/${config_file_name}
&{dcmi_sensor_uri}

*** Test Cases ***
Verify Get Temperature Reading Command For Inlet Temperature Sensor
    [Documentation]  Verify IPMI Get Temperature Reading command for inlet temperature sensor.
    [Tags]  Verify_Get_Temperature_Reading_Command_For_Inlet_Temperature_Sensor

    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][1]} 0x00 0x00
    ${ipmi_resp}=  Run IPMI Command  ${cmd}
    Verify Reading With IPMI  ${ipmi_resp}  ${1}  inlet
    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  inlet  ${1}

Verify Get Temperature Reading Command For CPU 0 Temperature Sensor
    [Documentation]  Verify IPMI Get Temperature Reading command for cpu0 temperature sensor.
    [Tags]  Verify_Get_Temperature_Reading_Command_For_CPU_0_Temperature_Sensor

    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][2]} 0x00 0x00
    ${ipmi_resp}=  Run IPMI Command  ${cmd}
    Verify Reading With IPMI  ${ipmi_resp}  ${1}  cpu
    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  cpu  ${1}

Verify Get Temperature Reading Command For CPU 1 Temperature Sensor
    [Documentation]  Verify IPMI Get Temperature Reading command for cpu1 temperature sensor.
    [Tags]  Verify_Get_Temperature_Reading_Command_For_CPU_1_Temperature_Sensor

    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][2]} 0x00 0x00
    ${ipmi_resp}=  Run IPMI Command  ${cmd}
    Verify Reading With IPMI  ${ipmi_resp}  ${2}  cpu
    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  cpu  ${2}

Verify Get Temperature Reading Command For Baseboard Temperature Sensor
    [Documentation]  Verify IPMI Get Temperature Reading command for baseboard temperature sensor.
    [Tags]  Verify_Get_Temperature_Reading_Command_For_Baseboard_Temperature_Sensor

    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][3]} 0x00 0x00
    ${ipmi_resp}=  Run IPMI Command  ${cmd}
    Verify Reading With IPMI  ${ipmi_resp}  ${1}  baseboard
    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  baseboard  ${1}

*** Keywords ***
Suite Setup Execution
    [Documentation]  Get dcmi sensors uri from config file.

    IPMI Power On  stack_mode=skip  quiet=1

    # Get this file to client machine /usr/share/ipmi-providers/dcmi_sensors.json
    scp.Open Connection
    ...  ${OPENBMC_HOST}  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}  port=${SSH_PORT}
    scp.Get File  ${dcmi_sensors_info_json_file}  ${EXEC_DIR}
    scp.Close Connection

    ${config_file}=  OperatingSystem.Get File  ${client_config_file_path}
    ${config_file_response}=  Evaluate  json.loads('''${config_file}''')  json

    ${remove_configuration_file}=  Catenate  rm -rf ${client_config_file_path}
    ${rc}  ${output}=  Shell Cmd  ${remove_configuration_file}

    FOR  ${key}  ${value}  IN  &{config_file_response}
      &{tmp}=  Create Dictionary
      FOR  ${response}  IN  @{value}
        ${sensor_dbus}=  Get From Dictionary  ${response}  dbus
        ${instance}=  Get From Dictionary  ${response}  instance
        Set To Dictionary  ${tmp}  ${instance}  ${sensor_dbus}
      END
      Set To Dictionary  ${dcmi_sensor_uri}  ${key}  ${tmp}
    END

Verify Temperature Reading With Dbus URI
    [Documentation]  Verify temperature from ipmi response and json file.
    [Arguments]  ${ipmi_resp}  ${key}  ${instance}

    # Description of argument(s):
    # ipmi_resp         IPMI command response.
    # key               Entity ID description i.e inlet, cpu, baseboard.
    # instance          instance number 1, 2, ..

    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}

    ${get_reading_value}=  Set Variable If
    ...  '${instance}' == '1'  ${3}
    ...  '${instance}' == '2'  ${5}

    ${ipmi_resp_list}=  Split String  ${ipmi_resp}
    ${temperature_reading}=  Get From List  ${ipmi_resp_list}  ${get_reading_value}
    ${temp_reading}=  Convert To Integer  ${temperature_reading}  16
    ${busctl_cmd}=  Catenate  busctl introspect xyz.openbmc_project.HwmonTempSensor ${dbus_uri}
    ${busctl_cmd_resp}=  BMC Execute Command  ${busctl_cmd}
    ${current_temp_value_from_dbus}=  Get Regexp Matches  ${busctl_cmd_resp[0]}
    ...  \\.Value\\s+property\\s+d\\s+(\\S+)\\s  1

    ${min_value}=  Evaluate  ${temp_reading} - 1
    ${max_value}=  Evaluate  ${temp_reading} + 1

Check Reading Value In D-Bus
    [Documentation]  Verify temperature from ipmi response and json file.
    [Arguments]  ${key}  ${instance}  ${dcmi_reading_value}

    # Description of argument(s):
    # key               Entity ID description i.e inlet, cpu, baseboard.
    # instance          instance number 1, 2, ..

    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}

    ${busctl_cmd}=  Catenate  busctl introspect xyz.openbmc_project.HwmonTempSensor ${dbus_uri}
    ${busctl_cmd_resp}=  BMC Execute Command  ${busctl_cmd}
    ${current_temp_value_from_dbus}=  Get Regexp Matches  ${busctl_cmd_resp[0]}
    ...  \\.Value\\s+property\\s+d\\s+(\\S+)\\s  1
    Run Keyword If  '${current_temp_value_from_dbus[0]}' == 'nan' and '${dcmi_reading_value}' == '0'
    ...  Fail  msg=sensor reading value is not present.
    Run Keyword If  '${current_temp_value_from_dbus[0]}' != 'nan' and '${dcmi_reading_value}' == '0'
    ...  Fail  msg=sensor reading value is showing as 0 in dcmi get temperature raw command.
    ${dbus_reading_value}=  Set Variable  .${current_temp_value_from_dbus[0].split(".")[1].strip()}
    ${status}=  Run Keyword And Return Status  Should Be True  ${dbus_reading_value} > .499
    Run Keyword If  ${status} == False
    ...  Fail  msg=sensor reading value is showing wrongly in dcmi get temperature raw command.
    ${dbus_reading_value}=  Set Variable  ${current_temp_value_from_dbus[0].split(".")[0].strip()}
    Should Be Equal  ${dcmi_reading_value}  ${dbus_reading_value}
    ...  msg=sensor reading value is showing wrongly in dcmi get temperature raw command.

Verify Reading With IPMI
    [Documentation]  Verify temperature reading with ipmi command.
    [Arguments]  ${ipmi_resp}  ${instance}  ${key}

    # Description of argument(s):
    # ipmi_resp         IPMI command response.
    # instance          instance number 1, 2, ..
    # key               Entity ID description i.e inlet, cpu, baseboard.

    ${get_reading_value}=  Set Variable If
    ...  '${instance}' == '1'  ${3}
    ...  '${instance}' == '2'  ${5}

    ${ipmi_resp_list}=  Split String  ${ipmi_resp}
    ${temperature_reading}=  Get From List  ${ipmi_resp_list}  ${get_reading_value}
    ${dcmi_reading}=  Convert To Integer  ${temperature_reading}  16
    Run Keyword If  '${dcmi_reading}' == '0'
    ...  Check Reading Value In D-Bus  ${key}  ${instance}  ${dcmi_reading}
    ${dcmi_temp_reading}=  Convert To String  ${dcmi_reading}
    ${ipmi_sensor_cmd_resp}=  Get IPMI Sensor Reading  ${key}  ${instance}
    ${ipmi_sensor_cmd_resp_list}=  Split String  ${ipmi_sensor_cmd_resp}  |
    ${ipmi_temp_reading}=  Set Variable  ${ipmi_sensor_cmd_resp_list[1].strip().split(".")[0]}
    ${reading_status}=  Run Keyword And Return Status  Should Be Equal
    ...  ${dcmi_temp_reading}  ${ipmi_temp_reading}
    Run Keyword If  ${reading_status} == False
    ...  Check Reading Value In D-Bus  ${key}  ${instance}  ${dcmi_temp_reading}

Get IPMI Sensor Reading
    [Documentation]  Return ipmi sensor reading.
    [Arguments]  ${key}  ${instance}

    # Description of argument(s):
    # instance          Entity ID description i.e inlet, cpu, baseboard.
    # index             Selecting the corresponding sensor dbus uri from list.

    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}
    ${sensor_name}=  Set Variable  ${dbus_uri.split('/')[-1]}

    ${sensor_format}=  Run IPMI Standard Command  sensor
    ${sensor_name_status}=  Run Keyword And Return Status  Should Contain
    ...  ${sensor_format}  _

    ${sensor_name}=  Run Keyword If  ${sensor_name_status} == True
    ...    Set Variable  ${sensor_name_dbus}
    ...  ELSE
    ...    Replace String  ${sensor_name}  _  ${SPACE}

    ${ret}=  Run External IPMI Standard Command  sensor | grep -i "${sensor_name}"

    RETURN  ${ret}
