| #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(); |
| } |