xref: /openbmc/libpldm/tests/oem/ibm/host.cpp (revision 48761c62012fe197a26266bab4dd7a82e4d9c1bb)
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