blob: 08eecf7edc3ebc56d2aa9331e39e744ab7ee5797 [file] [log] [blame]
#include "utils.hpp"
#include <sdbusplus/test/sdbus_mock.hpp>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using ::testing::_;
using ::testing::Invoke;
using ::testing::IsNull;
using ::testing::Return;
using ::testing::StrEq;
TEST(Utils, GetPSUInventoryPath)
{
sdbusplus::SdBusMock sdbusMock;
auto bus = sdbusplus::get_mocked_new(&sdbusMock);
EXPECT_CALL(sdbusMock, sd_bus_message_new_method_call(
_, _, _, _, _, StrEq("GetSubTreePaths")));
EXPECT_CALL(sdbusMock, sd_bus_message_ref(IsNull()))
.WillOnce(Return(nullptr));
sdbusplus::message::message msg(nullptr, &sdbusMock);
const char* path0 = "/com/example/chassis/powersupply0";
const char* path1 = "/com/example/chassis/powersupply1";
// std::vector
EXPECT_CALL(sdbusMock,
sd_bus_message_enter_container(IsNull(), 'a', StrEq("s")))
.WillOnce(Return(1));
// while !at_end()
EXPECT_CALL(sdbusMock, sd_bus_message_at_end(IsNull(), 0))
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(1)); // So it exits the loop after reading two strings.
// std::string
EXPECT_CALL(sdbusMock, sd_bus_message_read_basic(IsNull(), 's', _))
.WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
const char** s = static_cast<const char**>(p);
// Read the first parameter, the string.
*s = path0;
return 0;
}))
.WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
const char** s = static_cast<const char**>(p);
// Read the first parameter, the string.
*s = path1;
return 0;
}));
EXPECT_CALL(sdbusMock, sd_bus_message_exit_container(IsNull()))
.WillOnce(Return(0)); /* end of std::vector */
auto ret = utils::getPSUInventoryPath(bus);
EXPECT_EQ(2u, ret.size());
EXPECT_EQ(path0, ret[0]);
EXPECT_EQ(path1, ret[1]);
}