#include #include #include #include #include #include #include #include #include constexpr auto hdrSize = sizeof(pldm_msg_hdr); TEST(GetDateTime, testEncodeRequest) { pldm_msg request{}; auto rc = encode_get_date_time_req(0, &request); EXPECT_EQ(rc, PLDM_SUCCESS); } TEST(GetDateTime, testEncodeResponse) { uint8_t completionCode = 0; uint8_t seconds = 50; uint8_t minutes = 20; uint8_t hours = 5; uint8_t day = 23; uint8_t month = 11; uint16_t year = 2019; std::array responseMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto response = reinterpret_cast(responseMsg.data()); auto rc = encode_get_date_time_resp(0, PLDM_SUCCESS, seconds, minutes, hours, day, month, year, response); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(completionCode, response->payload[0]); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]), &seconds, sizeof(seconds))); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) + sizeof(seconds), &minutes, sizeof(minutes))); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) + sizeof(seconds) + sizeof(minutes), &hours, sizeof(hours))); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) + sizeof(seconds) + sizeof(minutes) + sizeof(hours), &day, sizeof(day))); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) + sizeof(seconds) + sizeof(minutes) + sizeof(hours) + sizeof(day), &month, sizeof(month))); uint16_t yearLe = htole16(year); EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) + sizeof(seconds) + sizeof(minutes) + sizeof(hours) + sizeof(day) + sizeof(month), &yearLe, sizeof(yearLe))); } TEST(GetDateTime, testDecodeResponse) { std::array responseMsg{}; uint8_t completionCode = 0; uint8_t seconds = 55; uint8_t minutes = 2; uint8_t hours = 8; uint8_t day = 9; uint8_t month = 7; uint16_t year = 2020; uint16_t yearLe = htole16(year); uint8_t retSeconds = 0; uint8_t retMinutes = 0; uint8_t retHours = 0; uint8_t retDay = 0; uint8_t retMonth = 0; uint16_t retYear = 0; memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize, &seconds, sizeof(seconds)); memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) + hdrSize, &minutes, sizeof(minutes)); memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) + sizeof(minutes) + hdrSize, &hours, sizeof(hours)); memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) + sizeof(minutes) + sizeof(hours) + hdrSize, &day, sizeof(day)); memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) + sizeof(minutes) + sizeof(hours) + sizeof(day) + hdrSize, &month, sizeof(month)); memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) + sizeof(minutes) + sizeof(hours) + sizeof(day) + sizeof(month) + hdrSize, &yearLe, sizeof(yearLe)); // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto response = reinterpret_cast(responseMsg.data()); auto rc = decode_get_date_time_resp( response, responseMsg.size() - hdrSize, &completionCode, &retSeconds, &retMinutes, &retHours, &retDay, &retMonth, &retYear); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(seconds, retSeconds); EXPECT_EQ(minutes, retMinutes); EXPECT_EQ(hours, retHours); EXPECT_EQ(day, retDay); EXPECT_EQ(month, retMonth); EXPECT_EQ(year, retYear); } TEST(SetDateTime, testGoodEncodeResponse) { uint8_t instanceId = 0; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); auto rc = encode_set_date_time_resp(instanceId, completionCode, response, responseMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_only_cc_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); EXPECT_EQ(completionCode, resp->completion_code); } TEST(SetDateTime, testBadEncodeResponse) { uint8_t instanceId = 10; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); auto rc = encode_set_date_time_resp(instanceId, completionCode, nullptr, responseMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = encode_set_date_time_resp(instanceId, completionCode, response, responseMsg.size() - hdrSize - 1); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetDateTime, testGoodDecodeResponse) { uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_only_cc_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); resp->completion_code = completionCode; uint8_t retCompletionCode; auto rc = decode_set_date_time_resp(response, responseMsg.size() - hdrSize, &retCompletionCode); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(completionCode, retCompletionCode); } TEST(SetDateTime, testBadDecodeResponse) { uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); auto rc = decode_set_date_time_resp(nullptr, responseMsg.size() - hdrSize, &completionCode); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_date_time_resp(response, responseMsg.size() - hdrSize - 1, &completionCode); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetDateTime, testGoodEncodeRequset) { uint8_t instanceId = 0; uint8_t seconds = 50; uint8_t minutes = 20; uint8_t hours = 10; uint8_t day = 11; uint8_t month = 11; uint16_t year = 2019; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day, month, year, request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_set_date_time_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); EXPECT_EQ(seconds, bcd2dec8(req->seconds)); EXPECT_EQ(minutes, bcd2dec8(req->minutes)); EXPECT_EQ(hours, bcd2dec8(req->hours)); EXPECT_EQ(day, bcd2dec8(req->day)); EXPECT_EQ(month, bcd2dec8(req->month)); EXPECT_EQ(year, bcd2dec16(le16toh(req->year))); } TEST(SetDateTime, testBadEncodeRequset) { uint8_t instanceId = 0; uint8_t seconds = 50; uint8_t minutes = 20; uint8_t hours = 10; uint8_t day = 13; uint8_t month = 11; uint16_t year = 2019; uint8_t erday = 43; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day, month, year, nullptr, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, erday, month, year, request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = encode_set_date_time_req(instanceId, seconds, minutes, hours, day, month, year, request, requestMsg.size() - hdrSize - 4); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetDateTime, testGoodDecodeRequest) { std::array requestMsg{}; uint8_t seconds = 0x50; uint8_t minutes = 0x20; uint8_t hours = 0x10; uint8_t day = 0x11; uint8_t month = 0x11; uint16_t year = 0x2019; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); struct pldm_set_date_time_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); req->seconds = seconds; req->minutes = minutes; req->hours = hours; req->day = day; req->month = month; req->year = htole16(year); uint8_t retseconds; uint8_t retminutes; uint8_t rethours; uint8_t retday; uint8_t retmonth; uint16_t retyear; auto rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize, &retseconds, &retminutes, &rethours, &retday, &retmonth, &retyear); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(retseconds, 50); EXPECT_EQ(retminutes, 20); EXPECT_EQ(rethours, 10); EXPECT_EQ(retday, 11); EXPECT_EQ(retmonth, 11); EXPECT_EQ(retyear, 2019); } TEST(SetDateTime, testBadDecodeRequest) { uint8_t seconds = 0x50; uint8_t minutes = 0x20; uint8_t hours = 0x10; uint8_t day = 0x11; uint8_t month = 0x11; uint16_t year = htole16(0x2019); std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); decode_set_date_time_req(request, requestMsg.size() - hdrSize, &seconds, &minutes, &hours, &day, &month, &year); auto rc = decode_set_date_time_req(nullptr, requestMsg.size() - hdrSize, &seconds, &minutes, &hours, &day, &month, &year); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_date_time_req(request, requestMsg.size() - hdrSize - 4, &seconds, &minutes, &hours, &day, &month, &year); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(GetBIOSTable, testGoodEncodeResponse) { std::array responseMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto response = reinterpret_cast(responseMsg.data()); uint8_t completionCode = PLDM_SUCCESS; uint32_t nextTransferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; std::array tableData{1, 2, 3, 4}; auto rc = encode_get_bios_table_resp( 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(), sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4, response); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_get_bios_table_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); EXPECT_EQ(completionCode, resp->completion_code); EXPECT_EQ(nextTransferHandle, le32toh(resp->next_transfer_handle)); EXPECT_EQ(transferFlag, resp->transfer_flag); EXPECT_EQ(0, memcmp(tableData.data(), resp->table_data, tableData.size())); } TEST(GetBIOSTable, testBadEncodeResponse) { uint32_t nextTransferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; std::array tableData{1, 2, 3, 4}; auto rc = encode_get_bios_table_resp( 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(), sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4, nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(GetBIOSTable, testGoodEncodeRequest) { std::array requestMsg{}; uint32_t transferHandle = 0x0; uint8_t transferOpFlag = 0x01; uint8_t tableType = PLDM_BIOS_ATTR_TABLE; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_get_bios_table_req(0, transferHandle, transferOpFlag, tableType, request); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_get_bios_table_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); EXPECT_EQ(transferHandle, le32toh(req->transfer_handle)); EXPECT_EQ(transferOpFlag, req->transfer_op_flag); EXPECT_EQ(tableType, req->table_type); } TEST(GetBIOSTable, testBadEncodeRequest) { uint32_t transferHandle = 0x0; uint8_t transferOpFlag = 0x01; uint8_t tableType = PLDM_BIOS_ATTR_TABLE; auto rc = encode_get_bios_table_req(0, transferHandle, transferOpFlag, tableType, nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(GetBIOSTable, testGoodDecodeRequest) { const auto hdr_size = sizeof(pldm_msg_hdr); std::array requestMsg{}; uint32_t transferHandle = 31; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint8_t tableType = PLDM_BIOS_ATTR_TABLE; uint32_t retTransferHandle = 0; uint8_t retTransferOpFlag = 0; uint8_t retTableType = 0; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto req = reinterpret_cast(requestMsg.data()); struct pldm_get_bios_table_req* request = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(req->payload); request->transfer_handle = htole32(transferHandle); request->transfer_op_flag = transferOpFlag; request->table_type = tableType; auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size, &retTransferHandle, &retTransferOpFlag, &retTableType); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(transferHandle, retTransferHandle); EXPECT_EQ(transferOpFlag, retTransferOpFlag); EXPECT_EQ(tableType, retTableType); } TEST(GetBIOSTable, testBadDecodeRequest) { const auto hdr_size = sizeof(pldm_msg_hdr); std::array requestMsg{}; uint32_t transferHandle = 31; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint8_t tableType = PLDM_BIOS_ATTR_TABLE; uint32_t retTransferHandle = 0; uint8_t retTransferOpFlag = 0; uint8_t retTableType = 0; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto req = reinterpret_cast(requestMsg.data()); struct pldm_get_bios_table_req* request = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(req->payload); request->transfer_handle = htole32(transferHandle); request->transfer_op_flag = transferOpFlag; request->table_type = tableType; auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size, &retTransferHandle, &retTransferOpFlag, &retTableType); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(transferHandle, retTransferHandle); EXPECT_EQ(transferOpFlag, retTransferOpFlag); EXPECT_EQ(tableType, retTableType); } /* TEST(GetBIOSTable, testBadDecodeRequest) { const auto hdr_size = sizeof(pldm_msg_hdr); std::array requestMsg{}; uint32_t transferHandle = 31; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint8_t tableType = PLDM_BIOS_ATTR_TABLE; uint32_t retTransferHandle = 0; uint8_t retTransferOpFlag = 0; uint8_t retTableType = 0; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto req = reinterpret_cast(requestMsg.data()); struct pldm_get_bios_table_req* request = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(req->payload); request->transfer_handle = htole32(transferHandle); request->transfer_op_flag = transferOpFlag; request->table_type = tableType; auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size - 3, &retTransferHandle, &retTransferOpFlag, &retTableType); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); }*/ TEST(GetBIOSAttributeCurrentValueByHandle, testGoodDecodeRequest) { uint32_t transferHandle = 45; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint16_t attributehandle = 10; uint32_t retTransferHandle = 0; uint8_t retTransferOpFlag = 0; uint16_t retattributehandle = 0; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto req = reinterpret_cast(requestMsg.data()); struct pldm_get_bios_attribute_current_value_by_handle_req* request = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast< struct pldm_get_bios_attribute_current_value_by_handle_req*>( req->payload); request->transfer_handle = htole32(transferHandle); request->transfer_op_flag = transferOpFlag; request->attribute_handle = htole16(attributehandle); auto rc = decode_get_bios_attribute_current_value_by_handle_req( req, requestMsg.size() - hdrSize, &retTransferHandle, &retTransferOpFlag, &retattributehandle); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(transferHandle, retTransferHandle); EXPECT_EQ(transferOpFlag, retTransferOpFlag); EXPECT_EQ(attributehandle, retattributehandle); } TEST(GetBIOSAttributeCurrentValueByHandle, testBadDecodeRequest) { uint32_t transferHandle = 0; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint16_t attribute_handle = 0; uint32_t retTransferHandle = 0; uint8_t retTransferOpFlag = 0; uint16_t retattribute_handle = 0; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto req = reinterpret_cast(requestMsg.data()); struct pldm_get_bios_attribute_current_value_by_handle_req* request = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast< struct pldm_get_bios_attribute_current_value_by_handle_req*>( req->payload); request->transfer_handle = htole32(transferHandle); request->transfer_op_flag = transferOpFlag; request->attribute_handle = attribute_handle; auto rc = decode_get_bios_attribute_current_value_by_handle_req( NULL, requestMsg.size() - hdrSize, &retTransferHandle, &retTransferOpFlag, &retattribute_handle); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); transferHandle = 31; request->transfer_handle = htole32(transferHandle); rc = decode_get_bios_attribute_current_value_by_handle_req( req, 0, &retTransferHandle, &retTransferOpFlag, &retattribute_handle); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(GetBIOSAttributeCurrentValueByHandle, testGoodEncodeRequest) { std::array requestMsg{}; uint32_t transferHandle = 45; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint8_t attributeHandle = 10; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_get_bios_attribute_current_value_by_handle_req( 0, transferHandle, transferOpFlag, attributeHandle, request); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_get_bios_attribute_current_value_by_handle_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast< struct pldm_get_bios_attribute_current_value_by_handle_req*>( request->payload); EXPECT_EQ(transferHandle, le32toh(req->transfer_handle)); EXPECT_EQ(transferOpFlag, req->transfer_op_flag); EXPECT_EQ(attributeHandle, le16toh(req->attribute_handle)); } TEST(GetBIOSAttributeCurrentValueByHandle, testBadEncodeRequest) { uint32_t transferHandle = 0; uint8_t transferOpFlag = PLDM_GET_FIRSTPART; uint8_t attributeHandle = 0; auto rc = encode_get_bios_attribute_current_value_by_handle_req( 0, transferHandle, transferOpFlag, attributeHandle, nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(GetBIOSAttributeCurrentValueByHandle, testGoodEncodeResponse) { uint8_t instanceId = 10; uint8_t completionCode = PLDM_SUCCESS; uint32_t nextTransferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t attributeData = 44; std::array responseMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto response = reinterpret_cast(responseMsg.data()); auto rc = encode_get_bios_current_value_by_handle_resp( instanceId, completionCode, nextTransferHandle, transferFlag, &attributeData, sizeof(attributeData), response); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_get_bios_attribute_current_value_by_handle_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast< struct pldm_get_bios_attribute_current_value_by_handle_resp*>( response->payload); EXPECT_EQ(completionCode, resp->completion_code); EXPECT_EQ(nextTransferHandle, le32toh(resp->next_transfer_handle)); EXPECT_EQ(transferFlag, resp->transfer_flag); EXPECT_EQ( 0, memcmp(&attributeData, resp->attribute_data, sizeof(attributeData))); } TEST(GetBIOSAttributeCurrentValueByHandle, testBadEncodeResponse) { uint32_t nextTransferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t attributeData = 44; auto rc = encode_get_bios_current_value_by_handle_resp( 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, &attributeData, sizeof(attributeData), nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); std::array responseMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto response = reinterpret_cast(responseMsg.data()); rc = encode_get_bios_current_value_by_handle_resp( 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, nullptr, sizeof(attributeData), response); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(SetBiosAttributeCurrentValue, testGoodEncodeRequest) { uint8_t instanceId = 10; uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint32_t attributeData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_bios_attribute_current_value_req( instanceId, transferHandle, transferFlag, // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&attributeData), sizeof(attributeData), request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_set_bios_attribute_current_value_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast( request->payload); EXPECT_EQ(htole32(transferHandle), req->transfer_handle); EXPECT_EQ(transferFlag, req->transfer_flag); EXPECT_EQ( 0, memcmp(&attributeData, req->attribute_data, sizeof(attributeData))); } TEST(SetBiosAttributeCurrentValue, testBadEncodeRequest) { uint8_t instanceId = 10; uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint32_t attributeData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_bios_attribute_current_value_req( instanceId, transferHandle, transferFlag, nullptr, 0, nullptr, 0); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = encode_set_bios_attribute_current_value_req( instanceId, transferHandle, transferFlag, // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&attributeData), sizeof(attributeData), request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetBiosAttributeCurrentValue, testGoodDecodeRequest) { uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint32_t attributeData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); struct pldm_set_bios_attribute_current_value_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast( request->payload); req->transfer_handle = htole32(transferHandle); req->transfer_flag = transferFlag; memcpy(req->attribute_data, &attributeData, sizeof(attributeData)); uint32_t retTransferHandle; uint8_t retTransferFlag; struct variable_field attribute; auto rc = decode_set_bios_attribute_current_value_req( request, requestMsg.size() - hdrSize, &retTransferHandle, &retTransferFlag, &attribute); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(retTransferHandle, transferHandle); EXPECT_EQ(retTransferFlag, transferFlag); EXPECT_EQ(attribute.length, sizeof(attributeData)); EXPECT_EQ(0, memcmp(attribute.ptr, &attributeData, sizeof(attributeData))); } TEST(SetBiosAttributeCurrentValue, testBadDecodeRequest) { uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; struct variable_field attribute; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = decode_set_bios_attribute_current_value_req( nullptr, 0, &transferHandle, &transferFlag, &attribute); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_bios_attribute_current_value_req( request, requestMsg.size() - hdrSize, &transferHandle, &transferFlag, &attribute); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetBiosAttributeCurrentValue, testGoodEncodeResponse) { uint8_t instanceId = 10; uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); auto rc = encode_set_bios_attribute_current_value_resp( instanceId, completionCode, nextTransferHandle, response); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_set_bios_attribute_current_value_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast( response->payload); EXPECT_EQ(completionCode, resp->completion_code); EXPECT_EQ(htole32(nextTransferHandle), resp->next_transfer_handle); } TEST(SetBiosAttributeCurrentValue, testBadEncodeResponse) { uint8_t instanceId = 10; uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; auto rc = encode_set_bios_attribute_current_value_resp( instanceId, completionCode, nextTransferHandle, nullptr); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(SetBiosAttributeCurrentValue, testGoodDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_set_bios_attribute_current_value_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast( response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); uint8_t retCompletionCode; uint32_t retNextTransferHandle; auto rc = decode_set_bios_attribute_current_value_resp( response, responseMsg.size() - hdrSize, &retCompletionCode, &retNextTransferHandle); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(completionCode, retCompletionCode); EXPECT_EQ(nextTransferHandle, retNextTransferHandle); } TEST(SetBiosAttributeCurrentValue, testBadDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_set_bios_attribute_current_value_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast( response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); auto rc = decode_set_bios_attribute_current_value_resp( nullptr, 0, &completionCode, &nextTransferHandle); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_bios_attribute_current_value_resp( response, responseMsg.size() - hdrSize - 1, &completionCode, &nextTransferHandle); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(GetBIOSTable, testDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; uint8_t transfer_flag = PLDM_START_AND_END; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_get_bios_table_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); resp->transfer_flag = transfer_flag; size_t biosTableOffset = sizeof(completionCode) + sizeof(nextTransferHandle) + sizeof(transfer_flag); uint8_t retCompletionCode; uint32_t retNextTransferHandle; uint8_t retransfer_flag; size_t rebiosTableOffset = 0; auto rc = decode_get_bios_table_resp( response, responseMsg.size(), &retCompletionCode, &retNextTransferHandle, &retransfer_flag, &rebiosTableOffset); ASSERT_EQ(rc, PLDM_SUCCESS); ASSERT_EQ(completionCode, retCompletionCode); ASSERT_EQ(nextTransferHandle, retNextTransferHandle); ASSERT_EQ(transfer_flag, retransfer_flag); ASSERT_EQ(biosTableOffset, rebiosTableOffset); } TEST(GetBIOSAttributeCurrentValueByHandle, testDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; uint8_t transfer_flag = PLDM_START_AND_END; uint32_t attributeData = 44; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_get_bios_attribute_current_value_by_handle_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast< struct pldm_get_bios_attribute_current_value_by_handle_resp*>( response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); resp->transfer_flag = transfer_flag; memcpy(resp->attribute_data, &attributeData, sizeof(attributeData)); uint8_t retCompletionCode; uint32_t retNextTransferHandle; uint8_t retransfer_flag; struct variable_field retAttributeData; auto rc = decode_get_bios_attribute_current_value_by_handle_resp( response, responseMsg.size() - hdrSize, &retCompletionCode, &retNextTransferHandle, &retransfer_flag, &retAttributeData); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(completionCode, retCompletionCode); EXPECT_EQ(nextTransferHandle, retNextTransferHandle); EXPECT_EQ(transfer_flag, retransfer_flag); EXPECT_EQ(sizeof(attributeData), retAttributeData.length); EXPECT_EQ( 0, memcmp(retAttributeData.ptr, &attributeData, sizeof(attributeData))); } TEST(SetBIOSTable, testGoodEncodeRequest) { uint8_t instanceId = 10; uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t tableType = PLDM_BIOS_STRING_TABLE; uint32_t tableData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_bios_table_req( instanceId, transferHandle, transferFlag, tableType, // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&tableData), sizeof(tableData), request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_set_bios_table_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); EXPECT_EQ(htole32(transferHandle), req->transfer_handle); EXPECT_EQ(transferFlag, req->transfer_flag); EXPECT_EQ(tableType, req->table_type); EXPECT_EQ(0, memcmp(&tableData, req->table_data, sizeof(tableData))); } TEST(SetBIOSTable, testBadEncodeRequest) { uint8_t instanceId = 10; uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t tableType = PLDM_BIOS_STRING_TABLE; uint32_t tableData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); auto rc = encode_set_bios_table_req( instanceId, transferHandle, transferFlag, tableType, NULL, sizeof(tableData), request, requestMsg.size() - hdrSize); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = encode_set_bios_table_req( instanceId, transferHandle, transferFlag, tableType, // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&tableData), sizeof(tableData), request, requestMsg.size() - hdrSize + 1); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetBIOSTable, testGoodDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_set_bios_table_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); uint8_t retCompletionCode; uint32_t retNextTransferHandle; auto rc = decode_set_bios_table_resp(response, responseMsg.size() - hdrSize, &retCompletionCode, &retNextTransferHandle); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(completionCode, retCompletionCode); EXPECT_EQ(nextTransferHandle, retNextTransferHandle); } TEST(SetBIOSTable, testBadDecodeResponse) { uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); struct pldm_set_bios_table_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); resp->completion_code = completionCode; resp->next_transfer_handle = htole32(nextTransferHandle); uint8_t retCompletionCode; uint32_t retNextTransferHandle; auto rc = decode_set_bios_table_resp(NULL, responseMsg.size() - hdrSize, NULL, NULL); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); rc = decode_set_bios_table_resp(response, responseMsg.size() - hdrSize + 1, &retCompletionCode, &retNextTransferHandle); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); } TEST(SetBIOSTable, testGoodEncodeResponse) { uint8_t instanceId = 10; uint32_t nextTransferHandle = 32; uint8_t completionCode = PLDM_SUCCESS; std::array responseMsg{}; struct pldm_msg* response = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(responseMsg.data()); auto rc = encode_set_bios_table_resp(instanceId, completionCode, nextTransferHandle, response); EXPECT_EQ(rc, PLDM_SUCCESS); struct pldm_set_bios_table_resp* resp = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(response->payload); EXPECT_EQ(completionCode, resp->completion_code); EXPECT_EQ(htole32(nextTransferHandle), resp->next_transfer_handle); } TEST(SetBIOSTable, testBadEncodeResponse) { auto rc = encode_set_bios_table_resp(0, PLDM_SUCCESS, 1, NULL); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); } TEST(SetBIOSTable, testGoodDecodeRequest) { uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t tableType = PLDM_BIOS_STRING_TABLE; uint32_t tableData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); struct pldm_set_bios_table_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); req->transfer_handle = htole32(transferHandle); req->transfer_flag = transferFlag; req->table_type = tableType; memcpy(req->table_data, &tableData, sizeof(tableData)); uint32_t retTransferHandle; uint8_t retTransferFlag; uint8_t retTableType; struct variable_field table; auto rc = decode_set_bios_table_req(request, requestMsg.size() - hdrSize, &retTransferHandle, &retTransferFlag, &retTableType, &table); EXPECT_EQ(rc, PLDM_SUCCESS); EXPECT_EQ(retTransferHandle, transferHandle); EXPECT_EQ(retTransferFlag, transferFlag); EXPECT_EQ(retTableType, tableType); EXPECT_EQ(table.length, sizeof(tableData)); EXPECT_EQ(0, memcmp(table.ptr, &tableData, sizeof(tableData))); } TEST(SetBIOSTable, testBadDecodeRequest) { uint32_t transferHandle = 32; uint8_t transferFlag = PLDM_START_AND_END; uint8_t tableType = PLDM_BIOS_STRING_TABLE; uint32_t tableData = 44; std::array requestMsg{}; // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto request = reinterpret_cast(requestMsg.data()); struct pldm_set_bios_table_req* req = // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(request->payload); req->transfer_handle = htole32(transferHandle); req->transfer_flag = transferFlag; req->table_type = tableType; memcpy(req->table_data, &tableData, sizeof(tableData)); uint32_t retTransferHandle; uint8_t retTransferFlag; uint8_t retTableType; auto rc = decode_set_bios_table_req(request, requestMsg.size() - hdrSize, &retTransferHandle, &retTransferFlag, &retTableType, NULL); EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); struct variable_field table; rc = decode_set_bios_table_req( request, requestMsg.size() - hdrSize - sizeof(tableData) - 1, &retTransferHandle, &retTransferFlag, &retTableType, &table); EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH); }