xref: /openbmc/libpldm/tests/dsp/bios.cpp (revision d0ba43af817d5a7763dec75a1309fe2ae37b95a6)
148761c62SAndrew Jeffery #include <endian.h>
248761c62SAndrew Jeffery #include <libpldm/base.h>
348761c62SAndrew Jeffery #include <libpldm/bios.h>
448761c62SAndrew Jeffery #include <libpldm/utils.h>
548761c62SAndrew Jeffery 
648761c62SAndrew Jeffery #include <array>
748761c62SAndrew Jeffery #include <cstdint>
848761c62SAndrew Jeffery #include <cstring>
948761c62SAndrew Jeffery #include <memory>
1048761c62SAndrew Jeffery 
1148761c62SAndrew Jeffery #include <gtest/gtest.h>
1248761c62SAndrew Jeffery 
1348761c62SAndrew Jeffery constexpr auto hdrSize = sizeof(pldm_msg_hdr);
1448761c62SAndrew Jeffery 
TEST(GetDateTime,testEncodeRequest)1548761c62SAndrew Jeffery TEST(GetDateTime, testEncodeRequest)
1648761c62SAndrew Jeffery {
1748761c62SAndrew Jeffery     pldm_msg request{};
1848761c62SAndrew Jeffery 
1948761c62SAndrew Jeffery     auto rc = encode_get_date_time_req(0, &request);
2048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
2148761c62SAndrew Jeffery }
2248761c62SAndrew Jeffery 
TEST(GetDateTime,testEncodeResponse)2348761c62SAndrew Jeffery TEST(GetDateTime, testEncodeResponse)
2448761c62SAndrew Jeffery {
2548761c62SAndrew Jeffery     uint8_t completionCode = 0;
2648761c62SAndrew Jeffery     uint8_t seconds = 50;
2748761c62SAndrew Jeffery     uint8_t minutes = 20;
2848761c62SAndrew Jeffery     uint8_t hours = 5;
2948761c62SAndrew Jeffery     uint8_t day = 23;
3048761c62SAndrew Jeffery     uint8_t month = 11;
3148761c62SAndrew Jeffery     uint16_t year = 2019;
3248761c62SAndrew Jeffery 
3348761c62SAndrew Jeffery     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_DATE_TIME_RESP_BYTES>
3448761c62SAndrew Jeffery         responseMsg{};
3548761c62SAndrew Jeffery 
36*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3748761c62SAndrew Jeffery     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3848761c62SAndrew Jeffery 
3948761c62SAndrew Jeffery     auto rc = encode_get_date_time_resp(0, PLDM_SUCCESS, seconds, minutes,
4048761c62SAndrew Jeffery                                         hours, day, month, year, response);
4148761c62SAndrew Jeffery 
4248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
4348761c62SAndrew Jeffery     EXPECT_EQ(completionCode, response->payload[0]);
4448761c62SAndrew Jeffery 
4548761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
4648761c62SAndrew Jeffery                         &seconds, sizeof(seconds)));
4748761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
4848761c62SAndrew Jeffery                             sizeof(seconds),
4948761c62SAndrew Jeffery                         &minutes, sizeof(minutes)));
5048761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
5148761c62SAndrew Jeffery                             sizeof(seconds) + sizeof(minutes),
5248761c62SAndrew Jeffery                         &hours, sizeof(hours)));
5348761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
5448761c62SAndrew Jeffery                             sizeof(seconds) + sizeof(minutes) + sizeof(hours),
5548761c62SAndrew Jeffery                         &day, sizeof(day)));
5648761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
5748761c62SAndrew Jeffery                             sizeof(seconds) + sizeof(minutes) + sizeof(hours) +
5848761c62SAndrew Jeffery                             sizeof(day),
5948761c62SAndrew Jeffery                         &month, sizeof(month)));
6048761c62SAndrew Jeffery     uint16_t yearLe = htole16(year);
6148761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
6248761c62SAndrew Jeffery                             sizeof(seconds) + sizeof(minutes) + sizeof(hours) +
6348761c62SAndrew Jeffery                             sizeof(day) + sizeof(month),
6448761c62SAndrew Jeffery                         &yearLe, sizeof(yearLe)));
6548761c62SAndrew Jeffery }
6648761c62SAndrew Jeffery 
TEST(GetDateTime,testDecodeResponse)6748761c62SAndrew Jeffery TEST(GetDateTime, testDecodeResponse)
6848761c62SAndrew Jeffery {
6948761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_GET_DATE_TIME_RESP_BYTES> responseMsg{};
7048761c62SAndrew Jeffery 
7148761c62SAndrew Jeffery     uint8_t completionCode = 0;
7248761c62SAndrew Jeffery 
7348761c62SAndrew Jeffery     uint8_t seconds = 55;
7448761c62SAndrew Jeffery     uint8_t minutes = 2;
7548761c62SAndrew Jeffery     uint8_t hours = 8;
7648761c62SAndrew Jeffery     uint8_t day = 9;
7748761c62SAndrew Jeffery     uint8_t month = 7;
7848761c62SAndrew Jeffery     uint16_t year = 2020;
7948761c62SAndrew Jeffery     uint16_t yearLe = htole16(year);
8048761c62SAndrew Jeffery 
8148761c62SAndrew Jeffery     uint8_t retSeconds = 0;
8248761c62SAndrew Jeffery     uint8_t retMinutes = 0;
8348761c62SAndrew Jeffery     uint8_t retHours = 0;
8448761c62SAndrew Jeffery     uint8_t retDay = 0;
8548761c62SAndrew Jeffery     uint8_t retMonth = 0;
8648761c62SAndrew Jeffery     uint16_t retYear = 0;
8748761c62SAndrew Jeffery 
8848761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize, &seconds,
8948761c62SAndrew Jeffery            sizeof(seconds));
9048761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
9148761c62SAndrew Jeffery                hdrSize,
9248761c62SAndrew Jeffery            &minutes, sizeof(minutes));
9348761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
9448761c62SAndrew Jeffery                sizeof(minutes) + hdrSize,
9548761c62SAndrew Jeffery            &hours, sizeof(hours));
9648761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
9748761c62SAndrew Jeffery                sizeof(minutes) + sizeof(hours) + hdrSize,
9848761c62SAndrew Jeffery            &day, sizeof(day));
9948761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
10048761c62SAndrew Jeffery                sizeof(minutes) + sizeof(hours) + sizeof(day) + hdrSize,
10148761c62SAndrew Jeffery            &month, sizeof(month));
10248761c62SAndrew Jeffery     memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
10348761c62SAndrew Jeffery                sizeof(minutes) + sizeof(hours) + sizeof(day) + sizeof(month) +
10448761c62SAndrew Jeffery                hdrSize,
10548761c62SAndrew Jeffery            &yearLe, sizeof(yearLe));
10648761c62SAndrew Jeffery 
107*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
10848761c62SAndrew Jeffery     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
10948761c62SAndrew Jeffery 
11048761c62SAndrew Jeffery     auto rc = decode_get_date_time_resp(
11148761c62SAndrew Jeffery         response, responseMsg.size() - hdrSize, &completionCode, &retSeconds,
11248761c62SAndrew Jeffery         &retMinutes, &retHours, &retDay, &retMonth, &retYear);
11348761c62SAndrew Jeffery 
11448761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
11548761c62SAndrew Jeffery     EXPECT_EQ(seconds, retSeconds);
11648761c62SAndrew Jeffery     EXPECT_EQ(minutes, retMinutes);
11748761c62SAndrew Jeffery     EXPECT_EQ(hours, retHours);
11848761c62SAndrew Jeffery     EXPECT_EQ(day, retDay);
11948761c62SAndrew Jeffery     EXPECT_EQ(month, retMonth);
12048761c62SAndrew Jeffery     EXPECT_EQ(year, retYear);
12148761c62SAndrew Jeffery }
12248761c62SAndrew Jeffery 
TEST(SetDateTime,testGoodEncodeResponse)12348761c62SAndrew Jeffery TEST(SetDateTime, testGoodEncodeResponse)
12448761c62SAndrew Jeffery {
12548761c62SAndrew Jeffery     uint8_t instanceId = 0;
12648761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
12748761c62SAndrew Jeffery 
12848761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_only_cc_resp)>
12948761c62SAndrew Jeffery         responseMsg{};
13048761c62SAndrew Jeffery     struct pldm_msg* response =
131*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
13248761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
13348761c62SAndrew Jeffery 
13448761c62SAndrew Jeffery     auto rc = encode_set_date_time_resp(instanceId, completionCode, response,
13548761c62SAndrew Jeffery                                         responseMsg.size() - hdrSize);
13648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
13748761c62SAndrew Jeffery 
13848761c62SAndrew Jeffery     struct pldm_only_cc_resp* resp =
139*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
14048761c62SAndrew Jeffery         reinterpret_cast<struct pldm_only_cc_resp*>(response->payload);
14148761c62SAndrew Jeffery     EXPECT_EQ(completionCode, resp->completion_code);
14248761c62SAndrew Jeffery }
14348761c62SAndrew Jeffery 
TEST(SetDateTime,testBadEncodeResponse)14448761c62SAndrew Jeffery TEST(SetDateTime, testBadEncodeResponse)
14548761c62SAndrew Jeffery {
14648761c62SAndrew Jeffery 
14748761c62SAndrew Jeffery     uint8_t instanceId = 10;
14848761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
14948761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_only_cc_resp)>
15048761c62SAndrew Jeffery         responseMsg{};
15148761c62SAndrew Jeffery     struct pldm_msg* response =
152*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
15348761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
15448761c62SAndrew Jeffery     auto rc = encode_set_date_time_resp(instanceId, completionCode, nullptr,
15548761c62SAndrew Jeffery                                         responseMsg.size() - hdrSize);
15648761c62SAndrew Jeffery 
15748761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
15848761c62SAndrew Jeffery     rc = encode_set_date_time_resp(instanceId, completionCode, response,
15948761c62SAndrew Jeffery                                    responseMsg.size() - hdrSize - 1);
16048761c62SAndrew Jeffery 
16148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
16248761c62SAndrew Jeffery }
16348761c62SAndrew Jeffery 
TEST(SetDateTime,testGoodDecodeResponse)16448761c62SAndrew Jeffery TEST(SetDateTime, testGoodDecodeResponse)
16548761c62SAndrew Jeffery {
16648761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
16748761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_only_cc_resp)>
16848761c62SAndrew Jeffery         responseMsg{};
16948761c62SAndrew Jeffery     struct pldm_msg* response =
170*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
17148761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
17248761c62SAndrew Jeffery     struct pldm_only_cc_resp* resp =
173*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
17448761c62SAndrew Jeffery         reinterpret_cast<struct pldm_only_cc_resp*>(response->payload);
17548761c62SAndrew Jeffery 
17648761c62SAndrew Jeffery     resp->completion_code = completionCode;
17748761c62SAndrew Jeffery 
17848761c62SAndrew Jeffery     uint8_t retCompletionCode;
17948761c62SAndrew Jeffery     auto rc = decode_set_date_time_resp(response, responseMsg.size() - hdrSize,
18048761c62SAndrew Jeffery                                         &retCompletionCode);
18148761c62SAndrew Jeffery 
18248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
18348761c62SAndrew Jeffery     EXPECT_EQ(completionCode, retCompletionCode);
18448761c62SAndrew Jeffery }
18548761c62SAndrew Jeffery 
TEST(SetDateTime,testBadDecodeResponse)18648761c62SAndrew Jeffery TEST(SetDateTime, testBadDecodeResponse)
18748761c62SAndrew Jeffery {
18848761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
18948761c62SAndrew Jeffery 
19048761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_only_cc_resp)>
19148761c62SAndrew Jeffery         responseMsg{};
19248761c62SAndrew Jeffery     struct pldm_msg* response =
193*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
19448761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
19548761c62SAndrew Jeffery     auto rc = decode_set_date_time_resp(nullptr, responseMsg.size() - hdrSize,
19648761c62SAndrew Jeffery                                         &completionCode);
19748761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
19848761c62SAndrew Jeffery 
19948761c62SAndrew Jeffery     rc = decode_set_date_time_resp(response, responseMsg.size() - hdrSize - 1,
20048761c62SAndrew Jeffery                                    &completionCode);
20148761c62SAndrew Jeffery 
20248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
20348761c62SAndrew Jeffery }
20448761c62SAndrew Jeffery 
TEST(SetDateTime,testGoodEncodeRequset)20548761c62SAndrew Jeffery TEST(SetDateTime, testGoodEncodeRequset)
20648761c62SAndrew Jeffery {
20748761c62SAndrew Jeffery     uint8_t instanceId = 0;
20848761c62SAndrew Jeffery     uint8_t seconds = 50;
20948761c62SAndrew Jeffery     uint8_t minutes = 20;
21048761c62SAndrew Jeffery     uint8_t hours = 10;
21148761c62SAndrew Jeffery     uint8_t day = 11;
21248761c62SAndrew Jeffery     uint8_t month = 11;
21348761c62SAndrew Jeffery     uint16_t year = 2019;
21448761c62SAndrew Jeffery 
21548761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_set_date_time_req)>
21648761c62SAndrew Jeffery         requestMsg{};
21748761c62SAndrew Jeffery 
218*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
21948761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
22048761c62SAndrew Jeffery     auto rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day,
22148761c62SAndrew Jeffery                                        month, year, request,
22248761c62SAndrew Jeffery                                        requestMsg.size() - hdrSize);
22348761c62SAndrew Jeffery 
22448761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
22548761c62SAndrew Jeffery 
22648761c62SAndrew Jeffery     struct pldm_set_date_time_req* req =
227*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
22848761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_date_time_req*>(request->payload);
22948761c62SAndrew Jeffery     EXPECT_EQ(seconds, bcd2dec8(req->seconds));
23048761c62SAndrew Jeffery     EXPECT_EQ(minutes, bcd2dec8(req->minutes));
23148761c62SAndrew Jeffery     EXPECT_EQ(hours, bcd2dec8(req->hours));
23248761c62SAndrew Jeffery     EXPECT_EQ(day, bcd2dec8(req->day));
23348761c62SAndrew Jeffery     EXPECT_EQ(month, bcd2dec8(req->month));
23448761c62SAndrew Jeffery     EXPECT_EQ(year, bcd2dec16(le16toh(req->year)));
23548761c62SAndrew Jeffery }
23648761c62SAndrew Jeffery 
TEST(SetDateTime,testBadEncodeRequset)23748761c62SAndrew Jeffery TEST(SetDateTime, testBadEncodeRequset)
23848761c62SAndrew Jeffery {
23948761c62SAndrew Jeffery     uint8_t instanceId = 0;
24048761c62SAndrew Jeffery 
24148761c62SAndrew Jeffery     uint8_t seconds = 50;
24248761c62SAndrew Jeffery     uint8_t minutes = 20;
24348761c62SAndrew Jeffery     uint8_t hours = 10;
24448761c62SAndrew Jeffery     uint8_t day = 13;
24548761c62SAndrew Jeffery     uint8_t month = 11;
24648761c62SAndrew Jeffery     uint16_t year = 2019;
24748761c62SAndrew Jeffery 
24848761c62SAndrew Jeffery     uint8_t erday = 43;
24948761c62SAndrew Jeffery 
25048761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_set_date_time_req)>
25148761c62SAndrew Jeffery         requestMsg{};
25248761c62SAndrew Jeffery 
253*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
25448761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
25548761c62SAndrew Jeffery 
25648761c62SAndrew Jeffery     auto rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day,
25748761c62SAndrew Jeffery                                        month, year, nullptr,
25848761c62SAndrew Jeffery                                        requestMsg.size() - hdrSize);
25948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
26048761c62SAndrew Jeffery 
26148761c62SAndrew Jeffery     rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, erday,
26248761c62SAndrew Jeffery                                   month, year, request,
26348761c62SAndrew Jeffery                                   requestMsg.size() - hdrSize);
26448761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
26548761c62SAndrew Jeffery 
26648761c62SAndrew Jeffery     rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day,
26748761c62SAndrew Jeffery                                   month, year, request,
26848761c62SAndrew Jeffery                                   requestMsg.size() - hdrSize - 4);
26948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
27048761c62SAndrew Jeffery }
27148761c62SAndrew Jeffery 
TEST(SetDateTime,testGoodDecodeRequest)27248761c62SAndrew Jeffery TEST(SetDateTime, testGoodDecodeRequest)
27348761c62SAndrew Jeffery {
27448761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_set_date_time_req)>
27548761c62SAndrew Jeffery         requestMsg{};
27648761c62SAndrew Jeffery     uint8_t seconds = 0x50;
27748761c62SAndrew Jeffery     uint8_t minutes = 0x20;
27848761c62SAndrew Jeffery     uint8_t hours = 0x10;
27948761c62SAndrew Jeffery     uint8_t day = 0x11;
28048761c62SAndrew Jeffery     uint8_t month = 0x11;
28148761c62SAndrew Jeffery     uint16_t year = 0x2019;
28248761c62SAndrew Jeffery 
283*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
28448761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
28548761c62SAndrew Jeffery     struct pldm_set_date_time_req* req =
286*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
28748761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_date_time_req*>(request->payload);
28848761c62SAndrew Jeffery     req->seconds = seconds;
28948761c62SAndrew Jeffery     req->minutes = minutes;
29048761c62SAndrew Jeffery     req->hours = hours;
29148761c62SAndrew Jeffery     req->day = day;
29248761c62SAndrew Jeffery     req->month = month;
29348761c62SAndrew Jeffery     req->year = htole16(year);
29448761c62SAndrew Jeffery 
29548761c62SAndrew Jeffery     uint8_t retseconds;
29648761c62SAndrew Jeffery     uint8_t retminutes;
29748761c62SAndrew Jeffery     uint8_t rethours;
29848761c62SAndrew Jeffery     uint8_t retday;
29948761c62SAndrew Jeffery     uint8_t retmonth;
30048761c62SAndrew Jeffery     uint16_t retyear;
30148761c62SAndrew Jeffery 
30248761c62SAndrew Jeffery     auto rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize,
30348761c62SAndrew Jeffery                                        &retseconds, &retminutes, &rethours,
30448761c62SAndrew Jeffery                                        &retday, &retmonth, &retyear);
30548761c62SAndrew Jeffery 
30648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
30748761c62SAndrew Jeffery     EXPECT_EQ(retseconds, 50);
30848761c62SAndrew Jeffery     EXPECT_EQ(retminutes, 20);
30948761c62SAndrew Jeffery     EXPECT_EQ(rethours, 10);
31048761c62SAndrew Jeffery     EXPECT_EQ(retday, 11);
31148761c62SAndrew Jeffery     EXPECT_EQ(retmonth, 11);
31248761c62SAndrew Jeffery     EXPECT_EQ(retyear, 2019);
31348761c62SAndrew Jeffery }
31448761c62SAndrew Jeffery 
TEST(SetDateTime,testBadDecodeRequest)31548761c62SAndrew Jeffery TEST(SetDateTime, testBadDecodeRequest)
31648761c62SAndrew Jeffery {
31748761c62SAndrew Jeffery     uint8_t seconds = 0x50;
31848761c62SAndrew Jeffery     uint8_t minutes = 0x20;
31948761c62SAndrew Jeffery     uint8_t hours = 0x10;
32048761c62SAndrew Jeffery     uint8_t day = 0x11;
32148761c62SAndrew Jeffery     uint8_t month = 0x11;
32248761c62SAndrew Jeffery     uint16_t year = htole16(0x2019);
32348761c62SAndrew Jeffery 
32448761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(struct pldm_set_date_time_req)>
32548761c62SAndrew Jeffery         requestMsg{};
32648761c62SAndrew Jeffery 
327*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
32848761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
32948761c62SAndrew Jeffery 
33048761c62SAndrew Jeffery     decode_set_date_time_req(request, requestMsg.size() - hdrSize, &seconds,
33148761c62SAndrew Jeffery                              &minutes, &hours, &day, &month, &year);
33248761c62SAndrew Jeffery 
33348761c62SAndrew Jeffery     auto rc =
33448761c62SAndrew Jeffery         decode_set_date_time_req(nullptr, requestMsg.size() - hdrSize, &seconds,
33548761c62SAndrew Jeffery                                  &minutes, &hours, &day, &month, &year);
33648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
33748761c62SAndrew Jeffery 
33848761c62SAndrew Jeffery     rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize, nullptr,
33948761c62SAndrew Jeffery                                   nullptr, nullptr, nullptr, nullptr, nullptr);
34048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
34148761c62SAndrew Jeffery 
34248761c62SAndrew Jeffery     rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize - 4,
34348761c62SAndrew Jeffery                                   &seconds, &minutes, &hours, &day, &month,
34448761c62SAndrew Jeffery                                   &year);
34548761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
34648761c62SAndrew Jeffery }
34748761c62SAndrew Jeffery 
TEST(GetBIOSTable,testGoodEncodeResponse)34848761c62SAndrew Jeffery TEST(GetBIOSTable, testGoodEncodeResponse)
34948761c62SAndrew Jeffery {
35048761c62SAndrew Jeffery     std::array<uint8_t,
35148761c62SAndrew Jeffery                sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4>
35248761c62SAndrew Jeffery         responseMsg{};
353*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
35448761c62SAndrew Jeffery     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
35548761c62SAndrew Jeffery 
35648761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
35748761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
35848761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
35948761c62SAndrew Jeffery     std::array<uint8_t, 4> tableData{1, 2, 3, 4};
36048761c62SAndrew Jeffery 
36148761c62SAndrew Jeffery     auto rc = encode_get_bios_table_resp(
36248761c62SAndrew Jeffery         0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(),
36348761c62SAndrew Jeffery         sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4,
36448761c62SAndrew Jeffery         response);
36548761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
36648761c62SAndrew Jeffery 
36748761c62SAndrew Jeffery     struct pldm_get_bios_table_resp* resp =
368*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
36948761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_resp*>(response->payload);
37048761c62SAndrew Jeffery 
37148761c62SAndrew Jeffery     EXPECT_EQ(completionCode, resp->completion_code);
37248761c62SAndrew Jeffery     EXPECT_EQ(nextTransferHandle, le32toh(resp->next_transfer_handle));
37348761c62SAndrew Jeffery     EXPECT_EQ(transferFlag, resp->transfer_flag);
37448761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(tableData.data(), resp->table_data, tableData.size()));
37548761c62SAndrew Jeffery }
37648761c62SAndrew Jeffery 
TEST(GetBIOSTable,testBadEncodeResponse)37748761c62SAndrew Jeffery TEST(GetBIOSTable, testBadEncodeResponse)
37848761c62SAndrew Jeffery {
37948761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
38048761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
38148761c62SAndrew Jeffery     std::array<uint8_t, 4> tableData{1, 2, 3, 4};
38248761c62SAndrew Jeffery 
38348761c62SAndrew Jeffery     auto rc = encode_get_bios_table_resp(
38448761c62SAndrew Jeffery         0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(),
38548761c62SAndrew Jeffery         sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4, nullptr);
38648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
38748761c62SAndrew Jeffery }
38848761c62SAndrew Jeffery 
TEST(GetBIOSTable,testGoodEncodeRequest)38948761c62SAndrew Jeffery TEST(GetBIOSTable, testGoodEncodeRequest)
39048761c62SAndrew Jeffery {
39148761c62SAndrew Jeffery     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_REQ_BYTES>
39248761c62SAndrew Jeffery         requestMsg{};
39348761c62SAndrew Jeffery     uint32_t transferHandle = 0x0;
39448761c62SAndrew Jeffery     uint8_t transferOpFlag = 0x01;
39548761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
39648761c62SAndrew Jeffery 
397*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
39848761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
39948761c62SAndrew Jeffery     auto rc = encode_get_bios_table_req(0, transferHandle, transferOpFlag,
40048761c62SAndrew Jeffery                                         tableType, request);
40148761c62SAndrew Jeffery 
40248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
40348761c62SAndrew Jeffery 
40448761c62SAndrew Jeffery     struct pldm_get_bios_table_req* req =
405*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
40648761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_req*>(request->payload);
40748761c62SAndrew Jeffery     EXPECT_EQ(transferHandle, le32toh(req->transfer_handle));
40848761c62SAndrew Jeffery     EXPECT_EQ(transferOpFlag, req->transfer_op_flag);
40948761c62SAndrew Jeffery     EXPECT_EQ(tableType, req->table_type);
41048761c62SAndrew Jeffery }
41148761c62SAndrew Jeffery 
TEST(GetBIOSTable,testBadEncodeRequest)41248761c62SAndrew Jeffery TEST(GetBIOSTable, testBadEncodeRequest)
41348761c62SAndrew Jeffery {
41448761c62SAndrew Jeffery     uint32_t transferHandle = 0x0;
41548761c62SAndrew Jeffery     uint8_t transferOpFlag = 0x01;
41648761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
41748761c62SAndrew Jeffery 
41848761c62SAndrew Jeffery     auto rc = encode_get_bios_table_req(0, transferHandle, transferOpFlag,
41948761c62SAndrew Jeffery                                         tableType, nullptr);
42048761c62SAndrew Jeffery 
42148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
42248761c62SAndrew Jeffery }
42348761c62SAndrew Jeffery 
TEST(GetBIOSTable,testGoodDecodeRequest)42448761c62SAndrew Jeffery TEST(GetBIOSTable, testGoodDecodeRequest)
42548761c62SAndrew Jeffery {
42648761c62SAndrew Jeffery     const auto hdr_size = sizeof(pldm_msg_hdr);
42748761c62SAndrew Jeffery     std::array<uint8_t, hdr_size + PLDM_GET_BIOS_TABLE_REQ_BYTES> requestMsg{};
42848761c62SAndrew Jeffery     uint32_t transferHandle = 31;
42948761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
43048761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
43148761c62SAndrew Jeffery     uint32_t retTransferHandle = 0;
43248761c62SAndrew Jeffery     uint8_t retTransferOpFlag = 0;
43348761c62SAndrew Jeffery     uint8_t retTableType = 0;
43448761c62SAndrew Jeffery 
435*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
43648761c62SAndrew Jeffery     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
43748761c62SAndrew Jeffery     struct pldm_get_bios_table_req* request =
438*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
43948761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_req*>(req->payload);
44048761c62SAndrew Jeffery 
44148761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
44248761c62SAndrew Jeffery     request->transfer_op_flag = transferOpFlag;
44348761c62SAndrew Jeffery     request->table_type = tableType;
44448761c62SAndrew Jeffery 
44548761c62SAndrew Jeffery     auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size,
44648761c62SAndrew Jeffery                                         &retTransferHandle, &retTransferOpFlag,
44748761c62SAndrew Jeffery                                         &retTableType);
44848761c62SAndrew Jeffery 
44948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
45048761c62SAndrew Jeffery     EXPECT_EQ(transferHandle, retTransferHandle);
45148761c62SAndrew Jeffery     EXPECT_EQ(transferOpFlag, retTransferOpFlag);
45248761c62SAndrew Jeffery     EXPECT_EQ(tableType, retTableType);
45348761c62SAndrew Jeffery }
TEST(GetBIOSTable,testBadDecodeRequest)45448761c62SAndrew Jeffery TEST(GetBIOSTable, testBadDecodeRequest)
45548761c62SAndrew Jeffery {
45648761c62SAndrew Jeffery     const auto hdr_size = sizeof(pldm_msg_hdr);
45748761c62SAndrew Jeffery     std::array<uint8_t, hdr_size + PLDM_GET_BIOS_TABLE_REQ_BYTES> requestMsg{};
45848761c62SAndrew Jeffery     uint32_t transferHandle = 31;
45948761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
46048761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
46148761c62SAndrew Jeffery     uint32_t retTransferHandle = 0;
46248761c62SAndrew Jeffery     uint8_t retTransferOpFlag = 0;
46348761c62SAndrew Jeffery     uint8_t retTableType = 0;
46448761c62SAndrew Jeffery 
465*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
46648761c62SAndrew Jeffery     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
46748761c62SAndrew Jeffery     struct pldm_get_bios_table_req* request =
468*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
46948761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_req*>(req->payload);
47048761c62SAndrew Jeffery 
47148761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
47248761c62SAndrew Jeffery     request->transfer_op_flag = transferOpFlag;
47348761c62SAndrew Jeffery     request->table_type = tableType;
47448761c62SAndrew Jeffery 
47548761c62SAndrew Jeffery     auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size,
47648761c62SAndrew Jeffery                                         &retTransferHandle, &retTransferOpFlag,
47748761c62SAndrew Jeffery                                         &retTableType);
47848761c62SAndrew Jeffery 
47948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
48048761c62SAndrew Jeffery     EXPECT_EQ(transferHandle, retTransferHandle);
48148761c62SAndrew Jeffery     EXPECT_EQ(transferOpFlag, retTransferOpFlag);
48248761c62SAndrew Jeffery     EXPECT_EQ(tableType, retTableType);
48348761c62SAndrew Jeffery }
48448761c62SAndrew Jeffery /*
48548761c62SAndrew Jeffery TEST(GetBIOSTable, testBadDecodeRequest)
48648761c62SAndrew Jeffery {
48748761c62SAndrew Jeffery     const auto hdr_size = sizeof(pldm_msg_hdr);
48848761c62SAndrew Jeffery     std::array<uint8_t, hdr_size + PLDM_GET_BIOS_TABLE_REQ_BYTES> requestMsg{};
48948761c62SAndrew Jeffery     uint32_t transferHandle = 31;
49048761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
49148761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
49248761c62SAndrew Jeffery     uint32_t retTransferHandle = 0;
49348761c62SAndrew Jeffery     uint8_t retTransferOpFlag = 0;
49448761c62SAndrew Jeffery     uint8_t retTableType = 0;
49548761c62SAndrew Jeffery 
496*d0ba43afSAndrew Jeffery // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
49748761c62SAndrew Jeffery     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
49848761c62SAndrew Jeffery     struct pldm_get_bios_table_req* request =
499*d0ba43afSAndrew Jeffery // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
50048761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_req*>(req->payload);
50148761c62SAndrew Jeffery 
50248761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
50348761c62SAndrew Jeffery     request->transfer_op_flag = transferOpFlag;
50448761c62SAndrew Jeffery     request->table_type = tableType;
50548761c62SAndrew Jeffery 
50648761c62SAndrew Jeffery     auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size - 3,
50748761c62SAndrew Jeffery                                         &retTransferHandle, &retTransferOpFlag,
50848761c62SAndrew Jeffery                                         &retTableType);
50948761c62SAndrew Jeffery 
51048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
51148761c62SAndrew Jeffery }*/
51248761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testGoodDecodeRequest)51348761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testGoodDecodeRequest)
51448761c62SAndrew Jeffery {
51548761c62SAndrew Jeffery     uint32_t transferHandle = 45;
51648761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
51748761c62SAndrew Jeffery     uint16_t attributehandle = 10;
51848761c62SAndrew Jeffery     uint32_t retTransferHandle = 0;
51948761c62SAndrew Jeffery     uint8_t retTransferOpFlag = 0;
52048761c62SAndrew Jeffery     uint16_t retattributehandle = 0;
52148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(transferHandle) +
52248761c62SAndrew Jeffery                             sizeof(transferOpFlag) + sizeof(attributehandle)>
52348761c62SAndrew Jeffery         requestMsg{};
52448761c62SAndrew Jeffery 
525*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
52648761c62SAndrew Jeffery     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
52748761c62SAndrew Jeffery     struct pldm_get_bios_attribute_current_value_by_handle_req* request =
528*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
52948761c62SAndrew Jeffery         reinterpret_cast<
53048761c62SAndrew Jeffery             struct pldm_get_bios_attribute_current_value_by_handle_req*>(
53148761c62SAndrew Jeffery             req->payload);
53248761c62SAndrew Jeffery 
53348761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
53448761c62SAndrew Jeffery     request->transfer_op_flag = transferOpFlag;
53548761c62SAndrew Jeffery     request->attribute_handle = htole16(attributehandle);
53648761c62SAndrew Jeffery 
53748761c62SAndrew Jeffery     auto rc = decode_get_bios_attribute_current_value_by_handle_req(
53848761c62SAndrew Jeffery         req, requestMsg.size() - hdrSize, &retTransferHandle,
53948761c62SAndrew Jeffery         &retTransferOpFlag, &retattributehandle);
54048761c62SAndrew Jeffery 
54148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
54248761c62SAndrew Jeffery     EXPECT_EQ(transferHandle, retTransferHandle);
54348761c62SAndrew Jeffery     EXPECT_EQ(transferOpFlag, retTransferOpFlag);
54448761c62SAndrew Jeffery     EXPECT_EQ(attributehandle, retattributehandle);
54548761c62SAndrew Jeffery }
54648761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testBadDecodeRequest)54748761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testBadDecodeRequest)
54848761c62SAndrew Jeffery {
54948761c62SAndrew Jeffery 
55048761c62SAndrew Jeffery     uint32_t transferHandle = 0;
55148761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
55248761c62SAndrew Jeffery     uint16_t attribute_handle = 0;
55348761c62SAndrew Jeffery     uint32_t retTransferHandle = 0;
55448761c62SAndrew Jeffery     uint8_t retTransferOpFlag = 0;
55548761c62SAndrew Jeffery     uint16_t retattribute_handle = 0;
55648761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + sizeof(transferHandle) +
55748761c62SAndrew Jeffery                             sizeof(transferOpFlag) + sizeof(attribute_handle)>
55848761c62SAndrew Jeffery         requestMsg{};
55948761c62SAndrew Jeffery 
560*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
56148761c62SAndrew Jeffery     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
56248761c62SAndrew Jeffery     struct pldm_get_bios_attribute_current_value_by_handle_req* request =
563*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
56448761c62SAndrew Jeffery         reinterpret_cast<
56548761c62SAndrew Jeffery             struct pldm_get_bios_attribute_current_value_by_handle_req*>(
56648761c62SAndrew Jeffery             req->payload);
56748761c62SAndrew Jeffery 
56848761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
56948761c62SAndrew Jeffery     request->transfer_op_flag = transferOpFlag;
57048761c62SAndrew Jeffery     request->attribute_handle = attribute_handle;
57148761c62SAndrew Jeffery 
57248761c62SAndrew Jeffery     auto rc = decode_get_bios_attribute_current_value_by_handle_req(
57348761c62SAndrew Jeffery         NULL, requestMsg.size() - hdrSize, &retTransferHandle,
57448761c62SAndrew Jeffery         &retTransferOpFlag, &retattribute_handle);
57548761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
57648761c62SAndrew Jeffery 
57748761c62SAndrew Jeffery     transferHandle = 31;
57848761c62SAndrew Jeffery     request->transfer_handle = htole32(transferHandle);
57948761c62SAndrew Jeffery 
58048761c62SAndrew Jeffery     rc = decode_get_bios_attribute_current_value_by_handle_req(
58148761c62SAndrew Jeffery         req, 0, &retTransferHandle, &retTransferOpFlag, &retattribute_handle);
58248761c62SAndrew Jeffery 
58348761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
58448761c62SAndrew Jeffery }
58548761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testGoodEncodeRequest)58648761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testGoodEncodeRequest)
58748761c62SAndrew Jeffery {
58848761c62SAndrew Jeffery     std::array<uint8_t, sizeof(pldm_msg_hdr) +
58948761c62SAndrew Jeffery                             PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_REQ_BYTES>
59048761c62SAndrew Jeffery         requestMsg{};
59148761c62SAndrew Jeffery     uint32_t transferHandle = 45;
59248761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
59348761c62SAndrew Jeffery     uint8_t attributeHandle = 10;
59448761c62SAndrew Jeffery 
595*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
59648761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
59748761c62SAndrew Jeffery     auto rc = encode_get_bios_attribute_current_value_by_handle_req(
59848761c62SAndrew Jeffery         0, transferHandle, transferOpFlag, attributeHandle, request);
59948761c62SAndrew Jeffery 
60048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
60148761c62SAndrew Jeffery 
60248761c62SAndrew Jeffery     struct pldm_get_bios_attribute_current_value_by_handle_req* req =
603*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
60448761c62SAndrew Jeffery         reinterpret_cast<
60548761c62SAndrew Jeffery             struct pldm_get_bios_attribute_current_value_by_handle_req*>(
60648761c62SAndrew Jeffery             request->payload);
60748761c62SAndrew Jeffery     EXPECT_EQ(transferHandle, le32toh(req->transfer_handle));
60848761c62SAndrew Jeffery     EXPECT_EQ(transferOpFlag, req->transfer_op_flag);
60948761c62SAndrew Jeffery     EXPECT_EQ(attributeHandle, le16toh(req->attribute_handle));
61048761c62SAndrew Jeffery }
61148761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testBadEncodeRequest)61248761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testBadEncodeRequest)
61348761c62SAndrew Jeffery {
61448761c62SAndrew Jeffery     uint32_t transferHandle = 0;
61548761c62SAndrew Jeffery     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
61648761c62SAndrew Jeffery     uint8_t attributeHandle = 0;
61748761c62SAndrew Jeffery 
61848761c62SAndrew Jeffery     auto rc = encode_get_bios_attribute_current_value_by_handle_req(
61948761c62SAndrew Jeffery         0, transferHandle, transferOpFlag, attributeHandle, nullptr);
62048761c62SAndrew Jeffery 
62148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
62248761c62SAndrew Jeffery }
62348761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testGoodEncodeResponse)62448761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testGoodEncodeResponse)
62548761c62SAndrew Jeffery {
62648761c62SAndrew Jeffery 
62748761c62SAndrew Jeffery     uint8_t instanceId = 10;
62848761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
62948761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
63048761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
63148761c62SAndrew Jeffery     uint8_t attributeData = 44;
63248761c62SAndrew Jeffery     std::array<uint8_t,
63348761c62SAndrew Jeffery                hdrSize +
63448761c62SAndrew Jeffery                    sizeof(pldm_get_bios_attribute_current_value_by_handle_resp)>
63548761c62SAndrew Jeffery         responseMsg{};
636*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
63748761c62SAndrew Jeffery     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
63848761c62SAndrew Jeffery 
63948761c62SAndrew Jeffery     auto rc = encode_get_bios_current_value_by_handle_resp(
64048761c62SAndrew Jeffery         instanceId, completionCode, nextTransferHandle, transferFlag,
64148761c62SAndrew Jeffery         &attributeData, sizeof(attributeData), response);
64248761c62SAndrew Jeffery 
64348761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
64448761c62SAndrew Jeffery 
64548761c62SAndrew Jeffery     struct pldm_get_bios_attribute_current_value_by_handle_resp* resp =
646*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
64748761c62SAndrew Jeffery         reinterpret_cast<
64848761c62SAndrew Jeffery             struct pldm_get_bios_attribute_current_value_by_handle_resp*>(
64948761c62SAndrew Jeffery             response->payload);
65048761c62SAndrew Jeffery 
65148761c62SAndrew Jeffery     EXPECT_EQ(completionCode, resp->completion_code);
65248761c62SAndrew Jeffery     EXPECT_EQ(nextTransferHandle, le32toh(resp->next_transfer_handle));
65348761c62SAndrew Jeffery     EXPECT_EQ(transferFlag, resp->transfer_flag);
65448761c62SAndrew Jeffery     EXPECT_EQ(
65548761c62SAndrew Jeffery         0, memcmp(&attributeData, resp->attribute_data, sizeof(attributeData)));
65648761c62SAndrew Jeffery }
65748761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testBadEncodeResponse)65848761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testBadEncodeResponse)
65948761c62SAndrew Jeffery {
66048761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
66148761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
66248761c62SAndrew Jeffery     uint8_t attributeData = 44;
66348761c62SAndrew Jeffery 
66448761c62SAndrew Jeffery     auto rc = encode_get_bios_current_value_by_handle_resp(
66548761c62SAndrew Jeffery         0, PLDM_SUCCESS, nextTransferHandle, transferFlag, &attributeData,
66648761c62SAndrew Jeffery         sizeof(attributeData), nullptr);
66748761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
66848761c62SAndrew Jeffery 
66948761c62SAndrew Jeffery     std::array<uint8_t,
67048761c62SAndrew Jeffery                hdrSize +
67148761c62SAndrew Jeffery                    sizeof(pldm_get_bios_attribute_current_value_by_handle_resp)>
67248761c62SAndrew Jeffery         responseMsg{};
673*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
67448761c62SAndrew Jeffery     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
67548761c62SAndrew Jeffery     rc = encode_get_bios_current_value_by_handle_resp(
67648761c62SAndrew Jeffery         0, PLDM_SUCCESS, nextTransferHandle, transferFlag, nullptr,
67748761c62SAndrew Jeffery         sizeof(attributeData), response);
67848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
67948761c62SAndrew Jeffery }
68048761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testGoodEncodeRequest)68148761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testGoodEncodeRequest)
68248761c62SAndrew Jeffery {
68348761c62SAndrew Jeffery     uint8_t instanceId = 10;
68448761c62SAndrew Jeffery     uint32_t transferHandle = 32;
68548761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
68648761c62SAndrew Jeffery     uint32_t attributeData = 44;
68748761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES +
68848761c62SAndrew Jeffery                             sizeof(attributeData)>
68948761c62SAndrew Jeffery         requestMsg{};
690*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
69148761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
69248761c62SAndrew Jeffery     auto rc = encode_set_bios_attribute_current_value_req(
69348761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag,
694*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
69548761c62SAndrew Jeffery         reinterpret_cast<uint8_t*>(&attributeData), sizeof(attributeData),
69648761c62SAndrew Jeffery         request, requestMsg.size() - hdrSize);
69748761c62SAndrew Jeffery 
69848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
69948761c62SAndrew Jeffery 
70048761c62SAndrew Jeffery     struct pldm_set_bios_attribute_current_value_req* req =
701*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
70248761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_attribute_current_value_req*>(
70348761c62SAndrew Jeffery             request->payload);
70448761c62SAndrew Jeffery     EXPECT_EQ(htole32(transferHandle), req->transfer_handle);
70548761c62SAndrew Jeffery     EXPECT_EQ(transferFlag, req->transfer_flag);
70648761c62SAndrew Jeffery     EXPECT_EQ(
70748761c62SAndrew Jeffery         0, memcmp(&attributeData, req->attribute_data, sizeof(attributeData)));
70848761c62SAndrew Jeffery }
70948761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testBadEncodeRequest)71048761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testBadEncodeRequest)
71148761c62SAndrew Jeffery {
71248761c62SAndrew Jeffery     uint8_t instanceId = 10;
71348761c62SAndrew Jeffery     uint32_t transferHandle = 32;
71448761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
71548761c62SAndrew Jeffery     uint32_t attributeData = 44;
71648761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES>
71748761c62SAndrew Jeffery         requestMsg{};
718*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
71948761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
72048761c62SAndrew Jeffery 
72148761c62SAndrew Jeffery     auto rc = encode_set_bios_attribute_current_value_req(
72248761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag, nullptr, 0, nullptr, 0);
72348761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
72448761c62SAndrew Jeffery     rc = encode_set_bios_attribute_current_value_req(
72548761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag,
726*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
72748761c62SAndrew Jeffery         reinterpret_cast<uint8_t*>(&attributeData), sizeof(attributeData),
72848761c62SAndrew Jeffery         request, requestMsg.size() - hdrSize);
72948761c62SAndrew Jeffery 
73048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
73148761c62SAndrew Jeffery }
73248761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testGoodDecodeRequest)73348761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testGoodDecodeRequest)
73448761c62SAndrew Jeffery {
73548761c62SAndrew Jeffery     uint32_t transferHandle = 32;
73648761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
73748761c62SAndrew Jeffery     uint32_t attributeData = 44;
73848761c62SAndrew Jeffery 
73948761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES +
74048761c62SAndrew Jeffery                             sizeof(attributeData)>
74148761c62SAndrew Jeffery         requestMsg{};
742*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
74348761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
74448761c62SAndrew Jeffery     struct pldm_set_bios_attribute_current_value_req* req =
745*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
74648761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_attribute_current_value_req*>(
74748761c62SAndrew Jeffery             request->payload);
74848761c62SAndrew Jeffery     req->transfer_handle = htole32(transferHandle);
74948761c62SAndrew Jeffery     req->transfer_flag = transferFlag;
75048761c62SAndrew Jeffery     memcpy(req->attribute_data, &attributeData, sizeof(attributeData));
75148761c62SAndrew Jeffery 
75248761c62SAndrew Jeffery     uint32_t retTransferHandle;
75348761c62SAndrew Jeffery     uint8_t retTransferFlag;
75448761c62SAndrew Jeffery     struct variable_field attribute;
75548761c62SAndrew Jeffery     auto rc = decode_set_bios_attribute_current_value_req(
75648761c62SAndrew Jeffery         request, requestMsg.size() - hdrSize, &retTransferHandle,
75748761c62SAndrew Jeffery         &retTransferFlag, &attribute);
75848761c62SAndrew Jeffery 
75948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
76048761c62SAndrew Jeffery     EXPECT_EQ(retTransferHandle, transferHandle);
76148761c62SAndrew Jeffery     EXPECT_EQ(retTransferFlag, transferFlag);
76248761c62SAndrew Jeffery     EXPECT_EQ(attribute.length, sizeof(attributeData));
76348761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(attribute.ptr, &attributeData, sizeof(attributeData)));
76448761c62SAndrew Jeffery }
76548761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testBadDecodeRequest)76648761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testBadDecodeRequest)
76748761c62SAndrew Jeffery {
76848761c62SAndrew Jeffery     uint32_t transferHandle = 32;
76948761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
77048761c62SAndrew Jeffery     struct variable_field attribute;
77148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES - 1>
77248761c62SAndrew Jeffery         requestMsg{};
773*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
77448761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
77548761c62SAndrew Jeffery 
77648761c62SAndrew Jeffery     auto rc = decode_set_bios_attribute_current_value_req(
77748761c62SAndrew Jeffery         nullptr, 0, &transferHandle, &transferFlag, &attribute);
77848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
77948761c62SAndrew Jeffery     rc = decode_set_bios_attribute_current_value_req(
78048761c62SAndrew Jeffery         request, requestMsg.size() - hdrSize, &transferHandle, &transferFlag,
78148761c62SAndrew Jeffery         &attribute);
78248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
78348761c62SAndrew Jeffery }
78448761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testGoodEncodeResponse)78548761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testGoodEncodeResponse)
78648761c62SAndrew Jeffery {
78748761c62SAndrew Jeffery     uint8_t instanceId = 10;
78848761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
78948761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
79048761c62SAndrew Jeffery 
79148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES>
79248761c62SAndrew Jeffery         responseMsg{};
79348761c62SAndrew Jeffery     struct pldm_msg* response =
794*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
79548761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
79648761c62SAndrew Jeffery     auto rc = encode_set_bios_attribute_current_value_resp(
79748761c62SAndrew Jeffery         instanceId, completionCode, nextTransferHandle, response);
79848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
79948761c62SAndrew Jeffery 
80048761c62SAndrew Jeffery     struct pldm_set_bios_attribute_current_value_resp* resp =
801*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
80248761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_attribute_current_value_resp*>(
80348761c62SAndrew Jeffery             response->payload);
80448761c62SAndrew Jeffery     EXPECT_EQ(completionCode, resp->completion_code);
80548761c62SAndrew Jeffery     EXPECT_EQ(htole32(nextTransferHandle), resp->next_transfer_handle);
80648761c62SAndrew Jeffery }
80748761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testBadEncodeResponse)80848761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testBadEncodeResponse)
80948761c62SAndrew Jeffery {
81048761c62SAndrew Jeffery     uint8_t instanceId = 10;
81148761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
81248761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
81348761c62SAndrew Jeffery     auto rc = encode_set_bios_attribute_current_value_resp(
81448761c62SAndrew Jeffery         instanceId, completionCode, nextTransferHandle, nullptr);
81548761c62SAndrew Jeffery 
81648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
81748761c62SAndrew Jeffery }
TEST(SetBiosAttributeCurrentValue,testGoodDecodeResponse)81848761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testGoodDecodeResponse)
81948761c62SAndrew Jeffery {
82048761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
82148761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
82248761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES>
82348761c62SAndrew Jeffery         responseMsg{};
82448761c62SAndrew Jeffery     struct pldm_msg* response =
825*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
82648761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
82748761c62SAndrew Jeffery     struct pldm_set_bios_attribute_current_value_resp* resp =
828*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
82948761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_attribute_current_value_resp*>(
83048761c62SAndrew Jeffery             response->payload);
83148761c62SAndrew Jeffery 
83248761c62SAndrew Jeffery     resp->completion_code = completionCode;
83348761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
83448761c62SAndrew Jeffery 
83548761c62SAndrew Jeffery     uint8_t retCompletionCode;
83648761c62SAndrew Jeffery     uint32_t retNextTransferHandle;
83748761c62SAndrew Jeffery     auto rc = decode_set_bios_attribute_current_value_resp(
83848761c62SAndrew Jeffery         response, responseMsg.size() - hdrSize, &retCompletionCode,
83948761c62SAndrew Jeffery         &retNextTransferHandle);
84048761c62SAndrew Jeffery 
84148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
84248761c62SAndrew Jeffery     EXPECT_EQ(completionCode, retCompletionCode);
84348761c62SAndrew Jeffery     EXPECT_EQ(nextTransferHandle, retNextTransferHandle);
84448761c62SAndrew Jeffery }
84548761c62SAndrew Jeffery 
TEST(SetBiosAttributeCurrentValue,testBadDecodeResponse)84648761c62SAndrew Jeffery TEST(SetBiosAttributeCurrentValue, testBadDecodeResponse)
84748761c62SAndrew Jeffery {
84848761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
84948761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
85048761c62SAndrew Jeffery 
85148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES>
85248761c62SAndrew Jeffery         responseMsg{};
85348761c62SAndrew Jeffery     struct pldm_msg* response =
854*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
85548761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
85648761c62SAndrew Jeffery     struct pldm_set_bios_attribute_current_value_resp* resp =
857*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
85848761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_attribute_current_value_resp*>(
85948761c62SAndrew Jeffery             response->payload);
86048761c62SAndrew Jeffery 
86148761c62SAndrew Jeffery     resp->completion_code = completionCode;
86248761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
86348761c62SAndrew Jeffery 
86448761c62SAndrew Jeffery     auto rc = decode_set_bios_attribute_current_value_resp(
86548761c62SAndrew Jeffery         nullptr, 0, &completionCode, &nextTransferHandle);
86648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
86748761c62SAndrew Jeffery 
86848761c62SAndrew Jeffery     rc = decode_set_bios_attribute_current_value_resp(
86948761c62SAndrew Jeffery         response, responseMsg.size() - hdrSize - 1, &completionCode,
87048761c62SAndrew Jeffery         &nextTransferHandle);
87148761c62SAndrew Jeffery 
87248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
87348761c62SAndrew Jeffery }
87448761c62SAndrew Jeffery 
TEST(GetBIOSTable,testDecodeResponse)87548761c62SAndrew Jeffery TEST(GetBIOSTable, testDecodeResponse)
87648761c62SAndrew Jeffery {
87748761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
87848761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
87948761c62SAndrew Jeffery     uint8_t transfer_flag = PLDM_START_AND_END;
88048761c62SAndrew Jeffery 
88148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES>
88248761c62SAndrew Jeffery         responseMsg{};
88348761c62SAndrew Jeffery     struct pldm_msg* response =
884*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
88548761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
88648761c62SAndrew Jeffery 
88748761c62SAndrew Jeffery     struct pldm_get_bios_table_resp* resp =
888*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
88948761c62SAndrew Jeffery         reinterpret_cast<struct pldm_get_bios_table_resp*>(response->payload);
89048761c62SAndrew Jeffery 
89148761c62SAndrew Jeffery     resp->completion_code = completionCode;
89248761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
89348761c62SAndrew Jeffery     resp->transfer_flag = transfer_flag;
89448761c62SAndrew Jeffery     size_t biosTableOffset = sizeof(completionCode) +
89548761c62SAndrew Jeffery                              sizeof(nextTransferHandle) + sizeof(transfer_flag);
89648761c62SAndrew Jeffery 
89748761c62SAndrew Jeffery     uint8_t retCompletionCode;
89848761c62SAndrew Jeffery     uint32_t retNextTransferHandle;
89948761c62SAndrew Jeffery     uint8_t retransfer_flag;
90048761c62SAndrew Jeffery     size_t rebiosTableOffset = 0;
90148761c62SAndrew Jeffery     auto rc = decode_get_bios_table_resp(
90248761c62SAndrew Jeffery         response, responseMsg.size(), &retCompletionCode,
90348761c62SAndrew Jeffery         &retNextTransferHandle, &retransfer_flag, &rebiosTableOffset);
90448761c62SAndrew Jeffery 
90548761c62SAndrew Jeffery     ASSERT_EQ(rc, PLDM_SUCCESS);
90648761c62SAndrew Jeffery     ASSERT_EQ(completionCode, retCompletionCode);
90748761c62SAndrew Jeffery     ASSERT_EQ(nextTransferHandle, retNextTransferHandle);
90848761c62SAndrew Jeffery     ASSERT_EQ(transfer_flag, retransfer_flag);
90948761c62SAndrew Jeffery     ASSERT_EQ(biosTableOffset, rebiosTableOffset);
91048761c62SAndrew Jeffery }
91148761c62SAndrew Jeffery 
TEST(GetBIOSAttributeCurrentValueByHandle,testDecodeResponse)91248761c62SAndrew Jeffery TEST(GetBIOSAttributeCurrentValueByHandle, testDecodeResponse)
91348761c62SAndrew Jeffery {
91448761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
91548761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
91648761c62SAndrew Jeffery     uint8_t transfer_flag = PLDM_START_AND_END;
91748761c62SAndrew Jeffery     uint32_t attributeData = 44;
91848761c62SAndrew Jeffery 
91948761c62SAndrew Jeffery     std::array<uint8_t,
92048761c62SAndrew Jeffery                hdrSize + PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_MIN_RESP_BYTES +
92148761c62SAndrew Jeffery                    sizeof(attributeData)>
92248761c62SAndrew Jeffery         responseMsg{};
92348761c62SAndrew Jeffery     struct pldm_msg* response =
924*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
92548761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
92648761c62SAndrew Jeffery 
92748761c62SAndrew Jeffery     struct pldm_get_bios_attribute_current_value_by_handle_resp* resp =
928*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
92948761c62SAndrew Jeffery         reinterpret_cast<
93048761c62SAndrew Jeffery             struct pldm_get_bios_attribute_current_value_by_handle_resp*>(
93148761c62SAndrew Jeffery             response->payload);
93248761c62SAndrew Jeffery 
93348761c62SAndrew Jeffery     resp->completion_code = completionCode;
93448761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
93548761c62SAndrew Jeffery     resp->transfer_flag = transfer_flag;
93648761c62SAndrew Jeffery     memcpy(resp->attribute_data, &attributeData, sizeof(attributeData));
93748761c62SAndrew Jeffery 
93848761c62SAndrew Jeffery     uint8_t retCompletionCode;
93948761c62SAndrew Jeffery     uint32_t retNextTransferHandle;
94048761c62SAndrew Jeffery     uint8_t retransfer_flag;
94148761c62SAndrew Jeffery     struct variable_field retAttributeData;
94248761c62SAndrew Jeffery     auto rc = decode_get_bios_attribute_current_value_by_handle_resp(
94348761c62SAndrew Jeffery         response, responseMsg.size() - hdrSize, &retCompletionCode,
94448761c62SAndrew Jeffery         &retNextTransferHandle, &retransfer_flag, &retAttributeData);
94548761c62SAndrew Jeffery 
94648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
94748761c62SAndrew Jeffery     EXPECT_EQ(completionCode, retCompletionCode);
94848761c62SAndrew Jeffery     EXPECT_EQ(nextTransferHandle, retNextTransferHandle);
94948761c62SAndrew Jeffery     EXPECT_EQ(transfer_flag, retransfer_flag);
95048761c62SAndrew Jeffery     EXPECT_EQ(sizeof(attributeData), retAttributeData.length);
95148761c62SAndrew Jeffery     EXPECT_EQ(
95248761c62SAndrew Jeffery         0, memcmp(retAttributeData.ptr, &attributeData, sizeof(attributeData)));
95348761c62SAndrew Jeffery }
95448761c62SAndrew Jeffery 
TEST(SetBIOSTable,testGoodEncodeRequest)95548761c62SAndrew Jeffery TEST(SetBIOSTable, testGoodEncodeRequest)
95648761c62SAndrew Jeffery {
95748761c62SAndrew Jeffery     uint8_t instanceId = 10;
95848761c62SAndrew Jeffery     uint32_t transferHandle = 32;
95948761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
96048761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_STRING_TABLE;
96148761c62SAndrew Jeffery     uint32_t tableData = 44;
96248761c62SAndrew Jeffery     std::array<uint8_t,
96348761c62SAndrew Jeffery                hdrSize + PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES + sizeof(tableData)>
96448761c62SAndrew Jeffery         requestMsg{};
965*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
96648761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
96748761c62SAndrew Jeffery     auto rc = encode_set_bios_table_req(
96848761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag, tableType,
969*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
97048761c62SAndrew Jeffery         reinterpret_cast<uint8_t*>(&tableData), sizeof(tableData), request,
97148761c62SAndrew Jeffery         requestMsg.size() - hdrSize);
97248761c62SAndrew Jeffery 
97348761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
97448761c62SAndrew Jeffery 
97548761c62SAndrew Jeffery     struct pldm_set_bios_table_req* req =
976*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
97748761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_req*>(request->payload);
97848761c62SAndrew Jeffery 
97948761c62SAndrew Jeffery     EXPECT_EQ(htole32(transferHandle), req->transfer_handle);
98048761c62SAndrew Jeffery     EXPECT_EQ(transferFlag, req->transfer_flag);
98148761c62SAndrew Jeffery     EXPECT_EQ(tableType, req->table_type);
98248761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(&tableData, req->table_data, sizeof(tableData)));
98348761c62SAndrew Jeffery }
98448761c62SAndrew Jeffery 
TEST(SetBIOSTable,testBadEncodeRequest)98548761c62SAndrew Jeffery TEST(SetBIOSTable, testBadEncodeRequest)
98648761c62SAndrew Jeffery {
98748761c62SAndrew Jeffery     uint8_t instanceId = 10;
98848761c62SAndrew Jeffery     uint32_t transferHandle = 32;
98948761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
99048761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_STRING_TABLE;
99148761c62SAndrew Jeffery     uint32_t tableData = 44;
99248761c62SAndrew Jeffery     std::array<uint8_t,
99348761c62SAndrew Jeffery                hdrSize + PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES + sizeof(tableData)>
99448761c62SAndrew Jeffery         requestMsg{};
995*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
99648761c62SAndrew Jeffery     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
99748761c62SAndrew Jeffery 
99848761c62SAndrew Jeffery     auto rc = encode_set_bios_table_req(
99948761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag, tableType, NULL,
100048761c62SAndrew Jeffery         sizeof(tableData), request, requestMsg.size() - hdrSize);
100148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
100248761c62SAndrew Jeffery 
100348761c62SAndrew Jeffery     rc = encode_set_bios_table_req(
100448761c62SAndrew Jeffery         instanceId, transferHandle, transferFlag, tableType,
1005*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
100648761c62SAndrew Jeffery         reinterpret_cast<uint8_t*>(&tableData), sizeof(tableData), request,
100748761c62SAndrew Jeffery         requestMsg.size() - hdrSize + 1);
100848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
100948761c62SAndrew Jeffery }
101048761c62SAndrew Jeffery 
TEST(SetBIOSTable,testGoodDecodeResponse)101148761c62SAndrew Jeffery TEST(SetBIOSTable, testGoodDecodeResponse)
101248761c62SAndrew Jeffery {
101348761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
101448761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
101548761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_TABLE_RESP_BYTES> responseMsg{};
101648761c62SAndrew Jeffery     struct pldm_msg* response =
1017*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
101848761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
101948761c62SAndrew Jeffery     struct pldm_set_bios_table_resp* resp =
1020*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
102148761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_resp*>(response->payload);
102248761c62SAndrew Jeffery 
102348761c62SAndrew Jeffery     resp->completion_code = completionCode;
102448761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
102548761c62SAndrew Jeffery 
102648761c62SAndrew Jeffery     uint8_t retCompletionCode;
102748761c62SAndrew Jeffery     uint32_t retNextTransferHandle;
102848761c62SAndrew Jeffery     auto rc =
102948761c62SAndrew Jeffery         decode_set_bios_table_resp(response, responseMsg.size() - hdrSize,
103048761c62SAndrew Jeffery                                    &retCompletionCode, &retNextTransferHandle);
103148761c62SAndrew Jeffery 
103248761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
103348761c62SAndrew Jeffery     EXPECT_EQ(completionCode, retCompletionCode);
103448761c62SAndrew Jeffery     EXPECT_EQ(nextTransferHandle, retNextTransferHandle);
103548761c62SAndrew Jeffery }
103648761c62SAndrew Jeffery 
TEST(SetBIOSTable,testBadDecodeResponse)103748761c62SAndrew Jeffery TEST(SetBIOSTable, testBadDecodeResponse)
103848761c62SAndrew Jeffery {
103948761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
104048761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
104148761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_TABLE_RESP_BYTES> responseMsg{};
104248761c62SAndrew Jeffery     struct pldm_msg* response =
1043*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
104448761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
104548761c62SAndrew Jeffery     struct pldm_set_bios_table_resp* resp =
1046*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
104748761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_resp*>(response->payload);
104848761c62SAndrew Jeffery 
104948761c62SAndrew Jeffery     resp->completion_code = completionCode;
105048761c62SAndrew Jeffery     resp->next_transfer_handle = htole32(nextTransferHandle);
105148761c62SAndrew Jeffery 
105248761c62SAndrew Jeffery     uint8_t retCompletionCode;
105348761c62SAndrew Jeffery     uint32_t retNextTransferHandle;
105448761c62SAndrew Jeffery 
105548761c62SAndrew Jeffery     auto rc = decode_set_bios_table_resp(NULL, responseMsg.size() - hdrSize,
105648761c62SAndrew Jeffery                                          NULL, NULL);
105748761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
105848761c62SAndrew Jeffery 
105948761c62SAndrew Jeffery     rc = decode_set_bios_table_resp(response, responseMsg.size() - hdrSize + 1,
106048761c62SAndrew Jeffery                                     &retCompletionCode, &retNextTransferHandle);
106148761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
106248761c62SAndrew Jeffery }
106348761c62SAndrew Jeffery 
TEST(SetBIOSTable,testGoodEncodeResponse)106448761c62SAndrew Jeffery TEST(SetBIOSTable, testGoodEncodeResponse)
106548761c62SAndrew Jeffery {
106648761c62SAndrew Jeffery     uint8_t instanceId = 10;
106748761c62SAndrew Jeffery     uint32_t nextTransferHandle = 32;
106848761c62SAndrew Jeffery     uint8_t completionCode = PLDM_SUCCESS;
106948761c62SAndrew Jeffery 
107048761c62SAndrew Jeffery     std::array<uint8_t, hdrSize + PLDM_SET_BIOS_TABLE_RESP_BYTES> responseMsg{};
107148761c62SAndrew Jeffery     struct pldm_msg* response =
1072*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
107348761c62SAndrew Jeffery         reinterpret_cast<struct pldm_msg*>(responseMsg.data());
107448761c62SAndrew Jeffery     auto rc = encode_set_bios_table_resp(instanceId, completionCode,
107548761c62SAndrew Jeffery                                          nextTransferHandle, response);
107648761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
107748761c62SAndrew Jeffery 
107848761c62SAndrew Jeffery     struct pldm_set_bios_table_resp* resp =
1079*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
108048761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_resp*>(response->payload);
108148761c62SAndrew Jeffery     EXPECT_EQ(completionCode, resp->completion_code);
108248761c62SAndrew Jeffery     EXPECT_EQ(htole32(nextTransferHandle), resp->next_transfer_handle);
108348761c62SAndrew Jeffery }
108448761c62SAndrew Jeffery 
TEST(SetBIOSTable,testBadEncodeResponse)108548761c62SAndrew Jeffery TEST(SetBIOSTable, testBadEncodeResponse)
108648761c62SAndrew Jeffery {
108748761c62SAndrew Jeffery     auto rc = encode_set_bios_table_resp(0, PLDM_SUCCESS, 1, NULL);
108848761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
108948761c62SAndrew Jeffery }
109048761c62SAndrew Jeffery 
TEST(SetBIOSTable,testGoodDecodeRequest)109148761c62SAndrew Jeffery TEST(SetBIOSTable, testGoodDecodeRequest)
109248761c62SAndrew Jeffery {
109348761c62SAndrew Jeffery     uint32_t transferHandle = 32;
109448761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
109548761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_STRING_TABLE;
109648761c62SAndrew Jeffery     uint32_t tableData = 44;
109748761c62SAndrew Jeffery 
109848761c62SAndrew Jeffery     std::array<uint8_t,
109948761c62SAndrew Jeffery                hdrSize + PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES + sizeof(tableData)>
110048761c62SAndrew Jeffery         requestMsg{};
1101*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
110248761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
110348761c62SAndrew Jeffery     struct pldm_set_bios_table_req* req =
1104*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
110548761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_req*>(request->payload);
110648761c62SAndrew Jeffery     req->transfer_handle = htole32(transferHandle);
110748761c62SAndrew Jeffery     req->transfer_flag = transferFlag;
110848761c62SAndrew Jeffery     req->table_type = tableType;
110948761c62SAndrew Jeffery     memcpy(req->table_data, &tableData, sizeof(tableData));
111048761c62SAndrew Jeffery 
111148761c62SAndrew Jeffery     uint32_t retTransferHandle;
111248761c62SAndrew Jeffery     uint8_t retTransferFlag;
111348761c62SAndrew Jeffery     uint8_t retTableType;
111448761c62SAndrew Jeffery     struct variable_field table;
111548761c62SAndrew Jeffery     auto rc = decode_set_bios_table_req(request, requestMsg.size() - hdrSize,
111648761c62SAndrew Jeffery                                         &retTransferHandle, &retTransferFlag,
111748761c62SAndrew Jeffery                                         &retTableType, &table);
111848761c62SAndrew Jeffery 
111948761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_SUCCESS);
112048761c62SAndrew Jeffery     EXPECT_EQ(retTransferHandle, transferHandle);
112148761c62SAndrew Jeffery     EXPECT_EQ(retTransferFlag, transferFlag);
112248761c62SAndrew Jeffery     EXPECT_EQ(retTableType, tableType);
112348761c62SAndrew Jeffery     EXPECT_EQ(table.length, sizeof(tableData));
112448761c62SAndrew Jeffery     EXPECT_EQ(0, memcmp(table.ptr, &tableData, sizeof(tableData)));
112548761c62SAndrew Jeffery }
112648761c62SAndrew Jeffery 
TEST(SetBIOSTable,testBadDecodeRequest)112748761c62SAndrew Jeffery TEST(SetBIOSTable, testBadDecodeRequest)
112848761c62SAndrew Jeffery {
112948761c62SAndrew Jeffery     uint32_t transferHandle = 32;
113048761c62SAndrew Jeffery     uint8_t transferFlag = PLDM_START_AND_END;
113148761c62SAndrew Jeffery     uint8_t tableType = PLDM_BIOS_STRING_TABLE;
113248761c62SAndrew Jeffery     uint32_t tableData = 44;
113348761c62SAndrew Jeffery 
113448761c62SAndrew Jeffery     std::array<uint8_t,
113548761c62SAndrew Jeffery                hdrSize + PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES + sizeof(tableData)>
113648761c62SAndrew Jeffery         requestMsg{};
1137*d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
113848761c62SAndrew Jeffery     auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
113948761c62SAndrew Jeffery     struct pldm_set_bios_table_req* req =
1140*d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
114148761c62SAndrew Jeffery         reinterpret_cast<struct pldm_set_bios_table_req*>(request->payload);
114248761c62SAndrew Jeffery     req->transfer_handle = htole32(transferHandle);
114348761c62SAndrew Jeffery     req->transfer_flag = transferFlag;
114448761c62SAndrew Jeffery     req->table_type = tableType;
114548761c62SAndrew Jeffery     memcpy(req->table_data, &tableData, sizeof(tableData));
114648761c62SAndrew Jeffery 
114748761c62SAndrew Jeffery     uint32_t retTransferHandle;
114848761c62SAndrew Jeffery     uint8_t retTransferFlag;
114948761c62SAndrew Jeffery     uint8_t retTableType;
115048761c62SAndrew Jeffery 
115148761c62SAndrew Jeffery     auto rc = decode_set_bios_table_req(request, requestMsg.size() - hdrSize,
115248761c62SAndrew Jeffery                                         &retTransferHandle, &retTransferFlag,
115348761c62SAndrew Jeffery                                         &retTableType, NULL);
115448761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
115548761c62SAndrew Jeffery 
115648761c62SAndrew Jeffery     struct variable_field table;
115748761c62SAndrew Jeffery     rc = decode_set_bios_table_req(
115848761c62SAndrew Jeffery         request, requestMsg.size() - hdrSize - sizeof(tableData) - 1,
115948761c62SAndrew Jeffery         &retTransferHandle, &retTransferFlag, &retTableType, &table);
116048761c62SAndrew Jeffery     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
116148761c62SAndrew Jeffery }
1162