xref: /openbmc/openpower-vpd-parser/test/utest_ipz_parser.cpp (revision 3e1cb49d2d469b79cafbd6372d071acb66ee612e)
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