blob: 364a3f17e75e71a0394949e72b6f4e63a8c9f2e3 [file] [log] [blame] [edit]
#include "vpdecc.h"
#include "ddimm_parser.hpp"
#include "exceptions.hpp"
#include "parser.hpp"
#include "types.hpp"
#include <cstdint>
#include <exception>
#include <fstream>
#include <gtest/gtest.h>
using namespace vpd;
TEST(DdimmVpdParserTest, GoodTestCase)
{
types::DdimmVpdMap l_ddimmMap{
std::pair<std::string, size_t>{"MemorySizeInKB", 0x2000000},
std::pair<std::string, types::BinaryVector>{
"FN", {0x30, 0x33, 0x48, 0x44, 0x37, 0x30, 0x30}},
std::pair<std::string, types::BinaryVector>{
"PN", {0x30, 0x33, 0x48, 0x44, 0x37, 0x30, 0x30}},
std::pair<std::string, types::BinaryVector>{
"SN",
{0x59, 0x48, 0x33, 0x33, 0x31, 0x54, 0x33, 0x38, 0x34, 0x30, 0x33,
0x46}},
std::pair<std::string, types::BinaryVector>{"CC",
{0x33, 0x32, 0x41, 0x31}},
std::pair<std::string, types::BinaryVector>{"DI", {0x80, 0xCE}}};
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr5_ddimm.dat");
Parser l_vpdParser(l_vpdFile, l_json);
ASSERT_EQ(1,
l_ddimmMap == std::get<types::DdimmVpdMap>(l_vpdParser.parse()));
}
TEST(DdimmVpdParserTest, DDR4GoodTestCase)
{
types::DdimmVpdMap l_ddimmMap{
std::pair<std::string, size_t>{"MemorySizeInKB", 0x4000000},
std::pair<std::string, types::BinaryVector>{
"FN", {0x37, 0x38, 0x50, 0x36, 0x35, 0x37, 0x35}},
std::pair<std::string, types::BinaryVector>{
"PN", {0x37, 0x38, 0x50, 0x36, 0x35, 0x37, 0x35}},
std::pair<std::string, types::BinaryVector>{
"SN",
{0x59, 0x48, 0x33, 0x35, 0x31, 0x54, 0x31, 0x35, 0x53, 0x30, 0x44,
0x35}},
std::pair<std::string, types::BinaryVector>{"CC",
{0x33, 0x32, 0x37, 0x42}},
std::pair<std::string, types::BinaryVector>{"DI", {0x80, 0xAD}}};
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr4_ddimm.dat");
Parser l_vpdParser(l_vpdFile, l_json);
ASSERT_EQ(1,
l_ddimmMap == std::get<types::DdimmVpdMap>(l_vpdParser.parse()));
}
TEST(DdimmVpdParserTest, InvalidDdrType)
{
// Invalid DDR type, corrupted at index[2]
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_2.dat");
Parser l_vpdParser(l_vpdFile, l_json);
EXPECT_THROW(l_vpdParser.parse(), std::exception);
}
TEST(DdimmVpdParserTest, ZeroDdimmSize)
{
// Badly formed DDIMM VPD data - corrupted at index[235],
// ddimm size calculated a zero
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_235.dat");
Parser l_vpdParser(l_vpdFile, l_json);
EXPECT_THROW(l_vpdParser.parse(), std::exception);
}
TEST(DdimmVpdParserTest, InvalidDensityPerDie)
{
// Out of range data, fails to check valid value - corrupted at index[4]
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_4.dat");
Parser l_vpdParser(l_vpdFile, l_json);
EXPECT_THROW(l_vpdParser.parse(), std::exception);
}
TEST(DdimmVpdParserTest, InvalidVpdType)
{
// Invalid VPD type - corrupted at index[2] & index[3]
// Not able to find the VPD type, vpdTypeCheck failed
nlohmann::json l_json;
std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_2_3.dat");
Parser l_vpdParser(l_vpdFile, l_json);
EXPECT_THROW(l_vpdParser.parse(), std::exception);
}
TEST(DdimmVpdParserTest, EmptyInputVector)
{
// Blank VPD
types::BinaryVector emptyVector{};
EXPECT_THROW(DdimmVpdParser(std::move(emptyVector)), DataException);
}
int main(int i_argc, char** io_argv)
{
::testing::InitGoogleTest(&i_argc, io_argv);
return RUN_ALL_TESTS();
}