| *** Settings *** | 
 | Documentation     Verify REST services Get/Put/Post/Delete. | 
 |  | 
 | Resource          ../lib/rest_client.robot | 
 | Resource          ../lib/openbmc_ffdc.robot | 
 | Resource          ../lib/resource.txt | 
 | Library           Collections | 
 | Test Teardown     FFDC On Test Case Fail | 
 |  | 
 | *** Variables *** | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | REST Login Session To BMC | 
 |     [Documentation]  Test REST session log-in. | 
 |     [Tags]  REST_Login_Session_To_BMC | 
 |  | 
 |     Initialize OpenBMC | 
 |     # Raw GET REST operation to verify session is established. | 
 |     ${resp}=  Get Request  openbmc  /xyz/openbmc_project/ | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 |  | 
 | REST Logout Session To BMC | 
 |     [Documentation]  Test REST session log-out. | 
 |     [Tags]  REST_Logout_Session_To_BMC | 
 |  | 
 |     Initialize OpenBMC | 
 |     Log Out OpenBMC | 
 |     # Raw GET REST operation to verify session is logout. | 
 |     ${resp}=  Get Request  openbmc  /xyz/openbmc_project/ | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_UNAUTHORIZED} | 
 |  | 
 |  | 
 | REST Delete All Sessions And Expect Error | 
 |     [Documentation]  Test REST empty cache using delete operation. | 
 |     [Tags]  REST_Delete_All_Sessions_And_Expect_Error | 
 |  | 
 |     # Throws exception: | 
 |     # Non-existing index or alias 'openbmc'. | 
 |  | 
 |     Initialize OpenBMC | 
 |     Delete All Sessions | 
 |     # Raw GET REST operation and expect exception error. | 
 |     Run Keyword And Expect Error | 
 |     ...  Non-existing index or alias 'openbmc'. | 
 |     ...  Get Request  openbmc  /xyz/openbmc_project/ | 
 |  | 
 |  | 
 | Multiple Requests On BMC Using Single REST Session | 
 |     [Documentation]  Trigger multiple REST operations using an active | 
 |     ...  connection session. | 
 |     [Tags]  Multiple_Requests_On_BMC_Using_Single_REST_Session | 
 |  | 
 |     Initialize OpenBMC | 
 |  | 
 |     # Session object "openbmc". | 
 |     ${resp}=  Get Request  openbmc  /xyz/openbmc_project/state/ | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 |     ${resp}=  Get Request  openbmc  /xyz/openbmc_project/software/enumerate | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 |  | 
 | Verify REST JSON Data On Success | 
 |     [Documentation]  Verify JSON data success response messages. | 
 |     [Tags]  Verify_REST_JSON_Data_On_Success | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     # "data": [ | 
 |     #         "/xyz/openbmc_project/sensors", | 
 |     #         "/xyz/openbmc_project/inventory", | 
 |     #         "/xyz/openbmc_project/software", | 
 |     #         "/xyz/openbmc_project/object_mapper", | 
 |     #         "/xyz/openbmc_project/logging" | 
 |     #         ], | 
 |     # "message": "200 OK", | 
 |     # "status": "ok" | 
 |     # } | 
 |  | 
 |     ${resp}=  OpenBMC Get Request  /xyz/openbmc_project/ | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Not Be Empty  ${jsondata["data"]} | 
 |     Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  ok | 
 |  | 
 |  | 
 | Verify REST JSON Data On Failure | 
 |     [Documentation]  Verify JSON data failure response messages. | 
 |     [Tags]  Verify_REST_JSON_Data_On_Failure | 
 |     # Example: | 
 |     # Response code:404, Content:{ | 
 |     # "data": { | 
 |     #        "description": "org.freedesktop.DBus.Error.FileNotFound: path or object not found: /xyz/idont/exist" | 
 |     #         }, | 
 |     # "message": "404 Not Found", | 
 |     # "status": "error" | 
 |     # } | 
 |  | 
 |     ${resp}=  OpenBMC Get Request  /xyz/idont/exist/ | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Be Equal As Strings | 
 |     ...  ${jsondata["data"]["description"]}  org.freedesktop.DBus.Error.FileNotFound: path or object not found: /xyz/idont/exist | 
 |     Should Be Equal As Strings  ${jsondata["message"]}  404 Not Found | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  error | 
 |  | 
 |  | 
 | Verify REST Get Message JSON Compliant | 
 |     [Documentation]  Verify REST "GET" message is JSON format compliant. | 
 |     [Tags]  Verify_REST_Get_Message_JSON_Compliant | 
 |     # For testing if the REST message is JSON format compliant using a | 
 |     # generic BMC state path /xyz/openbmc_project/state object and path | 
 |     # walking through to ensure the parent object, trailing slash and | 
 |     # attribute message response are intact. | 
 |  | 
 |     # Object attribute data. | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     #   "data": { | 
 |     #      "CurrentBMCState": "xyz.openbmc_project.State.BMC.BMCState.Ready", | 
 |     #      "RequestedBMCTransition": "xyz.openbmc_project.State.BMC.Transition.None" | 
 |     #   }, | 
 |     #   "message": "200 OK", | 
 |     #   "status": "ok" | 
 |     # } | 
 |  | 
 |     Verify JSON Response Content | 
 |     ...  /xyz/openbmc_project/state/bmc0  DATA_NOT_EMPTY | 
 |  | 
 |     # Object trailing slash attribute data. | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     #    "data": [], | 
 |     #    "message": "200 OK", | 
 |     #    "status": "ok" | 
 |     # } | 
 |  | 
 |     Verify JSON Response Content  /xyz/openbmc_project/state/bmc0/ | 
 |  | 
 |     # Attribute data. | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     #   "data": "xyz.openbmc_project.State.BMC.BMCState.Ready", | 
 |     #   "message": "200 OK", | 
 |     #   "status": "ok" | 
 |     # } | 
 |  | 
 |     Verify JSON Response Content | 
 |     ...  /xyz/openbmc_project/state/bmc0/attr/CurrentBMCState  DATA_NOT_EMPTY | 
 |  | 
 |  | 
 | Verify REST Post Message JSON Compliant | 
 |     [Documentation]  Verify REST "POST" message is JSON format compliant. | 
 |     [Tags]  Verify_REST_Post_Message_JSON_Compliant | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     #  "data": null, | 
 |     #  "message": "200 OK", | 
 |     #  "status": "ok" | 
 |     # } | 
 |  | 
 |     # Generate 1KB file size | 
 |     Run  dd if=/dev/zero of=dummyfile bs=1 count=0 seek=1KB | 
 |     OperatingSystem.File Should Exist  dummyfile | 
 |  | 
 |     # Get the content of the file and upload to BMC | 
 |     ${image_data}=  OperatingSystem.Get Binary File  dummyfile | 
 |  | 
 |     # Get REST session to BMC | 
 |     Initialize OpenBMC | 
 |  | 
 |     # Create the REST payload headers and data | 
 |     ${data}=  Create Dictionary  data  ${image_data} | 
 |     ${headers}=  Create Dictionary  Content-Type=application/octet-stream | 
 |     ...  Accept=application/octet-stream | 
 |     Set To Dictionary  ${data}  headers  ${headers} | 
 |  | 
 |     ${resp}=  Post Request  openbmc  /upload/image  &{data} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Be Equal  ${jsondata["data"]}  ${None} | 
 |     Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  ok | 
 |  | 
 |     # Cleanup uploaded file. | 
 |     BMC Execute Command  rm -rf /tmp/images/* | 
 |  | 
 |  | 
 | Verify REST Put Message JSON Compliant | 
 |     [Documentation]  Verify REST "PUT" message is JSON format compliant. | 
 |     [Tags]  REST_Put_Message_JSON_Format_Compliance_Test | 
 |     # Example: | 
 |     # Response code:200, Content:{ | 
 |     #  "data": null, | 
 |     #  "message": "200 OK", | 
 |     #  "status": "ok" | 
 |     # } | 
 |  | 
 |     ${dict_data}=  Create Dictionary  data=${HOST_POWEROFF_TRANS} | 
 |     ${resp}=  Openbmc Put Request | 
 |     ...  ${HOST_STATE_URI}/attr/RequestedHostTransition  data=${dict_data} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Be Equal  ${jsondata["data"]}  ${None} | 
 |     Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  ok | 
 |     # Intention is not to test poweroff but to check the REST operation | 
 |     # sink time allowing to kick poweroff. | 
 |     Sleep  10s | 
 |  | 
 |  | 
 | Check Response Codes HTTP_UNSUPPORTED_MEDIA_TYPE | 
 |     [Documentation]  REST "Post" response status test for | 
 |     ...              HTTP_UNSUPPORTED_MEDIA_TYPE. | 
 |     [Tags]  Check_Response_Codes_415 | 
 |  | 
 |     # Example: | 
 |     # Response code:415, Content:{ | 
 |     # "data": { | 
 |     #         "description": "Expecting content type 'application/octet-stream', got 'application/json'" | 
 |     #         }, | 
 |     # "message": "415 Unsupported Media Type", | 
 |     # "status": "error" | 
 |     # } | 
 |  | 
 |     Initialize OpenBMC | 
 |  | 
 |     # Create the REST payload headers and EMPTY data | 
 |     ${data}=  Create Dictionary  data  ${EMPTY} | 
 |     ${headers}=  Create Dictionary  Content-Type=application/json | 
 |     Set To Dictionary  ${data}  headers  ${headers} | 
 |  | 
 |     ${resp}=  Post Request  openbmc  /upload/image  &{data} | 
 |     Should Be Equal As Strings | 
 |     ...  ${resp.status_code}  ${HTTP_UNSUPPORTED_MEDIA_TYPE} | 
 |  | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Be Equal As Strings  ${jsondata["data"]["description"]} | 
 |     ...  Expecting content type 'application/octet-stream', got 'application/json' | 
 |     Should Be Equal As Strings | 
 |     ...  ${jsondata["message"]}  415 Unsupported Media Type | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  error | 
 |  | 
 |  | 
 | Get Response Codes | 
 |     [Documentation]  REST "Get" response status test. | 
 |     #-------------------------------------------------------------------- | 
 |     # Expect status      URL Path | 
 |     #-------------------------------------------------------------------- | 
 |     ${HTTP_OK}           / | 
 |     ${HTTP_OK}           /xyz/ | 
 |     ${HTTP_OK}           /xyz/openbmc_project/ | 
 |     ${HTTP_OK}           /xyz/openbmc_project/enumerate | 
 |     ${HTTP_NOT_FOUND}    /i/dont/exist/ | 
 |  | 
 |     [Tags]  Get_Response_Codes | 
 |     [Template]  Execute Get And Check Response | 
 |  | 
 |  | 
 | Get Data | 
 |     [Documentation]  REST "Get" request url and expect the | 
 |     ...              response OK and data non empty. | 
 |     #-------------------------------------------------------------------- | 
 |     # URL Path | 
 |     #-------------------------------------------------------------------- | 
 |     /xyz/openbmc_project/ | 
 |     /xyz/openbmc_project/list | 
 |     /xyz/openbmc_project/enumerate | 
 |  | 
 |     [Tags]  Get_Data | 
 |     [Template]  Execute Get And Check Data | 
 |  | 
 |  | 
 | Get Data Validation | 
 |     [Documentation]  REST "Get" request url and expect the | 
 |     ...              pre-defined string in response data. | 
 |     #-------------------------------------------------------------------- | 
 |     # URL Path                  Expect Data | 
 |     #-------------------------------------------------------------------- | 
 |     /xyz/openbmc_project/       /xyz/openbmc_project/logging | 
 |     /i/dont/exist/              path or object not found: /i/dont/exist | 
 |  | 
 |     [Tags]  Get_Data_Validation | 
 |     [Template]  Execute Get And Verify Data | 
 |  | 
 |  | 
 | Put Response Codes | 
 |     [Documentation]  REST "Put" request url and expect the REST pre-defined | 
 |     ...              codes. | 
 |     #-------------------------------------------------------------------- | 
 |     # Expect status                 URL Path | 
 |     #-------------------------------------------------------------------- | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      / | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /i/dont/exist/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/list | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/enumerate | 
 |  | 
 |     [Tags]  Put_Response_Codes | 
 |     [Template]  Execute Put And Check Response | 
 |  | 
 |  | 
 | Put Data Validation | 
 |     [Documentation]  REST "Put" request url and expect success. | 
 |     #-------------------------------------------------------------------- | 
 |     # URL Path                      Parm Data | 
 |     #-------------------------------------------------------------------- | 
 |     /xyz/openbmc_project/state/host0/attr/RequestedHostTransition    xyz.openbmc_project.State.Host.Transition.Off | 
 |  | 
 |     [Tags]  Put_Data_Validation | 
 |     [Template]  Execute Put And Expect Success | 
 |  | 
 |  | 
 | Post Response Code | 
 |     [Documentation]  REST Post request url and expect the | 
 |     ...              REST response code pre define. | 
 |     #-------------------------------------------------------------------- | 
 |     # Expect status                 URL Path | 
 |     #-------------------------------------------------------------------- | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      / | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /i/dont/exist/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/enumerate | 
 |  | 
 |     [Tags]  Post_Response_Codes | 
 |     [Template]  Execute Post And Check Response | 
 |  | 
 |  | 
 | Delete Response Code | 
 |     [Documentation]  REST "Delete" request url and expect the | 
 |     ...              REST response code pre define. | 
 |     #-------------------------------------------------------------------- | 
 |     # Expect status                 URL Path | 
 |     #-------------------------------------------------------------------- | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      / | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/nothere/ | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/enumerate | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/openbmc_project/list | 
 |     ${HTTP_METHOD_NOT_ALLOWED}      /xyz/openbmc_project/enumerate | 
 |  | 
 |     [Tags]  Delete_Response_Codes | 
 |     [Template]  Execute Delete And Check Response | 
 |  | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Execute Get And Check Response | 
 |     [Documentation]  Request "Get" url path and expect REST response code. | 
 |     [Arguments]  ${expected_response_code}  ${url_path} | 
 |     # Description of arguments: | 
 |     # expected_response_code   Expected REST status codes. | 
 |     # url_path                 URL path. | 
 |     ${resp}=  Openbmc Get Request  ${url_path} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
 |  | 
 | Execute Get And Check Data | 
 |     [Documentation]  Request "Get" url path and expect non empty data. | 
 |     [Arguments]  ${url_path} | 
 |     # Description of arguments: | 
 |     # url_path     URL path. | 
 |     ${resp}=  Openbmc Get Request  ${url_path} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Not Be Empty  ${jsondata["data"]} | 
 |  | 
 | Execute Get And Verify Data | 
 |     [Documentation]  Request "Get" url path and verify data. | 
 |     [Arguments]  ${url_path}  ${expected_response_code} | 
 |     # Description of arguments: | 
 |     # expected_response_code   Expected REST status codes. | 
 |     # url_path                 URL path. | 
 |     ${resp}=  Openbmc Get Request  ${url_path} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Run Keyword If  '${resp.status_code}' == '${HTTP_OK}' | 
 |     ...  Should Contain  ${jsondata["data"]}  ${expected_response_code} | 
 |     ...  ELSE | 
 |     ...  Should Contain  ${jsondata["data"]["description"]}  ${expected_response_code} | 
 |  | 
 | Execute Put And Check Response | 
 |     [Documentation]  Request "Put" url path and expect REST response code. | 
 |     [Arguments]  ${expected_response_code}  ${url_path} | 
 |     # Description of arguments: | 
 |     # expected_response_code   Expected REST status codes. | 
 |     # url_path                 URL path. | 
 |     ${resp}=  Openbmc Put Request  ${url_path} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
 |  | 
 | Execute Put And Expect Success | 
 |     [Documentation]  Request "Put" on url path. | 
 |     [Arguments]  ${url_path}  ${parm} | 
 |     # Description of arguments: | 
 |     # url_path     URL path. | 
 |     # parm         Value/string to be set. | 
 |     # expected_response_code   Expected REST status codes. | 
 |     ${parmDict}=  Create Dictionary  data=${parm} | 
 |     ${resp}=  Openbmc Put Request  ${url_path}  data=${parmDict} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 | Execute Post And Check Response | 
 |     [Documentation]  Request Post url path and expect REST response code. | 
 |     [Arguments]  ${expected_response_code}  ${url_path} | 
 |     # Description of arguments: | 
 |     # expected_response_code   Expected REST status codes. | 
 |     # url_path                 URL path. | 
 |     ${resp}=  Openbmc Post Request  ${url_path} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
 |  | 
 | Execute Post And Check Data | 
 |     [Arguments]  ${url_path}  ${parm} | 
 |     [Documentation]  Request Post on url path and expected non empty data. | 
 |     # Description of arguments: | 
 |     # url_path     URL path. | 
 |     ${data}=  Create Dictionary  data=@{parm} | 
 |     ${resp}=  Openbmc Post Request  ${url_path}  data=${data} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Should Not Be Empty  ${jsondata["data"]} | 
 |  | 
 | Execute Delete And Check Response | 
 |     [Documentation]  Request "Delete" url path and expected REST response code. | 
 |     [Arguments]  ${expected_response_code}  ${url_path} | 
 |     # Description of arguments: | 
 |     # expected_response_code   Expected REST status codes. | 
 |     # url_path     URL path. | 
 |     ${data}=  Create Dictionary  data=@{EMPTY} | 
 |     ${resp}=  Openbmc Delete Request  ${url_path}  data=${data} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
 |  | 
 | Verify JSON Response Content | 
 |     [Documentation]  Verify JSON response data is intact. | 
 |     [Arguments]  ${url_path}  ${data_empty}=${EMPTY} | 
 |  | 
 |     # Description of argument(s): | 
 |     # url_path     URL path. | 
 |     # data_empty   JSON data element. | 
 |  | 
 |     ${resp}=  OpenBMC Get Request  ${url_path} | 
 |     ${jsondata}=  To JSON  ${resp.content} | 
 |     Run Keyword If  '${data_empty}' == '${EMPTY}' | 
 |     ...  Should Be Empty  ${jsondata["data"]} | 
 |     ...  ELSE | 
 |     ...  Should Not Be Empty  ${jsondata["data"]} | 
 |     Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
 |     Should Be Equal As Strings  ${jsondata["status"]}  ok |