1 #include "ipz_parser.hpp" 2 #include "parser.hpp" 3 4 #include <exception> 5 6 #include <gtest/gtest.h> 7 8 TEST(IpzVpdParserTest, GoodTestCase) 9 { 10 nlohmann::json l_json; 11 std::string l_vpdFile("vpd_files/ipz_system.dat"); 12 vpd::Parser l_vpdParser(l_vpdFile, l_json); 13 14 vpd::types::IPZVpdMap l_ipzVpdMap; 15 auto l_parsedMap = l_vpdParser.parse(); 16 if (auto l_ipzVpdMapPtr = std::get_if<vpd::types::IPZVpdMap>(&l_parsedMap)) 17 l_ipzVpdMap = *l_ipzVpdMapPtr; 18 19 std::string l_record("VINI"); 20 std::string l_keyword("DR"); 21 std::string l_description; 22 23 // check 'DR' keyword value from 'VINI' record 24 auto l_vpdItr = l_ipzVpdMap.find(l_record); 25 if (l_ipzVpdMap.end() != l_vpdItr) 26 { 27 auto l_kwValItr = (l_vpdItr->second).find(l_keyword); 28 if ((l_vpdItr->second).end() != l_kwValItr) 29 { 30 l_description = l_kwValItr->second; 31 } 32 } 33 EXPECT_EQ(l_description, "SYSTEM BACKPLANE"); 34 35 // check 'SN' keyword value from 'VINI' record 36 l_record = "VINI"; 37 l_keyword = "SN"; 38 l_vpdItr = l_ipzVpdMap.find(l_record); 39 if (l_ipzVpdMap.end() != l_vpdItr) 40 { 41 auto l_kwValItr = (l_vpdItr->second).find(l_keyword); 42 if ((l_vpdItr->second).end() != l_kwValItr) 43 { 44 l_description = l_kwValItr->second; 45 } 46 } 47 EXPECT_EQ(l_description, "Y131UF07300L"); 48 49 // check 'DR' keyword value of 'VSYS' record 50 l_record = "VSYS"; 51 l_keyword = "DR"; 52 l_vpdItr = l_ipzVpdMap.find(l_record); 53 if (l_ipzVpdMap.end() != l_vpdItr) 54 { 55 auto l_kwValItr = (l_vpdItr->second).find(l_keyword); 56 if ((l_vpdItr->second).end() != l_kwValItr) 57 { 58 l_description = l_kwValItr->second; 59 } 60 } 61 ASSERT_EQ(l_description, "SYSTEM"); 62 } 63 64 TEST(IpzVpdParserTest, VpdFileDoesNotExist) 65 { 66 // Vpd file does not exist 67 nlohmann::json l_json; 68 std::string l_vpdFile("vpd_files/xyz.dat"); 69 70 EXPECT_THROW(vpd::Parser(l_vpdFile, l_json), std::runtime_error); 71 } 72 73 TEST(IpzVpdParserTest, MissingHeader) 74 { 75 // Missing VHDR tag, failed header check - corrupted at index[17] 76 nlohmann::json l_json; 77 std::string l_vpdFile("vpd_files/ipz_system_corrupted_index_17.dat"); 78 vpd::Parser l_vpdParser(l_vpdFile, l_json); 79 80 EXPECT_THROW(l_vpdParser.parse(), std::exception); 81 } 82 83 TEST(IpzVpdParserTest, MissingVtoc) 84 { 85 // Missing VTOC tag - corrupted at index[61] 86 nlohmann::json l_json; 87 std::string l_vpdFile("vpd_files/ipz_system_corrupted_index_61.dat"); 88 vpd::Parser l_vpdParser(l_vpdFile, l_json); 89 90 EXPECT_THROW(l_vpdParser.parse(), std::exception); 91 } 92 93 TEST(IpzVpdParserTest, MalformedVpdFile) 94 { 95 // Vpd vector size is less than RECORD_MIN(44), fails for checkHeader 96 nlohmann::json l_json; 97 std::string l_vpdFile("vpd_files/ipz_system_min_record.dat"); 98 vpd::Parser l_vpdParser(l_vpdFile, l_json); 99 100 EXPECT_THROW(l_vpdParser.parse(), std::exception); 101 } 102 103 #ifdef IPZ_ECC_CHECK 104 TEST(IpzVpdParserTest, InvalidRecordOffset) 105 { 106 // VTOC ECC check fail 107 // Invalid VINI Record offset, corrupted at index[74] 108 nlohmann::json l_json; 109 std::string l_vpdFile("vpd_files/ipz_system_corrupted_index_74.dat"); 110 vpd::Parser l_vpdParser(l_vpdFile, l_json); 111 112 EXPECT_THROW(l_vpdParser.parse(), std::exception); 113 } 114 115 TEST(IpzVpdParserTest, InvalidRecordEccOffset) 116 { 117 // VTOC ECC check fail 118 // Invalid VINI Record ECC offset, corrupted at index[78] & index[79] 119 nlohmann::json l_json; 120 std::string l_vpdFile("vpd_files/ipz_system_corrupted_index_78_79.dat"); 121 vpd::Parser l_vpdParser(l_vpdFile, l_json); 122 123 EXPECT_THROW(l_vpdParser.parse(), std::exception); 124 } 125 126 TEST(IpzVpdParserTest, TruncatedVpdFile) 127 { 128 // Truncated vpd file, VTOC ECC check fail 129 nlohmann::json l_json; 130 std::string l_vpdFile("vpd_files/ipz_system_truncated.dat"); 131 vpd::Parser l_vpdParser(l_vpdFile, l_json); 132 133 EXPECT_THROW(l_vpdParser.parse(), std::exception); 134 } 135 #endif 136