| #include "common/test/mocked_utils.hpp" |
| #include "libpldmresponder/bios_string_attribute.hpp" |
| #include "mocked_bios.hpp" |
| |
| #include <nlohmann/json.hpp> |
| |
| #include <memory> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| using namespace pldm::responder::bios; |
| using namespace pldm::utils; |
| using ::testing::_; |
| using ::testing::ElementsAreArray; |
| using ::testing::Return; |
| using ::testing::StrEq; |
| using ::testing::Throw; |
| |
| class TestBIOSStringAttribute : public ::testing::Test |
| { |
| public: |
| const auto& getStringInfo(const BIOSStringAttribute& biosStringAttribute) |
| { |
| return biosStringAttribute.stringInfo; |
| } |
| }; |
| |
| TEST_F(TestBIOSStringAttribute, CtorTest) |
| { |
| auto jsonStringReadOnly = R"( { |
| "attribute_name" : "str_example3", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string_length" : 2, |
| "default_string" : "ef", |
| "readOnly" : true, |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName" |
| })"_json; |
| BIOSStringAttribute stringReadOnly{jsonStringReadOnly, nullptr}; |
| EXPECT_EQ(stringReadOnly.name, "str_example3"); |
| EXPECT_TRUE(stringReadOnly.readOnly); |
| |
| auto& stringInfo = getStringInfo(stringReadOnly); |
| EXPECT_EQ(stringInfo.stringType, |
| static_cast<uint8_t>(BIOSStringAttribute::Encoding::ASCII)); |
| EXPECT_EQ(stringInfo.minLength, 1); |
| EXPECT_EQ(stringInfo.maxLength, 100); |
| EXPECT_EQ(stringInfo.defLength, 2); |
| EXPECT_EQ(stringInfo.defString, "ef"); |
| |
| auto jsonStringReadOnlyError = R"( { |
| "attribute_name" : "str_example3", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string" : "ef", |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName" |
| })"_json; // missing default_string_length |
| |
| EXPECT_THROW((BIOSStringAttribute{jsonStringReadOnlyError, nullptr}), |
| Json::exception); |
| |
| auto jsonStringReadWrite = R"({ |
| "attribute_name" : "str_example1", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string_length" : 3, |
| "default_string" : "abc", |
| "readOnly" : false, |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName", |
| "dbus" : { |
| "object_path" : "/xyz/abc/def", |
| "interface" : "xyz.openbmc_project.str_example1.value", |
| "property_name" : "Str_example1", |
| "property_type" : "string" |
| } |
| })"_json; |
| BIOSStringAttribute stringReadWrite{jsonStringReadWrite, nullptr}; |
| |
| EXPECT_EQ(stringReadWrite.name, "str_example1"); |
| EXPECT_TRUE(!stringReadWrite.readOnly); |
| } |
| |
| TEST_F(TestBIOSStringAttribute, ConstructEntry) |
| { |
| MockBIOSStringTable biosStringTable; |
| MockdBusHandler dbusHandler; |
| |
| auto jsonStringReadOnly = R"({ |
| "attribute_name" : "str_example1", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string_length" : 3, |
| "default_string" : "abc", |
| "readOnly" : true, |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName" |
| })"_json; |
| |
| std::vector<uint8_t> expectedAttrEntry{ |
| 0, 0, /* attr handle */ |
| 0x81, /* attr type string read-only */ |
| 5, 0, /* attr name handle */ |
| 1, /* string type */ |
| 1, 0, /* minimum length of the string in bytes */ |
| 100, 0, /* maximum length of the string in bytes */ |
| 3, 0, /* length of default string in length */ |
| 'a', 'b', 'c' /* default string */ |
| }; |
| |
| std::vector<uint8_t> expectedAttrValueEntry{ |
| 0, 0, /* attr handle */ |
| 0x81, /* attr type string read-only */ |
| 3, 0, /* current string length */ |
| 'a', 'b', 'c', /* defaut value string handle index */ |
| }; |
| |
| ON_CALL(biosStringTable, findHandle(StrEq("str_example1"))) |
| .WillByDefault(Return(5)); |
| BIOSStringAttribute stringReadOnly{jsonStringReadOnly, nullptr}; |
| |
| checkConstructEntry(stringReadOnly, biosStringTable, expectedAttrEntry, |
| expectedAttrValueEntry); |
| |
| auto jsonStringReadWrite = R"({ |
| "attribute_name" : "str_example1", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string_length" : 3, |
| "default_string" : "abc", |
| "readOnly" : false, |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName", |
| "dbus" : { |
| "object_path" : "/xyz/abc/def", |
| "interface" : "xyz.openbmc_project.str_example1.value", |
| "property_name" : "Str_example1", |
| "property_type" : "string" |
| } |
| })"_json; |
| BIOSStringAttribute stringReadWrite{jsonStringReadWrite, &dbusHandler}; |
| |
| /* Set expected attr type to read-write */ |
| expectedAttrEntry[2] = PLDM_BIOS_STRING; |
| expectedAttrValueEntry[2] = PLDM_BIOS_STRING; |
| |
| EXPECT_CALL( |
| dbusHandler, |
| getDbusPropertyVariant(StrEq("/xyz/abc/def"), StrEq("Str_example1"), |
| StrEq("xyz.openbmc_project.str_example1.value"))) |
| .WillOnce(Throw(std::exception())); |
| |
| checkConstructEntry(stringReadWrite, biosStringTable, expectedAttrEntry, |
| expectedAttrValueEntry); |
| |
| EXPECT_CALL( |
| dbusHandler, |
| getDbusPropertyVariant(StrEq("/xyz/abc/def"), StrEq("Str_example1"), |
| StrEq("xyz.openbmc_project.str_example1.value"))) |
| .WillOnce(Return(PropertyValue(std::string("abcd")))); |
| |
| expectedAttrValueEntry = { |
| 0, 0, /* attr handle */ |
| 1, /* attr type string read-write */ |
| 4, 0, /* current string length */ |
| 'a', 'b', 'c', 'd', /* defaut value string handle index */ |
| }; |
| |
| checkConstructEntry(stringReadWrite, biosStringTable, expectedAttrEntry, |
| expectedAttrValueEntry); |
| } |
| |
| TEST_F(TestBIOSStringAttribute, setAttrValueOnDbus) |
| { |
| auto jsonStringReadWrite = R"({ |
| "attribute_name" : "str_example1", |
| "string_type" : "ASCII", |
| "minimum_string_length" : 1, |
| "maximum_string_length" : 100, |
| "default_string_length" : 3, |
| "default_string" : "abc", |
| "readOnly" : false, |
| "helpText" : "HelpText", |
| "displayName" : "DisplayName", |
| "dbus" : { |
| "object_path" : "/xyz/abc/def", |
| "interface" : "xyz.openbmc_project.str_example1.value", |
| "property_name" : "Str_example1", |
| "property_type" : "string" |
| } |
| })"_json; |
| |
| MockdBusHandler dbusHandler; |
| MockBIOSStringTable biosStringTable; |
| |
| BIOSStringAttribute stringReadWrite{jsonStringReadWrite, &dbusHandler}; |
| DBusMapping dbusMapping{"/xyz/abc/def", |
| "xyz.openbmc_project.str_example1.value", |
| "Str_example1", "string"}; |
| std::vector<uint8_t> attrValueEntry{ |
| 0, 0, /* attr handle */ |
| 1, /* attr type string read-write */ |
| 4, 0, /* current string length */ |
| 'a', 'b', 'c', 'd', /* defaut value string handle index */ |
| }; |
| auto entry = reinterpret_cast<pldm_bios_attr_val_table_entry*>( |
| attrValueEntry.data()); |
| PropertyValue value = std::string("abcd"); |
| EXPECT_CALL(dbusHandler, setDbusProperty(dbusMapping, value)).Times(1); |
| stringReadWrite.setAttrValueOnDbus(entry, nullptr, biosStringTable); |
| } |