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