libpldmresponder: implement setStateEffecterStates

This commit implements the handler for setStateEffecterStates response.
Apart from that it actually sets the effecter for PLDM_BOOT_PROGRESS
state. This is used when host sends setStateEffecterStates to mark
any change in hypervisor state. The currently supported states are
"StandBy" and "BootComplete" as per
xyz.openbmc_project.State.OperatingSystem.Status

Change-Id: I205627b2b8a796a0dd4a200ac3d59c1d19d71f01
Signed-off-by: Sampa Misra <sampmisr@in.ibm.com>
diff --git a/test/libpldmresponder_platform_test.cpp b/test/libpldmresponder_platform_test.cpp
index dd51e72..6b89b2e 100644
--- a/test/libpldmresponder_platform_test.cpp
+++ b/test/libpldmresponder_platform_test.cpp
@@ -1,11 +1,15 @@
+#include "libpldmresponder/effecters.hpp"
 #include "libpldmresponder/pdr.hpp"
 #include "libpldmresponder/platform.hpp"
 
 #include <iostream>
 
+#include <gmock/gmock-matchers.h>
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
 using namespace pldm::responder;
+using namespace pldm::responder::pdr;
 
 TEST(getPDR, testGoodPath)
 {
@@ -171,3 +175,84 @@
     }
     ASSERT_EQ(found, true);
 }
+
+namespace pldm
+{
+
+namespace responder
+{
+
+class MockdBusHandler
+{
+  public:
+    MOCK_CONST_METHOD4(setDbusProperty,
+                       int(const std::string&, const std::string&,
+                           const std::string&,
+                           const std::variant<std::string>&));
+};
+} // namespace responder
+} // namespace pldm
+
+using ::testing::_;
+using ::testing::Return;
+
+TEST(setStateEffecterStatesHandler, testGoodRequest)
+{
+    Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+    pdr::Entry e = pdrRepo.at(1);
+    pldm_state_effecter_pdr* pdr =
+        reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+    EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
+
+    std::vector<set_effecter_state_field> stateField;
+    stateField.push_back({PLDM_REQUEST_SET, 1});
+    stateField.push_back({PLDM_REQUEST_SET, 1});
+
+    auto bootProgressInf = "xyz.openbmc_project.State.OperatingSystem.Status";
+    auto bootProgressProp = "OperatingSystemState";
+    std::string objPath = "/foo/bar";
+    std::variant<std::string> value{"xyz.openbmc_project.State.OperatingSystem."
+                                    "Status.OSStatus.Standby"};
+
+    MockdBusHandler handlerObj;
+    EXPECT_CALL(handlerObj, setDbusProperty(objPath, bootProgressProp,
+                                            bootProgressInf, value))
+        .Times(2);
+    auto rc = setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x1,
+                                                             stateField);
+    ASSERT_EQ(rc, 0);
+}
+
+TEST(setStateEffecterStatesHandler, testBadRequest)
+{
+    Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+    pdr::Entry e = pdrRepo.at(1);
+    pldm_state_effecter_pdr* pdr =
+        reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+    EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
+
+    std::vector<set_effecter_state_field> stateField;
+    stateField.push_back({PLDM_REQUEST_SET, 3});
+    stateField.push_back({PLDM_REQUEST_SET, 4});
+
+    MockdBusHandler handlerObj;
+    auto rc = setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x1,
+                                                             stateField);
+    ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
+
+    rc = setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x9,
+                                                        stateField);
+    ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_EFFECTER_ID);
+
+    stateField.push_back({PLDM_REQUEST_SET, 4});
+    rc = setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x1,
+                                                        stateField);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::vector<set_effecter_state_field> newStateField;
+    newStateField.push_back({PLDM_REQUEST_SET, 1});
+
+    rc = setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x2,
+                                                        newStateField);
+    ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_STATE_VALUE);
+}