1 #include "editor_impl.hpp" 2 #include "ipz_parser.hpp" 3 4 #include <algorithm> 5 #include <nlohmann/json.hpp> 6 #include <vector> 7 8 #include <gtest/gtest.h> 9 10 using namespace openpower::vpd; 11 using namespace openpower::vpd::manager::editor; 12 using namespace openpower::vpd::inventory; 13 using namespace openpower::vpd::constants; 14 15 class vpdManagerEditorTest : public ::testing::Test 16 { 17 protected: 18 Binary vpd; 19 20 nlohmann::json jsonFile; 21 22 // map to hold the mapping of location code and inventory path 23 inventory::LocationCodeMap fruLocationCode; 24 25 public: 26 // constructor 27 vpdManagerEditorTest() 28 { 29 processJson(); 30 } 31 32 void processJson(); 33 void readFile(std::string pathToFile); 34 }; 35 36 void vpdManagerEditorTest::readFile(std::string pathToFile) 37 { 38 // read the json file and parse it 39 std::ifstream vpdFile(pathToFile, std::ios::binary); 40 41 if (!vpdFile) 42 { 43 throw std::runtime_error("json file not found"); 44 } 45 46 vpd.assign((std::istreambuf_iterator<char>(vpdFile)), 47 std::istreambuf_iterator<char>()); 48 } 49 50 void vpdManagerEditorTest::processJson() 51 { 52 // read the json file and parse it 53 std::ifstream json("vpd-manager-test/vpd_editor_test.json", 54 std::ios::binary); 55 56 if (!json) 57 { 58 throw std::runtime_error("json file not found"); 59 } 60 61 jsonFile = nlohmann::json::parse(json); 62 63 const nlohmann::json& groupFRUS = 64 jsonFile["frus"].get_ref<const nlohmann::json::object_t&>(); 65 for (const auto& itemFRUS : groupFRUS.items()) 66 { 67 const std::vector<nlohmann::json>& groupEEPROM = 68 itemFRUS.value().get_ref<const nlohmann::json::array_t&>(); 69 for (const auto& itemEEPROM : groupEEPROM) 70 { 71 fruLocationCode.emplace( 72 itemEEPROM["extraInterfaces"][IBM_LOCATION_CODE_INF] 73 ["LocationCode"] 74 .get_ref<const nlohmann::json::string_t&>(), 75 itemEEPROM["inventoryPath"] 76 .get_ref<const nlohmann::json::string_t&>()); 77 } 78 } 79 } 80 81 TEST_F(vpdManagerEditorTest, InvalidFile) 82 { 83 Binary dataToUodate{'M', 'O', 'D', 'I', 'F', 'Y', 84 'D', 'A', 'T', 'A', 'O', 'K'}; 85 86 Binary emptyVpdFile; 87 try 88 { 89 // Invalid kwd name 90 EditorImpl edit("VINI", "SN", std::move(emptyVpdFile)); 91 edit.updateKeyword(dataToUodate, true); 92 } 93 catch (const std::exception& e) 94 { 95 EXPECT_EQ(std::string(e.what()), std::string("Invalid File")); 96 } 97 } 98 99 TEST_F(vpdManagerEditorTest, InvalidHeader) 100 { 101 Binary dataToUodate{'M', 'O', 'D', 'I', 'F', 'Y', 102 'D', 'A', 'T', 'A', 'O', 'K'}; 103 104 readFile("vpd-manager-test/invalidHeaderFile.dat"); 105 try 106 { 107 // the path is dummy 108 EditorImpl edit("VINI", "SN", std::move(vpd)); 109 edit.updateKeyword(dataToUodate, true); 110 } 111 catch (const std::exception& e) 112 { 113 EXPECT_EQ(std::string(e.what()), std::string("VHDR record not found")); 114 } 115 } 116 117 TEST_F(vpdManagerEditorTest, InvalidRecordName) 118 { 119 Binary dataToUodate{'M', 'O', 'D', 'I', 'F', 'Y', 120 'D', 'A', 'T', 'A', 'O', 'K'}; 121 122 readFile("vpd-manager-test/vpdFile.dat"); 123 124 try 125 { 126 // Invalid record name "VIN", path is dummy 127 EditorImpl edit("VIN", "SN", std::move(vpd)); 128 edit.updateKeyword(dataToUodate, true); 129 } 130 catch (const std::exception& e) 131 { 132 EXPECT_EQ(std::string(e.what()), std::string("Record not found")); 133 } 134 } 135 136 TEST_F(vpdManagerEditorTest, InvalidKWdName) 137 { 138 Binary dataToUodate{'M', 'O', 'D', 'I', 'F', 'Y', 139 'D', 'A', 'T', 'A', 'O', 'K'}; 140 141 readFile("vpd-manager-test/vpdFile.dat"); 142 143 try 144 { 145 // All valid data 146 EditorImpl edit("VINI", "Sn", std::move(vpd)); 147 edit.updateKeyword(dataToUodate, true); 148 } 149 catch (std::runtime_error& e) 150 { 151 EXPECT_EQ(std::string(e.what()), std::string("Keyword not found")); 152 } 153 } 154 155 TEST_F(vpdManagerEditorTest, UpdateKwd_Success) 156 { 157 Binary dataToUodate{'M', 'O', 'D', 'I', 'F', 'Y', 158 'D', 'A', 'T', 'A', 'O', 'K'}; 159 160 readFile("vpd-manager-test/vpdFile.dat"); 161 162 try 163 { 164 // All valid data 165 EditorImpl edit("VINI", "SN", std::move(vpd)); 166 edit.updateKeyword(dataToUodate, true); 167 } 168 catch (std::runtime_error& e) 169 { 170 EXPECT_EQ(std::string(e.what()), 171 std::string("Data updated successfully")); 172 } 173 } 174 175 int main(int argc, char** argv) 176 { 177 ::testing::InitGoogleTest(&argc, argv); 178 179 return RUN_ALL_TESTS(); 180 } 181