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