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