blob: 948237b792cb5de8287f5a6dba8942d77df59c9b [file] [edit]
#include "MessagePackUnpackUtils.hpp"
#include "NvidiaGpuMctpVdm.hpp"
#include "OcpMctpVdm.hpp"
#include <array>
#include <cstdint>
#include <span>
#include <string>
#include <variant>
#include <vector>
#include <gtest/gtest.h>
using namespace gpu;
TEST(NvidiaGpuMctpVdmTest, EncodeGetInventoryInformationRequest)
{
std::array<uint8_t, 256> buf{};
uint8_t instanceId = 1;
uint8_t propertyId =
static_cast<uint8_t>(InventoryPropertyId::BOARD_PART_NUMBER);
auto rc = encodeGetInventoryInformationRequest(instanceId, propertyId, buf);
EXPECT_EQ(rc, 0);
UnpackBuffer ubuf(std::span<const uint8_t>(buf.data(), buf.size()));
ocp::accelerator_management::MessageType msgType{};
uint8_t recvInstanceId = 0;
uint8_t recvMsgType = 0;
EXPECT_EQ(ocp::accelerator_management::unpackHeader(
ubuf, gpu::nvidiaPciVendorId, msgType, recvInstanceId,
recvMsgType),
0);
uint8_t command = 0;
ubuf.unpack(command);
EXPECT_EQ(command,
static_cast<uint8_t>(
PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION));
uint8_t dataSize = 0;
ubuf.unpack(dataSize);
EXPECT_EQ(dataSize, sizeof(propertyId));
uint8_t recvPropertyId = 0;
ubuf.unpack(recvPropertyId);
EXPECT_EQ(recvPropertyId, propertyId);
EXPECT_EQ(ubuf.getError(), 0);
}
TEST(NvidiaGpuMctpVdmTest, DecodeInventoryString)
{
std::array<uint8_t, 256> buf{};
PackBuffer pbuf(buf);
ocp::accelerator_management::packHeader(
pbuf, gpu::nvidiaPciVendorId,
ocp::accelerator_management::MessageType::RESPONSE, 1,
static_cast<uint8_t>(MessageType::PLATFORM_ENVIRONMENTAL));
pbuf.pack(static_cast<uint8_t>(
PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION));
pbuf.pack(static_cast<uint8_t>(
ocp::accelerator_management::CompletionCode::SUCCESS));
pbuf.pack(static_cast<uint16_t>(0)); // reserved
pbuf.pack(static_cast<uint16_t>(5)); // data_size = 5 for "TEST1"
// Pack the string bytes manually
const char* testStr = "TEST1";
for (int i = 0; i < 5; i++)
{
pbuf.pack(static_cast<uint8_t>(testStr[i]));
}
ASSERT_EQ(pbuf.getError(), 0);
ocp::accelerator_management::CompletionCode cc =
ocp::accelerator_management::CompletionCode::ERROR;
uint16_t reasonCode = 0;
InventoryValue info;
auto rc = decodeGetInventoryInformationResponse(
buf, cc, reasonCode, InventoryPropertyId::BOARD_PART_NUMBER, info);
EXPECT_EQ(rc, 0);
EXPECT_EQ(cc, ocp::accelerator_management::CompletionCode::SUCCESS);
EXPECT_EQ(reasonCode, 0);
EXPECT_TRUE(std::holds_alternative<std::string>(info));
EXPECT_EQ(std::get<std::string>(info), "TEST1");
}
TEST(NvidiaGpuMctpVdmTest, DecodeInventoryDeviceGuid)
{
std::array<uint8_t, 256> buf{};
PackBuffer pbuf(buf);
ocp::accelerator_management::packHeader(
pbuf, gpu::nvidiaPciVendorId,
ocp::accelerator_management::MessageType::RESPONSE, 1,
static_cast<uint8_t>(MessageType::PLATFORM_ENVIRONMENTAL));
pbuf.pack(static_cast<uint8_t>(
PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION));
pbuf.pack(static_cast<uint8_t>(
ocp::accelerator_management::CompletionCode::SUCCESS));
pbuf.pack(static_cast<uint16_t>(0)); // reserved
pbuf.pack(static_cast<uint16_t>(8)); // data_size = 8 for DEVICE_GUID
std::vector<uint8_t> dummyGuid = {0xDE, 0xAD, 0xBE, 0xEF,
0x01, 0x23, 0x45, 0x67};
for (const auto& byte : dummyGuid)
{
pbuf.pack(byte);
}
ASSERT_EQ(pbuf.getError(), 0);
ocp::accelerator_management::CompletionCode cc =
ocp::accelerator_management::CompletionCode::ERROR;
uint16_t reasonCode = 0;
InventoryValue info;
auto rc = decodeGetInventoryInformationResponse(
buf, cc, reasonCode, InventoryPropertyId::DEVICE_GUID, info);
EXPECT_EQ(rc, 0);
EXPECT_EQ(cc, ocp::accelerator_management::CompletionCode::SUCCESS);
EXPECT_EQ(reasonCode, 0);
EXPECT_TRUE(std::holds_alternative<std::vector<uint8_t>>(info));
EXPECT_EQ(std::get<std::vector<uint8_t>>(info), dummyGuid);
}