1fa5e4d32SSunny Srivastava #include "vpdecc.h"
2fa5e4d32SSunny Srivastava
3fa5e4d32SSunny Srivastava #include "ddimm_parser.hpp"
4fa5e4d32SSunny Srivastava #include "exceptions.hpp"
5fa5e4d32SSunny Srivastava #include "parser.hpp"
6fa5e4d32SSunny Srivastava #include "types.hpp"
7fa5e4d32SSunny Srivastava
8fa5e4d32SSunny Srivastava #include <cstdint>
9fa5e4d32SSunny Srivastava #include <exception>
10fa5e4d32SSunny Srivastava #include <fstream>
11fa5e4d32SSunny Srivastava
12fa5e4d32SSunny Srivastava #include <gtest/gtest.h>
13fa5e4d32SSunny Srivastava
14fa5e4d32SSunny Srivastava using namespace vpd;
15fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,GoodTestCase)16fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, GoodTestCase)
17fa5e4d32SSunny Srivastava {
18fa5e4d32SSunny Srivastava types::DdimmVpdMap l_ddimmMap{
19fa5e4d32SSunny Srivastava std::pair<std::string, size_t>{"MemorySizeInKB", 0x2000000},
20fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
21fa5e4d32SSunny Srivastava "FN", {0x30, 0x33, 0x48, 0x44, 0x37, 0x30, 0x30}},
22fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
23fa5e4d32SSunny Srivastava "PN", {0x30, 0x33, 0x48, 0x44, 0x37, 0x30, 0x30}},
24fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
25fa5e4d32SSunny Srivastava "SN",
26fa5e4d32SSunny Srivastava {0x59, 0x48, 0x33, 0x33, 0x31, 0x54, 0x33, 0x38, 0x34, 0x30, 0x33,
27fa5e4d32SSunny Srivastava 0x46}},
28fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{"CC",
29*e606f061SPriyanga Ramasamy {0x33, 0x32, 0x41, 0x31}},
30*e606f061SPriyanga Ramasamy std::pair<std::string, types::BinaryVector>{"DI", {0x80, 0xCE}}};
31fa5e4d32SSunny Srivastava
32fa5e4d32SSunny Srivastava nlohmann::json l_json;
33fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr5_ddimm.dat");
34fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
35fa5e4d32SSunny Srivastava
36fa5e4d32SSunny Srivastava ASSERT_EQ(1,
37fa5e4d32SSunny Srivastava l_ddimmMap == std::get<types::DdimmVpdMap>(l_vpdParser.parse()));
38fa5e4d32SSunny Srivastava }
39fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,DDR4GoodTestCase)40fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, DDR4GoodTestCase)
41fa5e4d32SSunny Srivastava {
42fa5e4d32SSunny Srivastava types::DdimmVpdMap l_ddimmMap{
43fa5e4d32SSunny Srivastava std::pair<std::string, size_t>{"MemorySizeInKB", 0x4000000},
44fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
45fa5e4d32SSunny Srivastava "FN", {0x37, 0x38, 0x50, 0x36, 0x35, 0x37, 0x35}},
46fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
47fa5e4d32SSunny Srivastava "PN", {0x37, 0x38, 0x50, 0x36, 0x35, 0x37, 0x35}},
48fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{
49fa5e4d32SSunny Srivastava "SN",
50fa5e4d32SSunny Srivastava {0x59, 0x48, 0x33, 0x35, 0x31, 0x54, 0x31, 0x35, 0x53, 0x30, 0x44,
51fa5e4d32SSunny Srivastava 0x35}},
52fa5e4d32SSunny Srivastava std::pair<std::string, types::BinaryVector>{"CC",
53*e606f061SPriyanga Ramasamy {0x33, 0x32, 0x37, 0x42}},
54*e606f061SPriyanga Ramasamy std::pair<std::string, types::BinaryVector>{"DI", {0x80, 0xAD}}};
55fa5e4d32SSunny Srivastava
56fa5e4d32SSunny Srivastava nlohmann::json l_json;
57fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr4_ddimm.dat");
58fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
59fa5e4d32SSunny Srivastava
60fa5e4d32SSunny Srivastava ASSERT_EQ(1,
61fa5e4d32SSunny Srivastava l_ddimmMap == std::get<types::DdimmVpdMap>(l_vpdParser.parse()));
62fa5e4d32SSunny Srivastava }
63fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,InvalidDdrType)64fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, InvalidDdrType)
65fa5e4d32SSunny Srivastava {
66fa5e4d32SSunny Srivastava // Invalid DDR type, corrupted at index[2]
67fa5e4d32SSunny Srivastava nlohmann::json l_json;
68fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_2.dat");
69fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
70fa5e4d32SSunny Srivastava
71fa5e4d32SSunny Srivastava EXPECT_THROW(l_vpdParser.parse(), std::exception);
72fa5e4d32SSunny Srivastava }
73fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,ZeroDdimmSize)74fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, ZeroDdimmSize)
75fa5e4d32SSunny Srivastava {
76fa5e4d32SSunny Srivastava // Badly formed DDIMM VPD data - corrupted at index[235],
77fa5e4d32SSunny Srivastava // ddimm size calculated a zero
78fa5e4d32SSunny Srivastava nlohmann::json l_json;
79fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_235.dat");
80fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
81fa5e4d32SSunny Srivastava
82fa5e4d32SSunny Srivastava EXPECT_THROW(l_vpdParser.parse(), std::exception);
83fa5e4d32SSunny Srivastava }
84fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,InvalidDensityPerDie)85fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, InvalidDensityPerDie)
86fa5e4d32SSunny Srivastava {
87fa5e4d32SSunny Srivastava // Out of range data, fails to check valid value - corrupted at index[4]
88fa5e4d32SSunny Srivastava nlohmann::json l_json;
89fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_4.dat");
90fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
91fa5e4d32SSunny Srivastava
92fa5e4d32SSunny Srivastava EXPECT_THROW(l_vpdParser.parse(), std::exception);
93fa5e4d32SSunny Srivastava }
94fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,InvalidVpdType)95fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, InvalidVpdType)
96fa5e4d32SSunny Srivastava {
97fa5e4d32SSunny Srivastava // Invalid VPD type - corrupted at index[2] & index[3]
98fa5e4d32SSunny Srivastava // Not able to find the VPD type, vpdTypeCheck failed
99fa5e4d32SSunny Srivastava nlohmann::json l_json;
100fa5e4d32SSunny Srivastava std::string l_vpdFile("vpd_files/ddr5_ddimm_corrupted_index_2_3.dat");
101fa5e4d32SSunny Srivastava Parser l_vpdParser(l_vpdFile, l_json);
102fa5e4d32SSunny Srivastava
103fa5e4d32SSunny Srivastava EXPECT_THROW(l_vpdParser.parse(), std::exception);
104fa5e4d32SSunny Srivastava }
105fa5e4d32SSunny Srivastava
TEST(DdimmVpdParserTest,EmptyInputVector)106fa5e4d32SSunny Srivastava TEST(DdimmVpdParserTest, EmptyInputVector)
107fa5e4d32SSunny Srivastava {
108fa5e4d32SSunny Srivastava // Blank VPD
109fa5e4d32SSunny Srivastava types::BinaryVector emptyVector{};
110fa5e4d32SSunny Srivastava
111fa5e4d32SSunny Srivastava EXPECT_THROW(DdimmVpdParser(std::move(emptyVector)), DataException);
112fa5e4d32SSunny Srivastava }
113fa5e4d32SSunny Srivastava
main(int i_argc,char ** io_argv)114fa5e4d32SSunny Srivastava int main(int i_argc, char** io_argv)
115fa5e4d32SSunny Srivastava {
116fa5e4d32SSunny Srivastava ::testing::InitGoogleTest(&i_argc, io_argv);
117fa5e4d32SSunny Srivastava
118fa5e4d32SSunny Srivastava return RUN_ALL_TESTS();
119fa5e4d32SSunny Srivastava }
120