Automate 7 testcase to verify BIOS attributes using redfish

          - Redfish Verify Set BIOS Integer Attribute Type
          - Redfish Verify Set BIOS String Attribute Type
          - Redfish Verify Set BIOS Attribute With Invalid Attribute Name
          - Redfish Verify Set Invalid Optional Value For BIOS Enumeration Attribute Type
          - Redfish Verify Set Out Of Range Integer Value For BIOS Integer Attribute Type
          - Redfish Verify Set Out Of Range String Value For BIOS String Attribute Type
          - Redfish Verify Restore BIOS Attribute Values

Change-Id: I660b32341d17022db46a1c364fb9436d52b5f603
Signed-off-by: Sridevi Ramesh <sridevra@in.ibm.com>
diff --git a/lib/oem/ibm/bios_attr_utils.robot b/lib/oem/ibm/bios_attr_utils.robot
new file mode 100644
index 0000000..0d67983
--- /dev/null
+++ b/lib/oem/ibm/bios_attr_utils.robot
@@ -0,0 +1,40 @@
+*** Settings ***
+Documentation    Utilities for redfish BIOS attribute operations.
+
+Resource         ../../../lib/resource.robot
+Resource         ../../../lib/bmc_redfish_resource.robot
+Resource         ../../../lib/common_utils.robot
+
+
+*** Keywords ***
+
+Set BIOS Attribute Value And Verify
+
+    [Documentation]  Set BIOS attribute handle with attribute value and verify.
+    [Arguments]      ${attr_handle}  ${attr_val}
+
+    ${type_int}=    Evaluate  isinstance($attr_val, int)
+    ${value}=  Set Variable If  '${type_int}' == '${True}'  ${attr_val}  '${attr_val}'
+
+    Redfish.Patch  ${BIOS_ATTR_SETTINGS_URI}  body={"Attributes":{"${attr_handle}": ${value}}}
+    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
+
+    ${output}=  Redfish.Get Attribute  ${BIOS_ATTR_URI}  Attributes
+    Should Be Equal  ${output['${attr_handle}']}  ${attr_val}
+
+
+Set Optional BIOS Attribute Values And Verify
+
+    [Documentation]  For the given BIOS attribute handle update with optional
+    ...              attribute values and verify.
+    [Arguments]  ${attr_handle}  @{attr_val_list}
+
+    # Description of argument(s):
+    # ${attr_handle}    BIOS Attribute handle (e.g. 'vmi_if0_ipv4_method').
+    # @{attr_val_list}  List of the attribute values for the given attribute handle.
+    #                   (e.g. ['IPv4Static', 'IPv4DHCP']).
+
+    FOR  ${attr}  IN  @{attr_val_list}
+        ${new_attr}=  Evaluate  $attr.replace('"', '')
+        Set BIOS Attribute Value And Verify  ${attr_handle}  ${new_attr}
+    END
diff --git a/redfish/systems/oem/ibm/test_bios_attributes.robot b/redfish/systems/oem/ibm/test_bios_attributes.robot
new file mode 100755
index 0000000..aea9ac6
--- /dev/null
+++ b/redfish/systems/oem/ibm/test_bios_attributes.robot
@@ -0,0 +1,166 @@
+*** Settings ***
+Documentation    This suite test various BIOS attributes operations using Redfish.
+
+Resource         ../../../../lib/resource.robot
+Resource         ../../../../lib/bmc_redfish_resource.robot
+Resource         ../../../../lib/common_utils.robot
+Resource         ../../../../lib/openbmc_ffdc.robot
+Resource         ../../../../lib/oem/ibm/bios_attr_utils.robot
+Library          ../../../../lib/pldm_utils.py
+Variables        ../../../../data/pldm_variables.py
+
+Test Teardown    FFDC On Test Case Fail 
+
+Suite Setup      Redfish BIOS Suite Setup
+Suite Teardown   Redfish BIOS Suite Cleanup
+
+*** Variables ***
+
+${bios_original_data}       ${EMPTY}
+${attr_table_data}          ${EMPTY}
+
+
+*** Test Cases ***
+
+Redfish Verify Set BIOS Attribute With Invalid Attribute Name
+
+    [Documentation]  Verify set BIOS attribute with invalid attribute name using
+    ...              Redfish.
+    [Tags]  Redfish_Verify_Set_BIOS_Attribute_With_Invalid_Attribute_Name
+
+    ${random_str}=  Generate Random String  8  [LETTERS][NUMBERS]
+    Redfish.Patch  ${BIOS_ATTR_SETTINGS_URI}  body={"Attributes":{"${random_str}": '${random_str}'}}
+    ...  valid_status_codes=[${HTTP_BAD_REQUEST}]
+
+
+Redfish Verify Set Invalid Optional Value For BIOS Enumeration Attribute Type
+
+    [Documentation]  Verify set invalid optional value for BIOS enumeration attribute type
+    ...              using Redfish.
+    [Tags]  Redfish_Verify_Set_Invalid_Optional_Value_For_BIOS_Enumeration_Attribute_Type
+
+    ${attr_val_data}=  GetBIOSEnumAttributeOptionalValues  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+    ${enum_attr}=  Evaluate  random.choice(${attr_handles})  modules=random
+
+    Redfish.Patch  ${BIOS_ATTR_SETTINGS_URI}  body={"Attributes":{"${enum_attr}": '0'}}
+    ...  valid_status_codes=[${HTTP_INTERNAL_SERVER_ERROR}]
+
+
+Redfish Verify Set Out Of Range Integer Value For BIOS Integer Attribute Type
+
+    [Documentation]  Verify set out of range integer value for BIOS integer attribute type
+    ...              using Redfish.
+    [Tags]  Redfish_Verify_Set_Out_Of_Range_Integer_Value_For_BIOS_Integer_Attribute_Type
+
+    ${attr_val_data}=  GetBIOSStrAndIntAttributeHandles  BIOSInteger  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+    ${int_attr}=  Evaluate  random.choice(${attr_handles})  modules=random
+    ${count}=  Evaluate  ${attr_val_data['${int_attr}']["UpperBound"]} + 5
+
+    Redfish.Patch  ${BIOS_ATTR_SETTINGS_URI}  body={"Attributes":{"${int_attr}": ${count}}}
+    ...  valid_status_codes=[${HTTP_INTERNAL_SERVER_ERROR}]
+
+
+Redfish Verify Set Out Of Range String Value For BIOS String Attribute Type
+
+    [Documentation]  Verify set out of range string value for BIOS string attribute type
+    ...              using Redfish.
+    [Tags]  Redfish_Verify_Set_Out_Of_Range_String_Value_For_BIOS_String_Attribute_Type
+
+    ${attr_val_data}=  GetBIOSStrAndIntAttributeHandles  BIOSString  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+    ${str_attr}=  Evaluate  random.choice(${attr_handles})  modules=random
+    ${count}=  Evaluate  ${attr_val_data['${str_attr}']["MaximumStringLength"]} + 5
+    ${random_value}=  Generate Random String  ${count}  [LETTERS][NUMBERS]
+
+    Redfish.Patch  ${BIOS_ATTR_SETTINGS_URI}  body={"Attributes":{"${str_attr}": '${random_value}'}}
+    ...  valid_status_codes=[${HTTP_INTERNAL_SERVER_ERROR}]
+
+
+Redfish Verify Set BIOS String Attribute Type
+
+    [Documentation]  Verify set BIOS string attribute type for various BIOS
+    ...              attribute handle with random values with in the range using Redfish.
+    [Tags]  Redfish_Verify_Set_BIOS_String_Attribute_Type
+
+    ${attr_val_data}=  GetBIOSStrAndIntAttributeHandles  BIOSString  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+    FOR  ${i}  IN  @{attr_handles}
+        ${random_value}=  GetRandomBIOSIntAndStrValues  ${i}  ${attr_val_data['${i}']["MaximumStringLength"]}
+        Set BIOS Attribute Value And Verify  ${i}  ${random_value}
+    END
+
+
+Redfish Verify Set BIOS Integer Attribute Type
+
+    [Documentation]  Verify set BIOS integer attribute type for various BIOS
+    ...              attribute handle with random values with in the range using Redfish.
+    [Tags]  Redfish_Verify_Set_BIOS_Integer_Attribute_Type
+
+    ${attr_val_data}=  GetBIOSStrAndIntAttributeHandles  BIOSInteger  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+    FOR  ${i}  IN  @{attr_handles}
+        ${random_value}=  GetRandomBIOSIntAndStrValues  ${i}  ${attr_val_data['${i}']["UpperBound"]}
+        Set BIOS Attribute Value And Verify  ${i}  ${random_value}
+    END
+
+
+Redfish Verify Set BIOS Enumeration Attribute Type
+
+    [Documentation]  Validate get and update BIOS attribute optional values
+    ...              and set back to original BIOS attribute values using Redfish.
+    [Tags]  Redfish_Verify_BIOS_Enumeration_Attribute_Type
+
+
+    # Fetch BIOS attribute optional values from pldmtool getbiostable.
+    ${attr_val_data}=  GetBIOSEnumAttributeOptionalValues  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${attr_val_data}
+
+    # Example:
+    # {'vmi_if0_ipv4_method': ['IPv4Static', 'IPv4DHCP']}
+
+    # Update multiple attribute values for corresponding attribute handle.
+    FOR  ${i}  IN  @{attr_handles}
+        @{attr_val_list}=  Set Variable  ${attr_val_data}[${i}]
+        Set Optional BIOS Attribute Values And Verify  ${i}  @{attr_val_list}
+    END
+
+
+Redfish Verify Restore BIOS Attribute Values
+
+    [Documentation]  Restore all BIOS attribute values with its default values and verify
+    ...              using Redfish.
+    [Tags]  Redfish_Verify_Restore_BIOS_Attribute_Values
+
+    ${bios_default_data}=  GetBIOSAttrDefaultValues  ${attr_table_data}
+    @{attr_handles}=  Get Dictionary Keys  ${bios_default_data}
+
+    FOR  ${i}  IN  @{attr_handles}
+        Set BIOS Attribute Value And Verify  ${i}  ${bios_default_data['${i}']}
+    END
+
+
+*** Keywords ***
+
+Redfish BIOS Suite Setup
+
+    [Documentation]  Perform Redfish BIOS suite setup.
+
+    Redfish.Login
+    ${pldm_output}=  Pldmtool  bios GetBIOSTable --type AttributeTable
+    Set Global Variable  ${attr_table_data}  ${pldm_output}
+
+    ${data}=  GetBIOSAttrOriginalValues  ${pldm_output}
+    Set Global Variable  ${bios_original_data}  ${data}
+
+
+Redfish BIOS Suite Cleanup
+
+    [Documentation]  Perform Redfish BIOS suite cleanup.
+
+    @{attr_handles}=  Get Dictionary Keys  ${bios_original_data}
+    FOR  ${i}  IN  @{attr_handles}
+        Set BIOS Attribute Value And Verify  ${i}  ${bios_original_data['${i}']}
+    END
+    Redfish.Logout