1abb87edaSPriyangaRamasamy #include "keyword_vpd_parser.hpp"
2*e12b181bSSunnySrivastava1984 #include "store.hpp"
3945a02d3SSunnySrivastava1984 #include "types.hpp"
4abb87edaSPriyangaRamasamy 
5abb87edaSPriyangaRamasamy #include <exception>
6abb87edaSPriyangaRamasamy #include <fstream>
7abb87edaSPriyangaRamasamy 
8abb87edaSPriyangaRamasamy #include <gtest/gtest.h>
9abb87edaSPriyangaRamasamy 
10abb87edaSPriyangaRamasamy using namespace vpd::keyword::parser;
11945a02d3SSunnySrivastava1984 using namespace openpower::vpd;
12945a02d3SSunnySrivastava1984 using namespace openpower::vpd::inventory;
13*e12b181bSSunnySrivastava1984 using namespace std;
14abb87edaSPriyangaRamasamy 
15abb87edaSPriyangaRamasamy class KeywordVpdParserTest : public ::testing::Test
16abb87edaSPriyangaRamasamy {
17abb87edaSPriyangaRamasamy   protected:
18abb87edaSPriyangaRamasamy     Binary keywordVpdVector;
19abb87edaSPriyangaRamasamy     Binary bonoKwVpdVector;
20abb87edaSPriyangaRamasamy 
21abb87edaSPriyangaRamasamy     KeywordVpdParserTest()
22abb87edaSPriyangaRamasamy     {
23abb87edaSPriyangaRamasamy         // Open the kw VPD file in binary mode
24abb87edaSPriyangaRamasamy         std::ifstream kwVpdFile("vpd.dat", std::ios::binary);
25abb87edaSPriyangaRamasamy 
26abb87edaSPriyangaRamasamy         // Read the content of the binary file into a vector
27abb87edaSPriyangaRamasamy         keywordVpdVector.assign((std::istreambuf_iterator<char>(kwVpdFile)),
28abb87edaSPriyangaRamasamy                                 std::istreambuf_iterator<char>());
29abb87edaSPriyangaRamasamy         // Open the BONO type kw VPD file in binary mode
30abb87edaSPriyangaRamasamy         std::ifstream bonoKwVpdFile("bono.vpd", std::ios::binary);
31abb87edaSPriyangaRamasamy 
32abb87edaSPriyangaRamasamy         // Read the content of the binary file into a vector
33abb87edaSPriyangaRamasamy         bonoKwVpdVector.assign((std::istreambuf_iterator<char>(bonoKwVpdFile)),
34abb87edaSPriyangaRamasamy                                std::istreambuf_iterator<char>());
35abb87edaSPriyangaRamasamy     }
36abb87edaSPriyangaRamasamy };
37abb87edaSPriyangaRamasamy 
38abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, GoodTestCase)
39abb87edaSPriyangaRamasamy {
40abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
41abb87edaSPriyangaRamasamy     KeywordVpdMap map1 = {
42abb87edaSPriyangaRamasamy         {"WI", {0x00}},
43abb87edaSPriyangaRamasamy         {"FL", {0x50, 0x32, 0x20, 0x20, 0x20}},
44abb87edaSPriyangaRamasamy         {"SM",
45abb87edaSPriyangaRamasamy          {0x82, 0x50, 0x32, 0x2d, 0x44, 0x34, 0x20, 0x20, 0x20, 0x20, 0x20,
46abb87edaSPriyangaRamasamy           0x20, 0x32, 0x53, 0x53, 0x43, 0x81, 0x50, 0x32, 0x2d, 0x44, 0x35,
47abb87edaSPriyangaRamasamy           0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x53, 0x53, 0x43, 0x80,
48abb87edaSPriyangaRamasamy           0x50, 0x32, 0x2d, 0x44, 0x37, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
49abb87edaSPriyangaRamasamy           0x32, 0x53, 0x53, 0x43, 0x83, 0x50, 0x32, 0x2d, 0x44, 0x38, 0x20,
50abb87edaSPriyangaRamasamy           0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x53, 0x53, 0x43}},
51abb87edaSPriyangaRamasamy         {"B2",
52abb87edaSPriyangaRamasamy          {0x50, 0x05, 0x07, 0x60, 0x73, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00,
53abb87edaSPriyangaRamasamy           0x00, 0x00, 0x00, 0x01, 0x00}},
54abb87edaSPriyangaRamasamy         {"MF", {0x00, 0x10}},
55abb87edaSPriyangaRamasamy         {"VZ", {0x30, 0x33}},
56abb87edaSPriyangaRamasamy         {"PN", {0x30, 0x31, 0x4b, 0x55, 0x37, 0x32, 0x34}},
57abb87edaSPriyangaRamasamy         {"FN", {0x20, 0x30, 0x31, 0x4b, 0x55, 0x37, 0x32, 0x34}},
58abb87edaSPriyangaRamasamy         {"CE", {0x31}},
59abb87edaSPriyangaRamasamy         {"SN",
60abb87edaSPriyangaRamasamy          {0x59, 0x48, 0x33, 0x30, 0x42, 0x47, 0x37, 0x38, 0x42, 0x30, 0x31,
61abb87edaSPriyangaRamasamy           0x34}},
62abb87edaSPriyangaRamasamy         {"CC", {0x32, 0x44, 0x33, 0x37}}};
63abb87edaSPriyangaRamasamy 
64*e12b181bSSunnySrivastava1984     auto map2 = std::move(get<KeywordVpdMap>(parserObj1.parse()));
65abb87edaSPriyangaRamasamy     ASSERT_EQ(1, map1 == map2);
66abb87edaSPriyangaRamasamy 
67abb87edaSPriyangaRamasamy     // BONO TYPE VPD
68abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
69abb87edaSPriyangaRamasamy     map1 = {{"B2",
70abb87edaSPriyangaRamasamy              {0x50, 0x0, 0xb3, 0xe0, 0x90, 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0,
71abb87edaSPriyangaRamasamy               0x0, 0x0, 0x0, 0x0}},
72abb87edaSPriyangaRamasamy             {"CC", {0x35, 0x39, 0x33, 0x42}},
73abb87edaSPriyangaRamasamy             {"CT", {0x50, 0x37, 0x32, 0x0}},
74abb87edaSPriyangaRamasamy             {"EC", {0x50, 0x34, 0x35, 0x35, 0x33, 0x37}},
75abb87edaSPriyangaRamasamy             {"FN", {0x30, 0x32, 0x44, 0x45, 0x33, 0x36, 0x35}},
76abb87edaSPriyangaRamasamy             {"PN", {0x30, 0x32, 0x44, 0x45, 0x33, 0x36, 0x36}},
77abb87edaSPriyangaRamasamy             {"RV", {0xa1}},
78abb87edaSPriyangaRamasamy             {"SI", {0x31, 0x30, 0x31, 0x34, 0x30, 0x36, 0x37, 0x34}},
79abb87edaSPriyangaRamasamy             {"SN",
80abb87edaSPriyangaRamasamy              {0x59, 0x4c, 0x35, 0x30, 0x48, 0x54, 0x39, 0x36, 0x4a, 0x30, 0x30,
81abb87edaSPriyangaRamasamy               0x38}},
82abb87edaSPriyangaRamasamy             {"Z4", {0x30}},
83abb87edaSPriyangaRamasamy             {"Z5", {0x30}},
84abb87edaSPriyangaRamasamy             {"Z6", {0x41, 0x31, 0x38, 0x30, 0x30, 0x32, 0x30, 0x30}}};
85abb87edaSPriyangaRamasamy 
86*e12b181bSSunnySrivastava1984     map2 = std::move(get<KeywordVpdMap>(parserObj2.parse()));
87abb87edaSPriyangaRamasamy     ASSERT_EQ(1, map1 == map2);
88abb87edaSPriyangaRamasamy }
89abb87edaSPriyangaRamasamy 
90abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvKwVpdTag)
91abb87edaSPriyangaRamasamy {
92abb87edaSPriyangaRamasamy     // Invalid Large resource type Identifier String - corrupted at index[0]
93abb87edaSPriyangaRamasamy     keywordVpdVector[0] = 0x83;
94abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
95*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
96abb87edaSPriyangaRamasamy 
97abb87edaSPriyangaRamasamy     // For BONO type VPD
98abb87edaSPriyangaRamasamy     bonoKwVpdVector[0] = 0x83;
99abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
100*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
101abb87edaSPriyangaRamasamy }
102abb87edaSPriyangaRamasamy 
103abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvKwValTag)
104abb87edaSPriyangaRamasamy {
105abb87edaSPriyangaRamasamy     // Invalid Large resource type Vendor Defined - corrupted at index[19]
106abb87edaSPriyangaRamasamy     keywordVpdVector[19] = 0x85;
107abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
108*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
109abb87edaSPriyangaRamasamy 
110abb87edaSPriyangaRamasamy     // For BONO type VPD - corruputed at index[33]
111abb87edaSPriyangaRamasamy     bonoKwVpdVector[33] = 0x91;
112abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
113*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
114abb87edaSPriyangaRamasamy }
115abb87edaSPriyangaRamasamy 
116abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvKwValSize)
117abb87edaSPriyangaRamasamy {
118abb87edaSPriyangaRamasamy     // Badly formed keyword VPD data - corrupted at index[20]
119abb87edaSPriyangaRamasamy     keywordVpdVector[20] = 0x00;
120abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
121*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
122abb87edaSPriyangaRamasamy 
123abb87edaSPriyangaRamasamy     // For BONO type VPD - corruputed at index[34]
124abb87edaSPriyangaRamasamy     bonoKwVpdVector[34] = 0x00;
125abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
126*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
127abb87edaSPriyangaRamasamy }
128abb87edaSPriyangaRamasamy 
129abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvKwValEndTag)
130abb87edaSPriyangaRamasamy {
131abb87edaSPriyangaRamasamy     // Invalid Small resource type End - corrupted at index[177]
132abb87edaSPriyangaRamasamy     keywordVpdVector[177] = 0x80;
133abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
134*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
135abb87edaSPriyangaRamasamy }
136abb87edaSPriyangaRamasamy 
137abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvChecksum)
138abb87edaSPriyangaRamasamy {
139abb87edaSPriyangaRamasamy     // Invalid Check sum - corrupted at index[178]
140abb87edaSPriyangaRamasamy     keywordVpdVector[178] = 0xb1;
141abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
142*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
143abb87edaSPriyangaRamasamy }
144abb87edaSPriyangaRamasamy 
145abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, InvKwVpdEndTag)
146abb87edaSPriyangaRamasamy {
147abb87edaSPriyangaRamasamy     // Invalid Small resource type Last End Of Data - corrupted at index[179]
148abb87edaSPriyangaRamasamy     keywordVpdVector[179] = 0x79;
149abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
150*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
151abb87edaSPriyangaRamasamy 
152abb87edaSPriyangaRamasamy     // For BONO type VPD - corrupted at index[147]
153abb87edaSPriyangaRamasamy     bonoKwVpdVector[147] = 0x79;
154abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
155*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
156abb87edaSPriyangaRamasamy }
157abb87edaSPriyangaRamasamy 
158abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, OutOfBoundGreaterSize)
159abb87edaSPriyangaRamasamy {
160abb87edaSPriyangaRamasamy     // Iterator Out of Bound - size is larger than the actual size - corrupted
161abb87edaSPriyangaRamasamy     // at index[24]
162abb87edaSPriyangaRamasamy     keywordVpdVector[24] = 0x32;
163abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
164*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
165abb87edaSPriyangaRamasamy 
166abb87edaSPriyangaRamasamy     // For BONO type VPD - corrupted at index[38]
167abb87edaSPriyangaRamasamy     bonoKwVpdVector[38] = 0x4D;
168abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
169*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
170abb87edaSPriyangaRamasamy }
171abb87edaSPriyangaRamasamy 
172abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, OutOfBoundLesserSize)
173abb87edaSPriyangaRamasamy {
174abb87edaSPriyangaRamasamy     // Iterator Out of Bound - size is smaller than the actual size - corrupted
175abb87edaSPriyangaRamasamy     // at index[24]
176abb87edaSPriyangaRamasamy     keywordVpdVector[24] = 0x03;
177abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
178*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
179abb87edaSPriyangaRamasamy 
180abb87edaSPriyangaRamasamy     // For BONO type VPD - corrupted at index[38]
181abb87edaSPriyangaRamasamy     bonoKwVpdVector[38] = 0x04;
182abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
183*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
184abb87edaSPriyangaRamasamy }
185abb87edaSPriyangaRamasamy 
186abb87edaSPriyangaRamasamy TEST_F(KeywordVpdParserTest, BlankVpd)
187abb87edaSPriyangaRamasamy {
188abb87edaSPriyangaRamasamy     // Blank Kw Vpd
189abb87edaSPriyangaRamasamy     keywordVpdVector.clear();
190abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
191*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj1.parse(), std::runtime_error);
192abb87edaSPriyangaRamasamy 
193abb87edaSPriyangaRamasamy     // Blank Bono Type Vpd
194abb87edaSPriyangaRamasamy     bonoKwVpdVector.clear();
195abb87edaSPriyangaRamasamy     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
196*e12b181bSSunnySrivastava1984     EXPECT_THROW(parserObj2.parse(), std::runtime_error);
197abb87edaSPriyangaRamasamy }
198abb87edaSPriyangaRamasamy 
199abb87edaSPriyangaRamasamy int main(int argc, char** argv)
200abb87edaSPriyangaRamasamy {
201abb87edaSPriyangaRamasamy     ::testing::InitGoogleTest(&argc, argv);
202abb87edaSPriyangaRamasamy 
203abb87edaSPriyangaRamasamy     return RUN_ALL_TESTS();
204abb87edaSPriyangaRamasamy }
205