14b9ac392SLei YU #include "config.h"
24b9ac392SLei YU 
35e0dcb39SLei YU #include "utils.hpp"
45e0dcb39SLei YU 
55e0dcb39SLei YU #include <sdbusplus/test/sdbus_mock.hpp>
65e0dcb39SLei YU 
75e0dcb39SLei YU #include <gmock/gmock.h>
85e0dcb39SLei YU #include <gtest/gtest.h>
95e0dcb39SLei YU 
105e0dcb39SLei YU using ::testing::_;
115e0dcb39SLei YU using ::testing::Invoke;
125e0dcb39SLei YU using ::testing::IsNull;
135e0dcb39SLei YU using ::testing::Return;
145e0dcb39SLei YU using ::testing::StrEq;
155e0dcb39SLei YU 
TEST(Utils,GetPSUInventoryPath)165e0dcb39SLei YU TEST(Utils, GetPSUInventoryPath)
175e0dcb39SLei YU {
185e0dcb39SLei YU     sdbusplus::SdBusMock sdbusMock;
195e0dcb39SLei YU     auto bus = sdbusplus::get_mocked_new(&sdbusMock);
205e0dcb39SLei YU 
215e0dcb39SLei YU     EXPECT_CALL(sdbusMock, sd_bus_message_new_method_call(
225e0dcb39SLei YU                                _, _, _, _, _, StrEq("GetSubTreePaths")));
235e0dcb39SLei YU 
245e0dcb39SLei YU     EXPECT_CALL(sdbusMock, sd_bus_message_ref(IsNull()))
255e0dcb39SLei YU         .WillOnce(Return(nullptr));
26374fae56SPatrick Williams     sdbusplus::message_t msg(nullptr, &sdbusMock);
275e0dcb39SLei YU 
285e0dcb39SLei YU     const char* path0 = "/com/example/chassis/powersupply0";
295e0dcb39SLei YU     const char* path1 = "/com/example/chassis/powersupply1";
305e0dcb39SLei YU 
315e0dcb39SLei YU     // std::vector
325e0dcb39SLei YU     EXPECT_CALL(sdbusMock,
335e0dcb39SLei YU                 sd_bus_message_enter_container(IsNull(), 'a', StrEq("s")))
345e0dcb39SLei YU         .WillOnce(Return(1));
355e0dcb39SLei YU 
365e0dcb39SLei YU     // while !at_end()
375e0dcb39SLei YU     EXPECT_CALL(sdbusMock, sd_bus_message_at_end(IsNull(), 0))
385e0dcb39SLei YU         .WillOnce(Return(0))
395e0dcb39SLei YU         .WillOnce(Return(0))
405e0dcb39SLei YU         .WillOnce(Return(1)); // So it exits the loop after reading two strings.
415e0dcb39SLei YU 
425e0dcb39SLei YU     // std::string
435e0dcb39SLei YU     EXPECT_CALL(sdbusMock, sd_bus_message_read_basic(IsNull(), 's', _))
445e0dcb39SLei YU         .WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
455e0dcb39SLei YU         const char** s = static_cast<const char**>(p);
465e0dcb39SLei YU         // Read the first parameter, the string.
475e0dcb39SLei YU         *s = path0;
485e0dcb39SLei YU         return 0;
49*3f6c12b8SPatrick Williams     })).WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
505e0dcb39SLei YU         const char** s = static_cast<const char**>(p);
515e0dcb39SLei YU         // Read the first parameter, the string.
525e0dcb39SLei YU         *s = path1;
535e0dcb39SLei YU         return 0;
545e0dcb39SLei YU     }));
555e0dcb39SLei YU 
565e0dcb39SLei YU     EXPECT_CALL(sdbusMock, sd_bus_message_exit_container(IsNull()))
575e0dcb39SLei YU         .WillOnce(Return(0)); /* end of std::vector */
585e0dcb39SLei YU 
595e0dcb39SLei YU     auto ret = utils::getPSUInventoryPath(bus);
605e0dcb39SLei YU     EXPECT_EQ(2u, ret.size());
615e0dcb39SLei YU     EXPECT_EQ(path0, ret[0]);
625e0dcb39SLei YU     EXPECT_EQ(path1, ret[1]);
635e0dcb39SLei YU }
64ad90ad51SLei YU 
TEST(Utils,GetVersionID)65ad90ad51SLei YU TEST(Utils, GetVersionID)
66ad90ad51SLei YU {
67ad90ad51SLei YU     auto ret = utils::getVersionId("");
68ad90ad51SLei YU     EXPECT_EQ("", ret);
69ad90ad51SLei YU 
70ad90ad51SLei YU     ret = utils::getVersionId("some version");
71ad90ad51SLei YU     EXPECT_EQ(8u, ret.size());
72ad90ad51SLei YU }
734b9ac392SLei YU 
TEST(Utils,IsAssociated)744b9ac392SLei YU TEST(Utils, IsAssociated)
754b9ac392SLei YU {
764b9ac392SLei YU     std::string path = "/com/example/chassis/powersupply0";
774b9ac392SLei YU     utils::AssociationList assocs = {{ACTIVATION_FWD_ASSOCIATION,
784b9ac392SLei YU                                       ACTIVATION_REV_ASSOCIATION,
794b9ac392SLei YU                                       "a-different-path"}};
804b9ac392SLei YU 
814b9ac392SLei YU     EXPECT_FALSE(utils::isAssociated(path, assocs));
824b9ac392SLei YU 
834b9ac392SLei YU     assocs.emplace_back(ACTIVATION_FWD_ASSOCIATION, ACTIVATION_REV_ASSOCIATION,
844b9ac392SLei YU                         path);
854b9ac392SLei YU     EXPECT_TRUE(utils::isAssociated(path, assocs));
864b9ac392SLei YU }
87