1 #include "utils.hpp"
2 
3 #include <sdbusplus/test/sdbus_mock.hpp>
4 
5 #include <gmock/gmock.h>
6 #include <gtest/gtest.h>
7 
8 using ::testing::_;
9 using ::testing::Invoke;
10 using ::testing::IsNull;
11 using ::testing::Return;
12 using ::testing::StrEq;
13 
14 TEST(Utils, GetPSUInventoryPath)
15 {
16     sdbusplus::SdBusMock sdbusMock;
17     auto bus = sdbusplus::get_mocked_new(&sdbusMock);
18 
19     EXPECT_CALL(sdbusMock, sd_bus_message_new_method_call(
20                                _, _, _, _, _, StrEq("GetSubTreePaths")));
21 
22     EXPECT_CALL(sdbusMock, sd_bus_message_ref(IsNull()))
23         .WillOnce(Return(nullptr));
24     sdbusplus::message::message msg(nullptr, &sdbusMock);
25 
26     const char* path0 = "/com/example/chassis/powersupply0";
27     const char* path1 = "/com/example/chassis/powersupply1";
28 
29     // std::vector
30     EXPECT_CALL(sdbusMock,
31                 sd_bus_message_enter_container(IsNull(), 'a', StrEq("s")))
32         .WillOnce(Return(1));
33 
34     // while !at_end()
35     EXPECT_CALL(sdbusMock, sd_bus_message_at_end(IsNull(), 0))
36         .WillOnce(Return(0))
37         .WillOnce(Return(0))
38         .WillOnce(Return(1)); // So it exits the loop after reading two strings.
39 
40     // std::string
41     EXPECT_CALL(sdbusMock, sd_bus_message_read_basic(IsNull(), 's', _))
42         .WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
43             const char** s = static_cast<const char**>(p);
44             // Read the first parameter, the string.
45             *s = path0;
46             return 0;
47         }))
48         .WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
49             const char** s = static_cast<const char**>(p);
50             // Read the first parameter, the string.
51             *s = path1;
52             return 0;
53         }));
54 
55     EXPECT_CALL(sdbusMock, sd_bus_message_exit_container(IsNull()))
56         .WillOnce(Return(0)); /* end of std::vector */
57 
58     auto ret = utils::getPSUInventoryPath(bus);
59     EXPECT_EQ(2u, ret.size());
60     EXPECT_EQ(path0, ret[0]);
61     EXPECT_EQ(path1, ret[1]);
62 }
63