1 #include "libpldmresponder/bios_attribute.hpp"
2 
3 #include <nlohmann/json.hpp>
4 
5 #include <gtest/gtest.h>
6 
7 using namespace pldm::utils;
8 using namespace pldm::responder::bios;
9 
10 class TestAttribute : public BIOSAttribute
11 {
12   public:
TestAttribute(const Json & entry,DBusHandler * const dbusHandler)13     TestAttribute(const Json& entry, DBusHandler* const dbusHandler) :
14         BIOSAttribute(entry, dbusHandler)
15     {}
16 
setAttrValueOnDbus(const pldm_bios_attr_val_table_entry *,const pldm_bios_attr_table_entry *,const BIOSStringTable &)17     void setAttrValueOnDbus(const pldm_bios_attr_val_table_entry*,
18                             const pldm_bios_attr_table_entry*,
19                             const BIOSStringTable&) override
20     {}
21 
constructEntry(const BIOSStringTable &,Table &,Table &,std::optional<std::variant<int64_t,std::string>>)22     void constructEntry(
23         const BIOSStringTable&, Table&, Table&,
24         std::optional<std::variant<int64_t, std::string>>) override
25     {}
26 
getDbusMap()27     const std::optional<DBusMapping>& getDbusMap()
28     {
29         return dBusMap;
30     }
31 
updateAttrVal(Table &,uint16_t,uint8_t,const PropertyValue &)32     int updateAttrVal(Table& /*newValue*/, uint16_t /*attrHdl*/,
33                       uint8_t /*attrType*/,
34                       const PropertyValue& /*newPropVal*/) override
35     {
36         return PLDM_SUCCESS;
37     }
38 
generateAttributeEntry(const std::variant<int64_t,std::string> &,Table &)39     void generateAttributeEntry(
40         const std::variant<int64_t, std::string>& /*attributevalue*/,
41         Table& /*attrValueEntry*/) override
42     {}
43 };
44 
TEST(BIOSAttribute,CtorTest)45 TEST(BIOSAttribute, CtorTest)
46 {
47     auto jsonReadOnly = R"({
48       "attribute_name" : "ReadOnly",
49       "read_only" : true,
50       "help_text" : "HelpText",
51       "display_name" : "DisplayName"
52     })"_json;
53 
54     TestAttribute readOnly{jsonReadOnly, nullptr};
55     EXPECT_EQ(readOnly.name, "ReadOnly");
56     EXPECT_EQ(readOnly.readOnly, true);
57 
58     auto jsonReadOnlyError = R"({
59       "attribute_nam":"ReadOnly"
60     })"_json;
61     using Json = nlohmann::json;
62 
63     EXPECT_THROW((TestAttribute{jsonReadOnlyError, nullptr}), Json::exception);
64 
65     auto jsonReadWrite = R"({
66       "attribute_name":"ReadWrite",
67       "read_only" : false,
68       "help_text" : "HelpText",
69       "display_name" : "DisplayName",
70       "dbus":
71            {
72                "object_path" : "/xyz/abc/def",
73                "interface" : "xyz.openbmc.FWBoot.Side",
74                "property_name" : "Side",
75                "property_type" : "bool"
76            }
77     })"_json;
78 
79     TestAttribute readWrite{jsonReadWrite, nullptr};
80     EXPECT_EQ(readWrite.name, "ReadWrite");
81     EXPECT_EQ(readWrite.readOnly, false);
82     auto dbusMap = readWrite.getDbusMap();
83     EXPECT_NE(dbusMap, std::nullopt);
84     EXPECT_EQ(dbusMap->objectPath, "/xyz/abc/def");
85     EXPECT_EQ(dbusMap->interface, "xyz.openbmc.FWBoot.Side");
86     EXPECT_EQ(dbusMap->propertyName, "Side");
87     EXPECT_EQ(dbusMap->propertyType, "bool");
88 
89     auto jsonReadWriteError = R"({
90       "attribute_name":"ReadWrite",
91       "dbus":
92            {
93                "object_path" : "/xyz/abc/def",
94                "interface" : "xyz.openbmc.FWBoot.Side",
95                "property_name" : "Side"
96            }
97     })"_json; // missing property_type.
98 
99     EXPECT_THROW((TestAttribute{jsonReadWriteError, nullptr}), Json::exception);
100 }
101