1*48761c62SAndrew Jeffery #include <endian.h> 2*48761c62SAndrew Jeffery #include <libpldm/base.h> 3*48761c62SAndrew Jeffery #include <libpldm/oem/ibm/host.h> 4*48761c62SAndrew Jeffery 5*48761c62SAndrew Jeffery #include <array> 6*48761c62SAndrew Jeffery #include <cstdint> 7*48761c62SAndrew Jeffery #include <cstring> 8*48761c62SAndrew Jeffery #include <vector> 9*48761c62SAndrew Jeffery 10*48761c62SAndrew Jeffery #include <gtest/gtest.h> 11*48761c62SAndrew Jeffery 12*48761c62SAndrew Jeffery constexpr auto hdrSize = sizeof(pldm_msg_hdr); 13*48761c62SAndrew Jeffery 14*48761c62SAndrew Jeffery TEST(GetAlertStatus, testGoodEncodeRequest) 15*48761c62SAndrew Jeffery { 16*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{}; 17*48761c62SAndrew Jeffery 18*48761c62SAndrew Jeffery uint8_t versionId = 0x0; 19*48761c62SAndrew Jeffery 20*48761c62SAndrew Jeffery auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 21*48761c62SAndrew Jeffery auto rc = encode_get_alert_status_req(0, versionId, request, 22*48761c62SAndrew Jeffery PLDM_GET_ALERT_STATUS_REQ_BYTES); 23*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_SUCCESS); 24*48761c62SAndrew Jeffery EXPECT_EQ(versionId, request->payload[0]); 25*48761c62SAndrew Jeffery } 26*48761c62SAndrew Jeffery 27*48761c62SAndrew Jeffery TEST(GetAlertStatus, testBadEncodeRequest) 28*48761c62SAndrew Jeffery { 29*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{}; 30*48761c62SAndrew Jeffery 31*48761c62SAndrew Jeffery auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 32*48761c62SAndrew Jeffery auto rc = encode_get_alert_status_req(0, 0x0, request, 33*48761c62SAndrew Jeffery PLDM_GET_ALERT_STATUS_REQ_BYTES + 1); 34*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); 35*48761c62SAndrew Jeffery } 36*48761c62SAndrew Jeffery 37*48761c62SAndrew Jeffery TEST(GetAlertStatus, testGoodDecodeResponse) 38*48761c62SAndrew Jeffery { 39*48761c62SAndrew Jeffery uint8_t completionCode = PLDM_SUCCESS; 40*48761c62SAndrew Jeffery uint32_t rack_entry = 0xff000030; 41*48761c62SAndrew Jeffery uint32_t pri_cec_node = 0x00008030; 42*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES> 43*48761c62SAndrew Jeffery responseMsg{}; 44*48761c62SAndrew Jeffery 45*48761c62SAndrew Jeffery uint8_t retCompletionCode = 0; 46*48761c62SAndrew Jeffery uint32_t retRack_entry = 0; 47*48761c62SAndrew Jeffery uint32_t retPri_cec_node = 0; 48*48761c62SAndrew Jeffery 49*48761c62SAndrew Jeffery auto response = reinterpret_cast<pldm_msg*>(responseMsg.data()); 50*48761c62SAndrew Jeffery struct pldm_get_alert_status_resp* resp = 51*48761c62SAndrew Jeffery reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload); 52*48761c62SAndrew Jeffery resp->completion_code = completionCode; 53*48761c62SAndrew Jeffery resp->rack_entry = htole32(rack_entry); 54*48761c62SAndrew Jeffery resp->pri_cec_node = htole32(pri_cec_node); 55*48761c62SAndrew Jeffery 56*48761c62SAndrew Jeffery auto rc = decode_get_alert_status_resp( 57*48761c62SAndrew Jeffery response, responseMsg.size() - hdrSize, &retCompletionCode, 58*48761c62SAndrew Jeffery &retRack_entry, &retPri_cec_node); 59*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_SUCCESS); 60*48761c62SAndrew Jeffery EXPECT_EQ(retCompletionCode, completionCode); 61*48761c62SAndrew Jeffery EXPECT_EQ(retRack_entry, rack_entry); 62*48761c62SAndrew Jeffery EXPECT_EQ(retPri_cec_node, pri_cec_node); 63*48761c62SAndrew Jeffery } 64*48761c62SAndrew Jeffery 65*48761c62SAndrew Jeffery TEST(GetAlertStatus, testBadDecodeResponse) 66*48761c62SAndrew Jeffery { 67*48761c62SAndrew Jeffery auto rc = decode_get_alert_status_resp(NULL, 0, NULL, NULL, NULL); 68*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); 69*48761c62SAndrew Jeffery 70*48761c62SAndrew Jeffery uint8_t completionCode = PLDM_SUCCESS; 71*48761c62SAndrew Jeffery uint32_t rack_entry = 0xff000030; 72*48761c62SAndrew Jeffery uint32_t pri_cec_node = 0x00008030; 73*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES> 74*48761c62SAndrew Jeffery responseMsg{}; 75*48761c62SAndrew Jeffery 76*48761c62SAndrew Jeffery uint8_t retCompletionCode = 0; 77*48761c62SAndrew Jeffery uint32_t retRack_entry = 0; 78*48761c62SAndrew Jeffery uint32_t retPri_cec_node = 0; 79*48761c62SAndrew Jeffery 80*48761c62SAndrew Jeffery auto response = reinterpret_cast<pldm_msg*>(responseMsg.data()); 81*48761c62SAndrew Jeffery struct pldm_get_alert_status_resp* resp = 82*48761c62SAndrew Jeffery reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload); 83*48761c62SAndrew Jeffery resp->completion_code = completionCode; 84*48761c62SAndrew Jeffery resp->rack_entry = htole32(rack_entry); 85*48761c62SAndrew Jeffery resp->pri_cec_node = htole32(pri_cec_node); 86*48761c62SAndrew Jeffery 87*48761c62SAndrew Jeffery rc = decode_get_alert_status_resp( 88*48761c62SAndrew Jeffery response, responseMsg.size() - hdrSize + 1, &retCompletionCode, 89*48761c62SAndrew Jeffery &retRack_entry, &retPri_cec_node); 90*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); 91*48761c62SAndrew Jeffery } 92*48761c62SAndrew Jeffery 93*48761c62SAndrew Jeffery TEST(GetAlertStatus, testGoodEncodeResponse) 94*48761c62SAndrew Jeffery { 95*48761c62SAndrew Jeffery uint8_t completionCode = 0; 96*48761c62SAndrew Jeffery uint32_t rack_entry = 0xff000030; 97*48761c62SAndrew Jeffery uint32_t pri_cec_node = 0x00008030; 98*48761c62SAndrew Jeffery 99*48761c62SAndrew Jeffery std::vector<uint8_t> responseMsg(hdrSize + 100*48761c62SAndrew Jeffery PLDM_GET_ALERT_STATUS_RESP_BYTES); 101*48761c62SAndrew Jeffery auto response = reinterpret_cast<pldm_msg*>(responseMsg.data()); 102*48761c62SAndrew Jeffery 103*48761c62SAndrew Jeffery auto rc = 104*48761c62SAndrew Jeffery encode_get_alert_status_resp(0, PLDM_SUCCESS, rack_entry, pri_cec_node, 105*48761c62SAndrew Jeffery response, responseMsg.size() - hdrSize); 106*48761c62SAndrew Jeffery 107*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_SUCCESS); 108*48761c62SAndrew Jeffery struct pldm_get_alert_status_resp* resp = 109*48761c62SAndrew Jeffery reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload); 110*48761c62SAndrew Jeffery 111*48761c62SAndrew Jeffery EXPECT_EQ(completionCode, resp->completion_code); 112*48761c62SAndrew Jeffery EXPECT_EQ(rack_entry, le32toh(resp->rack_entry)); 113*48761c62SAndrew Jeffery EXPECT_EQ(pri_cec_node, le32toh(resp->pri_cec_node)); 114*48761c62SAndrew Jeffery } 115*48761c62SAndrew Jeffery 116*48761c62SAndrew Jeffery TEST(GetAlertStatus, testBadEncodeResponse) 117*48761c62SAndrew Jeffery { 118*48761c62SAndrew Jeffery uint32_t rack_entry = 0xff000030; 119*48761c62SAndrew Jeffery uint32_t pri_cec_node = 0x00008030; 120*48761c62SAndrew Jeffery 121*48761c62SAndrew Jeffery std::vector<uint8_t> responseMsg(hdrSize + 122*48761c62SAndrew Jeffery PLDM_GET_ALERT_STATUS_RESP_BYTES); 123*48761c62SAndrew Jeffery auto response = reinterpret_cast<pldm_msg*>(responseMsg.data()); 124*48761c62SAndrew Jeffery 125*48761c62SAndrew Jeffery auto rc = encode_get_alert_status_resp(0, PLDM_SUCCESS, rack_entry, 126*48761c62SAndrew Jeffery pri_cec_node, response, 127*48761c62SAndrew Jeffery responseMsg.size() - hdrSize + 1); 128*48761c62SAndrew Jeffery 129*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); 130*48761c62SAndrew Jeffery } 131*48761c62SAndrew Jeffery 132*48761c62SAndrew Jeffery TEST(GetAlertStatus, testGoodDecodeRequest) 133*48761c62SAndrew Jeffery { 134*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{}; 135*48761c62SAndrew Jeffery 136*48761c62SAndrew Jeffery uint8_t versionId = 0x0; 137*48761c62SAndrew Jeffery uint8_t retVersionId; 138*48761c62SAndrew Jeffery 139*48761c62SAndrew Jeffery auto req = reinterpret_cast<pldm_msg*>(requestMsg.data()); 140*48761c62SAndrew Jeffery 141*48761c62SAndrew Jeffery req->payload[0] = versionId; 142*48761c62SAndrew Jeffery 143*48761c62SAndrew Jeffery auto rc = decode_get_alert_status_req(req, requestMsg.size() - hdrSize, 144*48761c62SAndrew Jeffery &retVersionId); 145*48761c62SAndrew Jeffery 146*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_SUCCESS); 147*48761c62SAndrew Jeffery EXPECT_EQ(retVersionId, versionId); 148*48761c62SAndrew Jeffery } 149*48761c62SAndrew Jeffery 150*48761c62SAndrew Jeffery TEST(GetAlertStatus, testBadDecodeRequest) 151*48761c62SAndrew Jeffery { 152*48761c62SAndrew Jeffery std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{}; 153*48761c62SAndrew Jeffery 154*48761c62SAndrew Jeffery uint8_t versionId = 0x0; 155*48761c62SAndrew Jeffery uint8_t retVersionId; 156*48761c62SAndrew Jeffery 157*48761c62SAndrew Jeffery auto req = reinterpret_cast<pldm_msg*>(requestMsg.data()); 158*48761c62SAndrew Jeffery 159*48761c62SAndrew Jeffery req->payload[0] = versionId; 160*48761c62SAndrew Jeffery 161*48761c62SAndrew Jeffery auto rc = decode_get_alert_status_req(req, requestMsg.size() - hdrSize + 1, 162*48761c62SAndrew Jeffery &retVersionId); 163*48761c62SAndrew Jeffery 164*48761c62SAndrew Jeffery EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); 165*48761c62SAndrew Jeffery } 166