xref: /openbmc/pldm/libpldmresponder/test/libpldmresponder_systemspecific_bios_test.cpp (revision 16c2a0a03e5daac77e204eb99e00711490fb6e26)
146f352edSArchana Kakani #include "common/bios_utils.hpp"
246f352edSArchana Kakani #include "common/test/mocked_utils.hpp"
346f352edSArchana Kakani #include "libpldmresponder/bios_config.hpp"
446f352edSArchana Kakani #include "libpldmresponder/bios_string_attribute.hpp"
546f352edSArchana Kakani #include "libpldmresponder/oem_handler.hpp"
646f352edSArchana Kakani #include "libpldmresponder/platform_config.hpp"
746f352edSArchana Kakani #include "mocked_bios.hpp"
846f352edSArchana Kakani 
946f352edSArchana Kakani #include <nlohmann/json.hpp>
1046f352edSArchana Kakani 
1146f352edSArchana Kakani #include <fstream>
1246f352edSArchana Kakani #include <memory>
1346f352edSArchana Kakani 
1446f352edSArchana Kakani #include <gmock/gmock.h>
1546f352edSArchana Kakani #include <gtest/gtest.h>
1646f352edSArchana Kakani 
1746f352edSArchana Kakani using namespace pldm::bios::utils;
1846f352edSArchana Kakani using namespace pldm::responder::bios;
1946f352edSArchana Kakani using namespace pldm::utils;
2046f352edSArchana Kakani 
2146f352edSArchana Kakani using ::testing::_;
2246f352edSArchana Kakani using ::testing::ElementsAreArray;
2346f352edSArchana Kakani using ::testing::Return;
2446f352edSArchana Kakani using ::testing::StrEq;
2546f352edSArchana Kakani using ::testing::Throw;
2646f352edSArchana Kakani 
2746f352edSArchana Kakani class TestSystemSpecificBIOSConfig : public ::testing::Test
2846f352edSArchana Kakani {
2946f352edSArchana Kakani   public:
SetUpTestCase()302576aecdSManojkiran Eda     static void SetUpTestCase() // will execute once at the beginning of all
3146f352edSArchana Kakani                                 // TestSystemSpecificBIOSConfig objects
3246f352edSArchana Kakani     {
3346f352edSArchana Kakani         char tmpdir[] = "/tmp/BIOSTables.XXXXXX";
3446f352edSArchana Kakani         tableDir = fs::path(mkdtemp(tmpdir));
3546f352edSArchana Kakani 
3646f352edSArchana Kakani         std::vector<fs::path> paths = {
3746f352edSArchana Kakani             "./bios_jsons/string_attrs.json",
3846f352edSArchana Kakani             "./bios_jsons/integer_attrs.json",
3946f352edSArchana Kakani             "./bios_jsons/enum_attrs.json",
4046f352edSArchana Kakani         };
4146f352edSArchana Kakani 
4246f352edSArchana Kakani         for (auto& path : paths)
4346f352edSArchana Kakani         {
4446f352edSArchana Kakani             std::ifstream file;
4546f352edSArchana Kakani             file.open(path);
4646f352edSArchana Kakani             auto j = Json::parse(file);
4746f352edSArchana Kakani             jsons.emplace_back(j);
4846f352edSArchana Kakani         }
4946f352edSArchana Kakani     }
5046f352edSArchana Kakani 
findJsonEntry(const std::string & name)5146f352edSArchana Kakani     std::optional<Json> findJsonEntry(const std::string& name)
5246f352edSArchana Kakani     {
5346f352edSArchana Kakani         for (auto& json : jsons)
5446f352edSArchana Kakani         {
5546f352edSArchana Kakani             auto entries = json.at("entries");
5646f352edSArchana Kakani             for (auto& entry : entries)
5746f352edSArchana Kakani             {
5846f352edSArchana Kakani                 auto n = entry.at("attribute_name").get<std::string>();
5946f352edSArchana Kakani                 if (n == name)
6046f352edSArchana Kakani                 {
6146f352edSArchana Kakani                     return entry;
6246f352edSArchana Kakani                 }
6346f352edSArchana Kakani             }
6446f352edSArchana Kakani         }
6546f352edSArchana Kakani         return std::nullopt;
6646f352edSArchana Kakani     }
6746f352edSArchana Kakani 
TearDownTestCase()6846f352edSArchana Kakani     static void TearDownTestCase() // will be executed once at th end of all
6946f352edSArchana Kakani                                    // TestSystemSpecificBIOSConfig objects
7046f352edSArchana Kakani     {
7146f352edSArchana Kakani         fs::remove_all(tableDir);
7246f352edSArchana Kakani     }
7346f352edSArchana Kakani 
7446f352edSArchana Kakani     static fs::path tableDir;
7546f352edSArchana Kakani     static std::vector<Json> jsons;
7646f352edSArchana Kakani };
7746f352edSArchana Kakani 
7846f352edSArchana Kakani fs::path TestSystemSpecificBIOSConfig::tableDir;
7946f352edSArchana Kakani std::vector<Json> TestSystemSpecificBIOSConfig::jsons;
8046f352edSArchana Kakani 
8146f352edSArchana Kakani class MockSystemConfig : public pldm::responder::platform_config::Handler
8246f352edSArchana Kakani {
8346f352edSArchana Kakani   public:
MockSystemConfig()8446f352edSArchana Kakani     MockSystemConfig() {}
8546f352edSArchana Kakani     MOCK_METHOD(void, ibmCompatibleAddedCallback, (sdbusplus::message_t&), ());
8646f352edSArchana Kakani     MOCK_METHOD(std::optional<std::filesystem::path>, getPlatformName, ());
8746f352edSArchana Kakani };
8846f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,buildTablesTest)8946f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, buildTablesTest)
9046f352edSArchana Kakani {
9146f352edSArchana Kakani     MockdBusHandler dbusHandler;
9246f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
9346f352edSArchana Kakani     std::string biosFilePath("./");
9446f352edSArchana Kakani 
9546f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName())
9646f352edSArchana Kakani         .WillOnce(Return(std::filesystem::path("bios_jsons")));
9746f352edSArchana Kakani 
9846f352edSArchana Kakani     BIOSConfig biosConfig(biosFilePath.c_str(), tableDir.c_str(), &dbusHandler,
9946f352edSArchana Kakani                           0, 0, nullptr, nullptr, &mockSystemConfig, []() {});
10046f352edSArchana Kakani     auto stringTable = biosConfig.getBIOSTable(PLDM_BIOS_STRING_TABLE);
10146f352edSArchana Kakani     auto attrTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_TABLE);
10246f352edSArchana Kakani     auto attrValueTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
10346f352edSArchana Kakani 
10446f352edSArchana Kakani     EXPECT_TRUE(stringTable);
10546f352edSArchana Kakani     EXPECT_TRUE(attrTable);
10646f352edSArchana Kakani     EXPECT_TRUE(attrValueTable);
10746f352edSArchana Kakani 
108*16c2a0a0SPatrick Williams     std::set<std::string> expectedStrings = {
109*16c2a0a0SPatrick Williams         "HMCManagedState",
11046f352edSArchana Kakani         "On",
11146f352edSArchana Kakani         "Off",
11246f352edSArchana Kakani         "FWBootSide",
11346f352edSArchana Kakani         "Perm",
11446f352edSArchana Kakani         "Temp",
11546f352edSArchana Kakani         "InbandCodeUpdate",
11646f352edSArchana Kakani         "Allowed",
11746f352edSArchana Kakani         "Allowed",
11846f352edSArchana Kakani         "NotAllowed",
11946f352edSArchana Kakani         "CodeUpdatePolicy",
12046f352edSArchana Kakani         "Concurrent",
12146f352edSArchana Kakani         "Disruptive",
12246f352edSArchana Kakani         "VDD_AVSBUS_RAIL",
12346f352edSArchana Kakani         "SBE_IMAGE_MINIMUM_VALID_ECS",
12446f352edSArchana Kakani         "INTEGER_INVALID_CASE",
12546f352edSArchana Kakani         "str_example1",
12646f352edSArchana Kakani         "str_example2",
12746f352edSArchana Kakani         "str_example3"};
12846f352edSArchana Kakani     std::set<std::string> strings;
12946f352edSArchana Kakani     for (auto entry : BIOSTableIter<PLDM_BIOS_STRING_TABLE>(
13046f352edSArchana Kakani              stringTable->data(), stringTable->size()))
13146f352edSArchana Kakani     {
13246f352edSArchana Kakani         auto str = table::string::decodeString(entry);
13346f352edSArchana Kakani         strings.emplace(str);
13446f352edSArchana Kakani     }
13546f352edSArchana Kakani 
13646f352edSArchana Kakani     EXPECT_EQ(strings, expectedStrings);
13746f352edSArchana Kakani 
13846f352edSArchana Kakani     BIOSStringTable biosStringTable(*stringTable);
13946f352edSArchana Kakani 
14046f352edSArchana Kakani     for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_TABLE>(attrTable->data(),
14146f352edSArchana Kakani                                                           attrTable->size()))
14246f352edSArchana Kakani     {
14346f352edSArchana Kakani         auto header = table::attribute::decodeHeader(entry);
14446f352edSArchana Kakani         auto attrName = biosStringTable.findString(header.stringHandle);
14546f352edSArchana Kakani         auto jsonEntry = findJsonEntry(attrName);
14646f352edSArchana Kakani         EXPECT_TRUE(jsonEntry);
14746f352edSArchana Kakani         switch (header.attrType)
14846f352edSArchana Kakani         {
14946f352edSArchana Kakani             case PLDM_BIOS_STRING:
15046f352edSArchana Kakani             case PLDM_BIOS_STRING_READ_ONLY:
15146f352edSArchana Kakani             {
15246f352edSArchana Kakani                 auto stringField = table::attribute::decodeStringEntry(entry);
15346f352edSArchana Kakani                 auto stringType = BIOSStringAttribute::strTypeMap.at(
15446f352edSArchana Kakani                     jsonEntry->at("string_type").get<std::string>());
15546f352edSArchana Kakani                 EXPECT_EQ(stringField.stringType,
15646f352edSArchana Kakani                           static_cast<uint8_t>(stringType));
15746f352edSArchana Kakani 
15846f352edSArchana Kakani                 EXPECT_EQ(
15946f352edSArchana Kakani                     stringField.minLength,
16046f352edSArchana Kakani                     jsonEntry->at("minimum_string_length").get<uint16_t>());
16146f352edSArchana Kakani                 EXPECT_EQ(
16246f352edSArchana Kakani                     stringField.maxLength,
16346f352edSArchana Kakani                     jsonEntry->at("maximum_string_length").get<uint16_t>());
16446f352edSArchana Kakani                 EXPECT_EQ(stringField.defString,
16546f352edSArchana Kakani                           jsonEntry->at("default_string").get<std::string>());
1667d47570cSArchana Kakani                 EXPECT_EQ(stringField.defLength,
1677d47570cSArchana Kakani                           (stringField.defString).length());
16846f352edSArchana Kakani                 break;
16946f352edSArchana Kakani             }
17046f352edSArchana Kakani             case PLDM_BIOS_INTEGER:
17146f352edSArchana Kakani             case PLDM_BIOS_INTEGER_READ_ONLY:
17246f352edSArchana Kakani             {
17346f352edSArchana Kakani                 auto integerField = table::attribute::decodeIntegerEntry(entry);
17446f352edSArchana Kakani                 EXPECT_EQ(integerField.lowerBound,
17546f352edSArchana Kakani                           jsonEntry->at("lower_bound").get<uint64_t>());
17646f352edSArchana Kakani                 EXPECT_EQ(integerField.upperBound,
17746f352edSArchana Kakani                           jsonEntry->at("upper_bound").get<uint64_t>());
17846f352edSArchana Kakani                 EXPECT_EQ(integerField.scalarIncrement,
17946f352edSArchana Kakani                           jsonEntry->at("scalar_increment").get<uint32_t>());
18046f352edSArchana Kakani                 EXPECT_EQ(integerField.defaultValue,
18146f352edSArchana Kakani                           jsonEntry->at("default_value").get<uint64_t>());
18246f352edSArchana Kakani                 break;
18346f352edSArchana Kakani             }
18446f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION:
18546f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION_READ_ONLY:
18646f352edSArchana Kakani             {
18746f352edSArchana Kakani                 auto [pvHdls,
18846f352edSArchana Kakani                       defInds] = table::attribute::decodeEnumEntry(entry);
18946f352edSArchana Kakani                 auto possibleValues = jsonEntry->at("possible_values")
19046f352edSArchana Kakani                                           .get<std::vector<std::string>>();
19146f352edSArchana Kakani                 std::vector<std::string> strings;
19246f352edSArchana Kakani                 for (auto pv : pvHdls)
19346f352edSArchana Kakani                 {
19446f352edSArchana Kakani                     auto s = biosStringTable.findString(pv);
19546f352edSArchana Kakani                     strings.emplace_back(s);
19646f352edSArchana Kakani                 }
19746f352edSArchana Kakani                 EXPECT_EQ(strings, possibleValues);
19846f352edSArchana Kakani                 EXPECT_EQ(defInds.size(), 1);
19946f352edSArchana Kakani 
20046f352edSArchana Kakani                 auto defValue = biosStringTable.findString(pvHdls[defInds[0]]);
20146f352edSArchana Kakani                 auto defaultValues = jsonEntry->at("default_values")
20246f352edSArchana Kakani                                          .get<std::vector<std::string>>();
20346f352edSArchana Kakani                 EXPECT_EQ(defValue, defaultValues[0]);
20446f352edSArchana Kakani 
20546f352edSArchana Kakani                 break;
20646f352edSArchana Kakani             }
20746f352edSArchana Kakani             default:
20846f352edSArchana Kakani                 EXPECT_TRUE(false);
20946f352edSArchana Kakani                 break;
21046f352edSArchana Kakani         }
21146f352edSArchana Kakani     }
21246f352edSArchana Kakani 
21346f352edSArchana Kakani     for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_VAL_TABLE>(
21446f352edSArchana Kakani              attrValueTable->data(), attrValueTable->size()))
21546f352edSArchana Kakani     {
21646f352edSArchana Kakani         auto header = table::attribute_value::decodeHeader(entry);
217*16c2a0a0SPatrick Williams         auto attrEntry =
218*16c2a0a0SPatrick Williams             table::attribute::findByHandle(*attrTable, header.attrHandle);
21946f352edSArchana Kakani         auto attrHeader = table::attribute::decodeHeader(attrEntry);
22046f352edSArchana Kakani         auto attrName = biosStringTable.findString(attrHeader.stringHandle);
22146f352edSArchana Kakani         auto jsonEntry = findJsonEntry(attrName);
22246f352edSArchana Kakani         EXPECT_TRUE(jsonEntry);
22346f352edSArchana Kakani         switch (header.attrType)
22446f352edSArchana Kakani         {
22546f352edSArchana Kakani             case PLDM_BIOS_STRING:
22646f352edSArchana Kakani             case PLDM_BIOS_STRING_READ_ONLY:
22746f352edSArchana Kakani             {
22846f352edSArchana Kakani                 auto value = table::attribute_value::decodeStringEntry(entry);
22946f352edSArchana Kakani                 auto defValue =
23046f352edSArchana Kakani                     jsonEntry->at("default_string").get<std::string>();
23146f352edSArchana Kakani                 EXPECT_EQ(value, defValue);
23246f352edSArchana Kakani                 break;
23346f352edSArchana Kakani             }
23446f352edSArchana Kakani             case PLDM_BIOS_INTEGER:
23546f352edSArchana Kakani             case PLDM_BIOS_INTEGER_READ_ONLY:
23646f352edSArchana Kakani             {
23746f352edSArchana Kakani                 auto value = table::attribute_value::decodeIntegerEntry(entry);
23846f352edSArchana Kakani                 auto defValue = jsonEntry->at("default_value").get<uint64_t>();
23946f352edSArchana Kakani                 EXPECT_EQ(value, defValue);
24046f352edSArchana Kakani                 break;
24146f352edSArchana Kakani             }
24246f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION:
24346f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION_READ_ONLY:
24446f352edSArchana Kakani             {
24546f352edSArchana Kakani                 auto indices = table::attribute_value::decodeEnumEntry(entry);
24646f352edSArchana Kakani                 EXPECT_EQ(indices.size(), 1);
24746f352edSArchana Kakani                 auto possibleValues = jsonEntry->at("possible_values")
24846f352edSArchana Kakani                                           .get<std::vector<std::string>>();
24946f352edSArchana Kakani 
25046f352edSArchana Kakani                 auto defValues = jsonEntry->at("default_values")
25146f352edSArchana Kakani                                      .get<std::vector<std::string>>();
25246f352edSArchana Kakani                 EXPECT_EQ(possibleValues[indices[0]], defValues[0]);
25346f352edSArchana Kakani                 break;
25446f352edSArchana Kakani             }
25546f352edSArchana Kakani             default:
25646f352edSArchana Kakani                 EXPECT_TRUE(false);
25746f352edSArchana Kakani                 break;
25846f352edSArchana Kakani         }
25946f352edSArchana Kakani     }
26046f352edSArchana Kakani }
26146f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,buildTablesSystemSpecificTest)26246f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, buildTablesSystemSpecificTest)
26346f352edSArchana Kakani {
26446f352edSArchana Kakani     MockdBusHandler dbusHandler;
26546f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
26646f352edSArchana Kakani 
26746f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName()).WillOnce(Return(""));
26846f352edSArchana Kakani     ON_CALL(dbusHandler, getDbusPropertyVariant(_, _, _))
26946f352edSArchana Kakani         .WillByDefault(Throw(std::exception()));
27046f352edSArchana Kakani 
27146f352edSArchana Kakani     BIOSConfig biosConfig("./system_type1/bios_jsons", tableDir.c_str(),
27246f352edSArchana Kakani                           &dbusHandler, 0, 0, nullptr, nullptr,
27346f352edSArchana Kakani                           &mockSystemConfig, []() {});
27446f352edSArchana Kakani 
27546f352edSArchana Kakani     auto stringTable = biosConfig.getBIOSTable(PLDM_BIOS_STRING_TABLE);
27646f352edSArchana Kakani     auto attrTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_TABLE);
27746f352edSArchana Kakani     auto attrValueTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
27846f352edSArchana Kakani 
27946f352edSArchana Kakani     EXPECT_TRUE(stringTable);
28046f352edSArchana Kakani     EXPECT_TRUE(attrTable);
28146f352edSArchana Kakani     EXPECT_TRUE(attrValueTable);
28246f352edSArchana Kakani 
28346f352edSArchana Kakani     BIOSStringTable biosStringTable(*stringTable);
28446f352edSArchana Kakani 
28546f352edSArchana Kakani     for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_TABLE>(attrTable->data(),
28646f352edSArchana Kakani                                                           attrTable->size()))
28746f352edSArchana Kakani     {
28846f352edSArchana Kakani         auto header = table::attribute::decodeHeader(entry);
28946f352edSArchana Kakani         auto attrName = biosStringTable.findString(header.stringHandle);
29046f352edSArchana Kakani         auto jsonEntry = findJsonEntry(attrName);
29146f352edSArchana Kakani         EXPECT_TRUE(jsonEntry);
29246f352edSArchana Kakani         switch (header.attrType)
29346f352edSArchana Kakani         {
29446f352edSArchana Kakani             case PLDM_BIOS_STRING:
29546f352edSArchana Kakani             case PLDM_BIOS_STRING_READ_ONLY:
29646f352edSArchana Kakani             {
29746f352edSArchana Kakani                 if (attrName == "str_example2")
29846f352edSArchana Kakani                 {
29946f352edSArchana Kakani                     auto stringField =
30046f352edSArchana Kakani                         table::attribute::decodeStringEntry(entry);
30146f352edSArchana Kakani                     EXPECT_EQ(stringField.maxLength, 200);
30246f352edSArchana Kakani                 }
30346f352edSArchana Kakani 
30446f352edSArchana Kakani                 break;
30546f352edSArchana Kakani             }
30646f352edSArchana Kakani             case PLDM_BIOS_INTEGER:
30746f352edSArchana Kakani             case PLDM_BIOS_INTEGER_READ_ONLY:
30846f352edSArchana Kakani             {
30946f352edSArchana Kakani                 if (attrName == "SBE_IMAGE_MINIMUM_VALID_ECS")
31046f352edSArchana Kakani                 {
31146f352edSArchana Kakani                     auto integerField =
31246f352edSArchana Kakani                         table::attribute::decodeIntegerEntry(entry);
31346f352edSArchana Kakani                     EXPECT_EQ(integerField.upperBound, 30);
31446f352edSArchana Kakani                 }
31546f352edSArchana Kakani                 break;
31646f352edSArchana Kakani             }
31746f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION:
31846f352edSArchana Kakani             case PLDM_BIOS_ENUMERATION_READ_ONLY:
31946f352edSArchana Kakani             {
32046f352edSArchana Kakani                 if (attrName == "FWBootSide")
32146f352edSArchana Kakani                 {
32246f352edSArchana Kakani                     auto [pvHdls,
32346f352edSArchana Kakani                           defInds] = table::attribute::decodeEnumEntry(entry);
32446f352edSArchana Kakani                     auto defValue =
32546f352edSArchana Kakani                         biosStringTable.findString(pvHdls[defInds[0]]);
32646f352edSArchana Kakani                     EXPECT_EQ(defValue, "Temp");
32746f352edSArchana Kakani                 }
32846f352edSArchana Kakani             }
32946f352edSArchana Kakani         }
33046f352edSArchana Kakani     }
33146f352edSArchana Kakani }
33246f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,setBIOSTable)33346f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, setBIOSTable)
33446f352edSArchana Kakani {
33546f352edSArchana Kakani     MockdBusHandler dbusHandler;
33646f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
33746f352edSArchana Kakani 
33846f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName()).WillOnce(Return("jsons"));
33946f352edSArchana Kakani     BIOSConfig biosConfig("./", tableDir.c_str(), &dbusHandler, 0, 0, nullptr,
34046f352edSArchana Kakani                           nullptr, &mockSystemConfig, []() {});
34146f352edSArchana Kakani 
34246f352edSArchana Kakani     std::set<std::string> strings{"pvm_system_name", "pvm_stop_at_standby",
34346f352edSArchana Kakani                                   "fw_boot_side", "fw_next_boot_side"};
34446f352edSArchana Kakani 
34546f352edSArchana Kakani     Table table;
34646f352edSArchana Kakani     for (const auto& elem : strings)
34746f352edSArchana Kakani     {
34846f352edSArchana Kakani         table::string::constructEntry(table, elem);
34946f352edSArchana Kakani     }
35046f352edSArchana Kakani 
35146f352edSArchana Kakani     table::appendPadAndChecksum(table);
35246f352edSArchana Kakani     auto rc = biosConfig.setBIOSTable(PLDM_BIOS_STRING_TABLE, table);
35346f352edSArchana Kakani     EXPECT_EQ(rc, PLDM_SUCCESS);
35446f352edSArchana Kakani 
35546f352edSArchana Kakani     auto stringTable = biosConfig.getBIOSTable(PLDM_BIOS_STRING_TABLE);
35646f352edSArchana Kakani     EXPECT_TRUE(stringTable);
35746f352edSArchana Kakani }
35846f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,getBIOSTableFailure)35946f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, getBIOSTableFailure)
36046f352edSArchana Kakani {
36146f352edSArchana Kakani     MockdBusHandler dbusHandler;
36246f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
36346f352edSArchana Kakani 
36446f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName()).WillOnce(Return("jsons"));
36546f352edSArchana Kakani     BIOSConfig biosConfig("./", tableDir.c_str(), &dbusHandler, 0, 0, nullptr,
36646f352edSArchana Kakani                           nullptr, &mockSystemConfig, []() {});
36746f352edSArchana Kakani 
36846f352edSArchana Kakani     auto stringTable = biosConfig.getBIOSTable(PLDM_BIOS_STRING_TABLE);
36946f352edSArchana Kakani     auto attrTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_TABLE);
37046f352edSArchana Kakani     auto attrValueTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
37146f352edSArchana Kakani 
37246f352edSArchana Kakani     EXPECT_FALSE(stringTable);
37346f352edSArchana Kakani     EXPECT_FALSE(attrTable);
37446f352edSArchana Kakani     EXPECT_FALSE(attrValueTable);
37546f352edSArchana Kakani }
37646f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,setAttrValueFailure)37746f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, setAttrValueFailure)
37846f352edSArchana Kakani {
37946f352edSArchana Kakani     MockdBusHandler dbusHandler;
38046f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
38146f352edSArchana Kakani 
38246f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName()).WillOnce(Return("jsons"));
38346f352edSArchana Kakani     BIOSConfig biosConfig("./", tableDir.c_str(), &dbusHandler, 0, 0, nullptr,
38446f352edSArchana Kakani                           nullptr, &mockSystemConfig, []() {});
38546f352edSArchana Kakani 
38646f352edSArchana Kakani     std::vector<uint8_t> attrValueEntry{
38746f352edSArchana Kakani         0,   0,             /* attr handle */
38846f352edSArchana Kakani         1,                  /* attr type string read-write */
38946f352edSArchana Kakani         4,   0,             /* current string length */
3902576aecdSManojkiran Eda         'a', 'b', 'c', 'd', /* default value string handle index */
39146f352edSArchana Kakani     };
39246f352edSArchana Kakani 
39346f352edSArchana Kakani     uint16_t attrHandle{10};
39446f352edSArchana Kakani     attrValueEntry[0] = attrHandle & 0xff;
39546f352edSArchana Kakani     attrValueEntry[1] = (attrHandle >> 8) & 0xff;
39646f352edSArchana Kakani 
39746f352edSArchana Kakani     auto rc = biosConfig.setAttrValue(attrValueEntry.data(),
39846f352edSArchana Kakani                                       attrValueEntry.size(), false);
3992576aecdSManojkiran Eda     std::cout << "Error in setting Attribute " << rc << std::endl;
40046f352edSArchana Kakani     EXPECT_EQ(rc, PLDM_BIOS_TABLE_UNAVAILABLE);
40146f352edSArchana Kakani }
40246f352edSArchana Kakani 
TEST_F(TestSystemSpecificBIOSConfig,setAttrValue)40346f352edSArchana Kakani TEST_F(TestSystemSpecificBIOSConfig, setAttrValue)
40446f352edSArchana Kakani {
40546f352edSArchana Kakani     MockdBusHandler dbusHandler;
40646f352edSArchana Kakani     MockSystemConfig mockSystemConfig;
40746f352edSArchana Kakani 
40846f352edSArchana Kakani     EXPECT_CALL(mockSystemConfig, getPlatformName())
40946f352edSArchana Kakani         .WillOnce(Return(std::filesystem::path("")));
41046f352edSArchana Kakani 
41146f352edSArchana Kakani     BIOSConfig biosConfig("./bios_jsons", tableDir.c_str(), &dbusHandler, 0, 0,
41246f352edSArchana Kakani                           nullptr, nullptr, &mockSystemConfig, []() {});
41346f352edSArchana Kakani 
41446f352edSArchana Kakani     auto stringTable = biosConfig.getBIOSTable(PLDM_BIOS_STRING_TABLE);
41546f352edSArchana Kakani     auto attrTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_TABLE);
41646f352edSArchana Kakani 
41746f352edSArchana Kakani     BIOSStringTable biosStringTable(*stringTable);
41846f352edSArchana Kakani     BIOSTableIter<PLDM_BIOS_ATTR_TABLE> attrTableIter(attrTable->data(),
41946f352edSArchana Kakani                                                       attrTable->size());
42046f352edSArchana Kakani     auto stringHandle = biosStringTable.findHandle("str_example1");
42146f352edSArchana Kakani     uint16_t attrHandle{};
42246f352edSArchana Kakani 
42346f352edSArchana Kakani     for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_TABLE>(attrTable->data(),
42446f352edSArchana Kakani                                                           attrTable->size()))
42546f352edSArchana Kakani     {
42646f352edSArchana Kakani         auto header = table::attribute::decodeHeader(entry);
42746f352edSArchana Kakani         if (header.stringHandle == stringHandle)
42846f352edSArchana Kakani         {
42946f352edSArchana Kakani             attrHandle = header.attrHandle;
43046f352edSArchana Kakani             break;
43146f352edSArchana Kakani         }
43246f352edSArchana Kakani     }
43346f352edSArchana Kakani 
43446f352edSArchana Kakani     EXPECT_NE(attrHandle, 0);
43546f352edSArchana Kakani 
43646f352edSArchana Kakani     std::vector<uint8_t> attrValueEntry{
43746f352edSArchana Kakani         0,   0,             /* attr handle */
43846f352edSArchana Kakani         1,                  /* attr type string read-write */
43946f352edSArchana Kakani         4,   0,             /* current string length */
4402576aecdSManojkiran Eda         'a', 'b', 'c', 'd', /* default value string handle index */
44146f352edSArchana Kakani     };
44246f352edSArchana Kakani 
44346f352edSArchana Kakani     attrValueEntry[0] = attrHandle & 0xff;
44446f352edSArchana Kakani     attrValueEntry[1] = (attrHandle >> 8) & 0xff;
44546f352edSArchana Kakani 
44646f352edSArchana Kakani     DBusMapping dbusMapping{"/xyz/abc/def",
44746f352edSArchana Kakani                             "xyz.openbmc_project.str_example1.value",
44846f352edSArchana Kakani                             "Str_example1", "string"};
44946f352edSArchana Kakani     PropertyValue value = std::string("abcd");
45046f352edSArchana Kakani     EXPECT_CALL(dbusHandler, setDbusProperty(dbusMapping, value)).Times(1);
45146f352edSArchana Kakani 
45246f352edSArchana Kakani     auto rc = biosConfig.setAttrValue(attrValueEntry.data(),
45346f352edSArchana Kakani                                       attrValueEntry.size(), false);
45446f352edSArchana Kakani     EXPECT_EQ(rc, PLDM_SUCCESS);
45546f352edSArchana Kakani 
45646f352edSArchana Kakani     auto attrValueTable = biosConfig.getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
457*16c2a0a0SPatrick Williams     auto findEntry = [&attrValueTable](uint16_t handle)
458*16c2a0a0SPatrick Williams         -> const pldm_bios_attr_val_table_entry* {
45946f352edSArchana Kakani         for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_VAL_TABLE>(
46046f352edSArchana Kakani                  attrValueTable->data(), attrValueTable->size()))
46146f352edSArchana Kakani         {
46246f352edSArchana Kakani             auto [attrHandle, _] = table::attribute_value::decodeHeader(entry);
46346f352edSArchana Kakani             if (attrHandle == handle)
46446f352edSArchana Kakani                 return entry;
46546f352edSArchana Kakani         }
46646f352edSArchana Kakani         return nullptr;
46746f352edSArchana Kakani     };
46846f352edSArchana Kakani 
46946f352edSArchana Kakani     auto entry = findEntry(attrHandle);
47046f352edSArchana Kakani     EXPECT_NE(entry, nullptr);
47146f352edSArchana Kakani 
47246f352edSArchana Kakani     auto p = reinterpret_cast<const uint8_t*>(entry);
47346f352edSArchana Kakani     EXPECT_THAT(std::vector<uint8_t>(p, p + attrValueEntry.size()),
47446f352edSArchana Kakani                 ElementsAreArray(attrValueEntry));
47546f352edSArchana Kakani }
476