xref: /openbmc/openpower-vpd-parser/test/utest_keyword_parser.cpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1*fa5e4d32SSunny Srivastava #include "exceptions.hpp"
2*fa5e4d32SSunny Srivastava #include "keyword_vpd_parser.hpp"
3*fa5e4d32SSunny Srivastava #include "parser.hpp"
4*fa5e4d32SSunny Srivastava #include "types.hpp"
5*fa5e4d32SSunny Srivastava 
6*fa5e4d32SSunny Srivastava #include <cstdint>
7*fa5e4d32SSunny Srivastava #include <exception>
8*fa5e4d32SSunny Srivastava #include <fstream>
9*fa5e4d32SSunny Srivastava 
10*fa5e4d32SSunny Srivastava #include <gtest/gtest.h>
11*fa5e4d32SSunny Srivastava 
12*fa5e4d32SSunny Srivastava using namespace vpd;
13*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,GoodTestCase)14*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, GoodTestCase)
15*fa5e4d32SSunny Srivastava {
16*fa5e4d32SSunny Srivastava     types::KeywordVpdMap l_keywordMap{
17*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{"WI", {0x00}},
18*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
19*fa5e4d32SSunny Srivastava             "FL", {0x50, 0x32, 0x20, 0x20, 0x20}},
20*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
21*fa5e4d32SSunny Srivastava             "SM",
22*fa5e4d32SSunny Srivastava             {0x82, 0x50, 0x32, 0x2d, 0x44, 0x34, 0x20, 0x20, 0x20, 0x20, 0x20,
23*fa5e4d32SSunny Srivastava              0x20, 0x32, 0x53, 0x53, 0x43, 0x81, 0x50, 0x32, 0x2d, 0x44, 0x35,
24*fa5e4d32SSunny Srivastava              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x53, 0x53, 0x43, 0x80,
25*fa5e4d32SSunny Srivastava              0x50, 0x32, 0x2d, 0x44, 0x37, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
26*fa5e4d32SSunny Srivastava              0x32, 0x53, 0x53, 0x43, 0x83, 0x50, 0x32, 0x2d, 0x44, 0x38, 0x20,
27*fa5e4d32SSunny Srivastava              0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x53, 0x53, 0x43}},
28*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
29*fa5e4d32SSunny Srivastava             "B2",
30*fa5e4d32SSunny Srivastava             {0x50, 0x05, 0x07, 0x60, 0x73, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00,
31*fa5e4d32SSunny Srivastava              0x00, 0x00, 0x00, 0x01, 0x00}},
32*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{"MF", {0x00, 0x10}},
33*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{"VZ", {0x30, 0x33}},
34*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
35*fa5e4d32SSunny Srivastava             "PN", {0x30, 0x31, 0x4b, 0x55, 0x37, 0x32, 0x34}},
36*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
37*fa5e4d32SSunny Srivastava             "FN", {0x20, 0x30, 0x31, 0x4b, 0x55, 0x37, 0x32, 0x34}},
38*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{"CE", {0x31}},
39*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{
40*fa5e4d32SSunny Srivastava             "SN",
41*fa5e4d32SSunny Srivastava             {0x59, 0x48, 0x33, 0x30, 0x42, 0x47, 0x37, 0x38, 0x42, 0x30, 0x31,
42*fa5e4d32SSunny Srivastava              0x34}},
43*fa5e4d32SSunny Srivastava         std::pair<std::string, types::BinaryVector>{"CC",
44*fa5e4d32SSunny Srivastava                                                     {0x32, 0x44, 0x33, 0x37}}};
45*fa5e4d32SSunny Srivastava 
46*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
47*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword.dat");
48*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
49*fa5e4d32SSunny Srivastava 
50*fa5e4d32SSunny Srivastava     ASSERT_EQ(1, std::get<types::KeywordVpdMap>(l_vpdParser.parse()) ==
51*fa5e4d32SSunny Srivastava                      l_keywordMap);
52*fa5e4d32SSunny Srivastava }
53*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidVpd)54*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidVpd)
55*fa5e4d32SSunny Srivastava {
56*fa5e4d32SSunny Srivastava     // Invalid large resource type identifier string - corrupted at index[0]
57*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
58*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_0.dat");
59*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
60*fa5e4d32SSunny Srivastava 
61*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
62*fa5e4d32SSunny Srivastava }
63*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidStartTag)64*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidStartTag)
65*fa5e4d32SSunny Srivastava {
66*fa5e4d32SSunny Srivastava     // Invalid large resource type vendor defined - corrupted at index[19]
67*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
68*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_19.dat");
69*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
70*fa5e4d32SSunny Srivastava 
71*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
72*fa5e4d32SSunny Srivastava }
73*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidSize)74*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidSize)
75*fa5e4d32SSunny Srivastava {
76*fa5e4d32SSunny Srivastava     // Badly formed keyword VPD data - corrupted at index[20]
77*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
78*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_20.dat");
79*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
80*fa5e4d32SSunny Srivastava 
81*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
82*fa5e4d32SSunny Srivastava }
83*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidEndTag)84*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidEndTag)
85*fa5e4d32SSunny Srivastava {
86*fa5e4d32SSunny Srivastava     // Invalid small resource type end - corrupted at index[177]
87*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
88*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_177.dat");
89*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
90*fa5e4d32SSunny Srivastava 
91*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
92*fa5e4d32SSunny Srivastava }
93*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidChecksum)94*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidChecksum)
95*fa5e4d32SSunny Srivastava {
96*fa5e4d32SSunny Srivastava     // Invalid check sum - corrupted at index[178]
97*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
98*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_178.dat");
99*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
100*fa5e4d32SSunny Srivastava 
101*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
102*fa5e4d32SSunny Srivastava }
103*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,InvalidLastEndTag)104*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, InvalidLastEndTag)
105*fa5e4d32SSunny Srivastava {
106*fa5e4d32SSunny Srivastava     // Invalid small resource type last end of data - corrupted at index[179]
107*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
108*fa5e4d32SSunny Srivastava     std::string l_vpdFile("vpd_files/keyword_corrupted_index_179.dat");
109*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
110*fa5e4d32SSunny Srivastava 
111*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
112*fa5e4d32SSunny Srivastava }
113*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,OutOfBoundGreaterSize)114*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, OutOfBoundGreaterSize)
115*fa5e4d32SSunny Srivastava {
116*fa5e4d32SSunny Srivastava     // Iterator out of bound - size is larger than the actual size - corrupted
117*fa5e4d32SSunny Srivastava     // at index[24]
118*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
119*fa5e4d32SSunny Srivastava     std::string l_vpdFile(
120*fa5e4d32SSunny Srivastava         "vpd_files/keyword_corrupted_index_24_large_size.dat");
121*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
122*fa5e4d32SSunny Srivastava 
123*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
124*fa5e4d32SSunny Srivastava }
125*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,OutOfBoundLesserSize)126*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, OutOfBoundLesserSize)
127*fa5e4d32SSunny Srivastava {
128*fa5e4d32SSunny Srivastava     // Iterator out of bound - size is smaller than the actual size - corrupted
129*fa5e4d32SSunny Srivastava     // at index[24]
130*fa5e4d32SSunny Srivastava     nlohmann::json l_json;
131*fa5e4d32SSunny Srivastava     std::string l_vpdFile(
132*fa5e4d32SSunny Srivastava         "vpd_files/keyword_corrupted_index_24_small_size.dat");
133*fa5e4d32SSunny Srivastava     Parser l_vpdParser(l_vpdFile, l_json);
134*fa5e4d32SSunny Srivastava 
135*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_vpdParser.parse(), DataException);
136*fa5e4d32SSunny Srivastava }
137*fa5e4d32SSunny Srivastava 
TEST(KeywordVpdParserTest,EmptyInput)138*fa5e4d32SSunny Srivastava TEST(KeywordVpdParserTest, EmptyInput)
139*fa5e4d32SSunny Srivastava {
140*fa5e4d32SSunny Srivastava     // Blank keyword VPD
141*fa5e4d32SSunny Srivastava     types::BinaryVector emptyVector{};
142*fa5e4d32SSunny Srivastava     KeywordVpdParser l_keywordParser(std::move(emptyVector));
143*fa5e4d32SSunny Srivastava 
144*fa5e4d32SSunny Srivastava     EXPECT_THROW(l_keywordParser.parse(), std::exception);
145*fa5e4d32SSunny Srivastava }
146