Add new oem command to set accel power mode

Signed-off-by: Gaurav Gandhi <gauravgandhi@google.com>
Change-Id: Ie0b47477b7ae9e8ae206ac0645571a7a79dbda40
diff --git a/test/google_accel_oob_unittest.cpp b/test/google_accel_oob_unittest.cpp
index 163b602..5797cd3 100644
--- a/test/google_accel_oob_unittest.cpp
+++ b/test/google_accel_oob_unittest.cpp
@@ -26,6 +26,7 @@
 namespace ipmi
 {
 
+using ::testing::_;
 using ::testing::Return;
 
 TEST(GoogleAccelOobTest, DeviceCount_Success)
@@ -235,5 +236,96 @@
     EXPECT_EQ(reply->data, kTestData);
 }
 
+TEST(GoogleAccelOobTest, SetVrSettings_Success)
+{
+    ::testing::StrictMock<HandlerMock> h;
+    constexpr uint8_t kChipId = 2;
+    constexpr uint8_t kSettingsId = 1;
+    constexpr uint16_t kTestValue = 0xAABB;
+
+    std::vector<uint8_t> testData = {kChipId, kSettingsId, 0xBB, 0xAA};
+
+    EXPECT_CALL(h, accelSetVrSettings(_, kChipId, kSettingsId, kTestValue))
+        .WillOnce(Return());
+
+    Resp r = accelSetVrSettings(nullptr, testData, &h);
+
+    const auto response = std::get<0>(r);
+    EXPECT_EQ(response, IPMI_CC_OK);
+
+    const auto payload = std::get<1>(r);
+    ASSERT_EQ(payload.has_value(), true);
+    const auto payload_tuple = payload.value();
+    const auto reply_cmd = std::get<0>(payload_tuple);
+    EXPECT_EQ(reply_cmd, SysSetAccelVrSettings);
+    const auto reply_buff = std::get<1>(payload_tuple);
+    ASSERT_EQ(reply_buff.size(), 0);
+}
+
+TEST(GoogleAccelOobTest, SetVrSettings_HandleIncorrectDataSize)
+{
+    ::testing::StrictMock<HandlerMock> h;
+    constexpr uint8_t kChipId = 2;
+    uint8_t kSettingsId = 1;
+
+    std::vector<uint8_t> testData = {kChipId, kSettingsId};
+
+    EXPECT_CALL(h, accelSetVrSettings(_, _, _, _)).Times(0);
+
+    Resp r = accelSetVrSettings(nullptr, testData, &h);
+
+    const auto response = std::get<0>(r);
+    EXPECT_EQ(response, IPMI_CC_REQ_DATA_LEN_INVALID);
+
+    const auto payload = std::get<1>(r);
+    ASSERT_EQ(payload.has_value(), false);
+}
+
+TEST(GoogleAccelOobTest, GetVrSettings_Success)
+{
+    ::testing::StrictMock<HandlerMock> h;
+    constexpr uint8_t kChipId = 3;
+    constexpr uint8_t kSettingsId = 2;
+
+    std::vector<uint8_t> testData = {kChipId, kSettingsId};
+
+    EXPECT_CALL(h, accelGetVrSettings(_, kChipId, kSettingsId))
+        .WillOnce(Return(0xAABB));
+
+    Resp r = accelGetVrSettings(nullptr, testData, &h);
+
+    const auto response = std::get<0>(r);
+    EXPECT_EQ(response, IPMI_CC_OK);
+
+    const auto payload = std::get<1>(r);
+    ASSERT_EQ(payload.has_value(), true);
+    const auto payload_tuple = payload.value();
+    const auto reply_cmd = std::get<0>(payload_tuple);
+    EXPECT_EQ(reply_cmd, SysGetAccelVrSettings);
+    const auto reply_buff = std::get<1>(payload_tuple);
+    ASSERT_EQ(reply_buff.size(), 2);
+
+    EXPECT_EQ(reply_buff.at(0), 0xBB);
+    EXPECT_EQ(reply_buff.at(1), 0xAA);
+}
+
+TEST(GoogleAccelOobTest, GetVrSettings_HandleIncorrectDataSize)
+{
+    ::testing::StrictMock<HandlerMock> h;
+    constexpr uint8_t kChipId = 2;
+    uint8_t kSettingsId = 1;
+
+    std::vector<uint8_t> testData = {kChipId, kSettingsId, 0xCC};
+
+    EXPECT_CALL(h, accelGetVrSettings(_, _, _)).Times(0);
+
+    Resp r = accelGetVrSettings(nullptr, testData, &h);
+
+    const auto response = std::get<0>(r);
+    EXPECT_EQ(response, IPMI_CC_REQ_DATA_LEN_INVALID);
+
+    const auto payload = std::get<1>(r);
+    ASSERT_EQ(payload.has_value(), false);
+}
 } // namespace ipmi
 } // namespace google
diff --git a/test/handler_mock.hpp b/test/handler_mock.hpp
index f62564e..579dfc6 100644
--- a/test/handler_mock.hpp
+++ b/test/handler_mock.hpp
@@ -16,6 +16,8 @@
 
 #include "handler.hpp"
 
+#include <ipmid/message.hpp>
+
 #include <cstddef>
 #include <cstdint>
 #include <string>
@@ -64,6 +66,11 @@
     MOCK_METHOD(std::vector<uint8_t>, pcieBifurcation, (uint8_t), (override));
     MOCK_METHOD(uint8_t, getBmcMode, (), (override));
     MOCK_METHOD(void, linuxBootDone, (), (const, override));
+    MOCK_METHOD(void, accelSetVrSettings,
+                (::ipmi::Context::ptr, uint8_t, uint8_t, uint16_t),
+                (const, override));
+    MOCK_METHOD(uint16_t, accelGetVrSettings,
+                (::ipmi::Context::ptr, uint8_t, uint8_t), (const, override));
 };
 
 } // namespace ipmi