|  | *** Settings *** | 
|  | Documentation   This suite tests System Vital Product Data (VPD) using vpdtool. | 
|  |  | 
|  | Library         ../../lib/vpd_utils.py | 
|  | Variables       ../../data/vpd_variables.py | 
|  | Resource        ../../lib/openbmc_ffdc.robot | 
|  |  | 
|  | Test Teardown   FFDC On Test Case Fail | 
|  |  | 
|  |  | 
|  | *** Variables *** | 
|  |  | 
|  | ${CMD_GET_PROPERTY_INVENTORY}  busctl get-property xyz.openbmc_project.Inventory.Manager | 
|  | ${DR_WRITE_VALUE}              XYZ Component | 
|  | ${PN_WRITE_VALUE}              XYZ1234 | 
|  | ${SN_WRITE_VALUE}              ABCD12345678 | 
|  |  | 
|  | *** Test Cases *** | 
|  |  | 
|  | Verify System VPD | 
|  | [Documentation]  Verify system VPD details via vpdtool '-i' option. | 
|  | [Tags]  Verify_System_VPD | 
|  |  | 
|  | ${vpd_records}=  Vpdtool  -i | 
|  |  | 
|  | ${components}=  Get Dictionary Keys  ${vpd_records} | 
|  | FOR  ${component}  IN  @{components} | 
|  | Verify VPD Data  ${vpd_records}  ${component} | 
|  | END | 
|  |  | 
|  |  | 
|  | Verify VPD Component Read | 
|  | [Documentation]  Verify details of VPD component via vpdtool. | 
|  | [Tags]  Verify_VPD_Component_Read | 
|  |  | 
|  | ${components}=  Get Dictionary Keys  ${VPD_DETAILS} | 
|  | FOR  ${component}  IN  @{components} | 
|  | Verify VPD Component Read Operation  ${component} | 
|  | END | 
|  |  | 
|  |  | 
|  | Verify VPD Field Read | 
|  | [Documentation]  Verify reading VPD field value via vpdtool. | 
|  | [Tags]  Verify_VPD_Field_Read | 
|  |  | 
|  | ${components}=  Get Dictionary Keys  ${VPD_DETAILS} | 
|  | FOR  ${component}  IN  @{components} | 
|  | Verify VPD Field Read Operation  ${component} | 
|  | END | 
|  |  | 
|  |  | 
|  | Verify VPD Field Write | 
|  | [Documentation]  Verify writing VPD field value via vpdtool. | 
|  | [Tags]  Verify_VPD_Field_Write | 
|  |  | 
|  | ${components}=  Get Dictionary Keys  ${VPD_DETAILS} | 
|  | FOR  ${component}  IN  @{components} | 
|  | # VPD fields "DR", "CC" and "FN" will be added later. | 
|  | @{vpd_fields}=  Create List  SN  PN | 
|  | ${field}=  Evaluate  random.choice($vpd_fields)  random | 
|  | Verify VPD Field Write Operation  ${component}  ${field} | 
|  | END | 
|  |  | 
|  |  | 
|  | *** Keywords *** | 
|  |  | 
|  | Verify VPD Data | 
|  | [Documentation]  Verify VPD data of given component. | 
|  | [Arguments]  ${vpd_records}  ${component} | 
|  | # Description of arguments: | 
|  | # vpd_records     All VPD data Via vpdtool. | 
|  | # component       VPD component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  |  | 
|  | # Verification of "CC" and "FN" will be added later. | 
|  | @{vpd_fields}=  Create List  DR  LocationCode  SN  PN | 
|  | FOR  ${field}  IN  @{vpd_fields} | 
|  | ${busctl_field}=  Set Variable If | 
|  | ...  '${field}' == 'DR'  xyz.openbmc_project.Inventory.Item PrettyName | 
|  | ...  '${field}' == 'LocationCode'  com.ibm.ipzvpd.Location LocationCode | 
|  | ...  '${field}' == 'PN'  xyz.openbmc_project.Inventory.Decorator.Asset PartNumber | 
|  | ...  '${field}' == 'SN'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber | 
|  |  | 
|  | ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY} /xyz/openbmc_project/inventory${component} | 
|  | ...  ${busctl_field} | 
|  | ${cmd_output}=  BMC Execute Command  ${cmd} | 
|  | # Example of cmd_output: | 
|  | #   [0]:                                            s "ABCD.XY1.1234567-P0" | 
|  | #   [1]: | 
|  | #   [2]:                                            0 | 
|  |  | 
|  | Valid Value  vpd_records['${component}']['${field}']  ['${cmd_output[0].split('"')[1].strip('"')}'] | 
|  | END | 
|  | Valid Value  vpd_records['${component}']['type']  ['${VPD_DETAILS['${component}']['type']}'] | 
|  |  | 
|  |  | 
|  | Verify VPD Component Read Operation | 
|  | [Documentation]  Verify reading VPD details of given component via vpdtool. | 
|  | [Arguments]  ${component} | 
|  | # Description of arguments: | 
|  | # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  |  | 
|  | ${vpd_records}=  Vpdtool  -o -O ${component} | 
|  |  | 
|  | # Example output from 'Vpdtool  -o -O /system/chassis/motherboard/vdd_vrm1': | 
|  | #  [/system/chassis/motherboard/vdd_vrm1]: | 
|  | #    [DR]:                                         CPU POWER CARD | 
|  | #    [type]:                                       xyz.openbmc_project.Inventory.Item.Vrm | 
|  | #    [CC]:                                         E123 | 
|  | #    [FN]:                                         F123456 | 
|  | #    [LocationCode]:                               ABCD.XY1.1234567-P0 | 
|  | #    [SN]:                                         YL2E32010000 | 
|  | #    [PN]:                                         PN12345 | 
|  |  | 
|  | Verify VPD Data  ${vpd_records}  ${component} | 
|  |  | 
|  |  | 
|  | Verify VPD Field Read Operation | 
|  | [Documentation]  Verify reading all VPD fields for given component via vpdtool. | 
|  | [Arguments]  ${component} | 
|  | # Description of arguments: | 
|  | # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  |  | 
|  | # Verification of "CC" and "FN" will be added later. | 
|  | @{vpd_fields}=  Create List  DR  SN  PN | 
|  |  | 
|  | FOR  ${fields}  IN   @{vpd_fields} | 
|  | Verify VPD Field Value  ${component}  ${fields} | 
|  | END | 
|  |  | 
|  |  | 
|  | Verify VPD Field Write Operation | 
|  | [Documentation]  Verify writing VPD fields for given component via vpdtool. | 
|  | [Arguments]  ${component}  ${field} | 
|  | [Teardown]  Restore VPD Value  ${component}  ${field}  ${old_field_value} | 
|  | # Description of arguments: | 
|  | # component       VPD component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  | # field           VPD component field (e.g. PN, SN) | 
|  |  | 
|  | ${vpd_records}=  Vpdtool  -r -O ${component} -R VINI -K ${field} | 
|  | ${old_field_value}=  Set Variable  ${vpd_records['${component}']['${field}']} | 
|  |  | 
|  | ${write_value}=  Set Variable If | 
|  | ...  '${field}' == 'DR'  ${DR_WRITE_VALUE} | 
|  | ...  '${field}' == 'PN'  ${PN_WRITE_VALUE} | 
|  | ...  '${field}' == 'SN'  ${SN_WRITE_VALUE} | 
|  |  | 
|  | Vpdtool  -w -O ${component} -R VINI -K ${field} --value ${write_value} | 
|  |  | 
|  | Verify VPD Field Value  ${component}  ${field} | 
|  |  | 
|  |  | 
|  | Restore VPD Value | 
|  | [Documentation]  Restore VPD's field value of given component. | 
|  | [Arguments]  ${component}  ${field}  ${value} | 
|  | # Description of arguments: | 
|  | # component       VPD component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  | # field           VPD component field (e.g. PN, SN) | 
|  | # value           VPD value to be restore. | 
|  |  | 
|  | Vpdtool  -w -O ${component} -R VINI -K ${field} --value ${value} | 
|  |  | 
|  |  | 
|  | Verify VPD Field Value | 
|  | [Documentation]  Verify VPD field value via vpdtool. | 
|  | [Arguments]  ${component}  ${field} | 
|  | # Description of arguments: | 
|  | # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1). | 
|  | # field           VPD field (e.g. DR, SN, PN) | 
|  |  | 
|  | ${vpd_records}=  Vpdtool  -r -O ${component} -R VINI -K ${field} | 
|  |  | 
|  | ${busctl_field}=  Set Variable If | 
|  | ...  '${field}' == 'DR'  xyz.openbmc_project.Inventory.Item PrettyName | 
|  | ...  '${field}' == 'PN'  xyz.openbmc_project.Inventory.Decorator.Asset PartNumber | 
|  | ...  '${field}' == 'SN'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber | 
|  |  | 
|  | ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY} /xyz/openbmc_project/inventory${component} | 
|  | ...  ${busctl_field} | 
|  | ${cmd_output}=  BMC Execute Command  ${cmd} | 
|  |  | 
|  | Valid Value  vpd_records['${component}']['${field}']  ['${cmd_output[0].split('"')[1].strip('"')}'] |