blob: 16912b56ce6c476605023e4bb39b2faa478bfd08 [file] [log] [blame]
Lei YU4b9ac392019-10-12 11:02:26 +08001#include "config.h"
2
Lei YU5e0dcb32019-08-02 18:04:34 +08003#include "utils.hpp"
4
5#include <sdbusplus/test/sdbus_mock.hpp>
6
7#include <gmock/gmock.h>
8#include <gtest/gtest.h>
9
10using ::testing::_;
11using ::testing::Invoke;
12using ::testing::IsNull;
Shawn McCarneyb8590f52025-01-13 13:09:22 -060013using ::testing::NiceMock;
Lei YU5e0dcb32019-08-02 18:04:34 +080014using ::testing::Return;
15using ::testing::StrEq;
16
17TEST(Utils, GetPSUInventoryPath)
18{
Shawn McCarneyb8590f52025-01-13 13:09:22 -060019 NiceMock<sdbusplus::SdBusMock> sdbusMock;
Lei YU5e0dcb32019-08-02 18:04:34 +080020 auto bus = sdbusplus::get_mocked_new(&sdbusMock);
21
22 EXPECT_CALL(sdbusMock, sd_bus_message_new_method_call(
23 _, _, _, _, _, StrEq("GetSubTreePaths")));
24
25 EXPECT_CALL(sdbusMock, sd_bus_message_ref(IsNull()))
26 .WillOnce(Return(nullptr));
Patrick Williams374fae52022-07-22 19:26:55 -050027 sdbusplus::message_t msg(nullptr, &sdbusMock);
Lei YU5e0dcb32019-08-02 18:04:34 +080028
29 const char* path0 = "/com/example/chassis/powersupply0";
30 const char* path1 = "/com/example/chassis/powersupply1";
31
32 // std::vector
33 EXPECT_CALL(sdbusMock,
34 sd_bus_message_enter_container(IsNull(), 'a', StrEq("s")))
35 .WillOnce(Return(1));
36
37 // while !at_end()
38 EXPECT_CALL(sdbusMock, sd_bus_message_at_end(IsNull(), 0))
39 .WillOnce(Return(0))
40 .WillOnce(Return(0))
41 .WillOnce(Return(1)); // So it exits the loop after reading two strings.
42
43 // std::string
44 EXPECT_CALL(sdbusMock, sd_bus_message_read_basic(IsNull(), 's', _))
45 .WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
Patrick Williamsbab5ed92024-08-16 15:20:54 -040046 const char** s = static_cast<const char**>(p);
47 // Read the first parameter, the string.
48 *s = path0;
49 return 0;
50 }))
51 .WillOnce(Invoke([&](sd_bus_message*, char, void* p) {
52 const char** s = static_cast<const char**>(p);
53 // Read the first parameter, the string.
54 *s = path1;
55 return 0;
56 }));
Lei YU5e0dcb32019-08-02 18:04:34 +080057
58 EXPECT_CALL(sdbusMock, sd_bus_message_exit_container(IsNull()))
59 .WillOnce(Return(0)); /* end of std::vector */
60
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -060061 auto ret = utils::getPSUInventoryPaths(bus);
George Liu22c2fbd2024-08-23 15:23:21 +080062 EXPECT_EQ(2U, ret.size());
Lei YU5e0dcb32019-08-02 18:04:34 +080063 EXPECT_EQ(path0, ret[0]);
64 EXPECT_EQ(path1, ret[1]);
65}
Lei YUad90ad52019-08-06 11:19:28 +080066
67TEST(Utils, GetVersionID)
68{
Lei YUad90ad52019-08-06 11:19:28 +080069 auto ret = utils::getVersionId("");
70 EXPECT_EQ("", ret);
71
72 ret = utils::getVersionId("some version");
George Liu22c2fbd2024-08-23 15:23:21 +080073 EXPECT_EQ(8U, ret.size());
Lei YUad90ad52019-08-06 11:19:28 +080074}
Lei YU4b9ac392019-10-12 11:02:26 +080075
76TEST(Utils, IsAssociated)
77{
78 std::string path = "/com/example/chassis/powersupply0";
Patrick Williamsbab5ed92024-08-16 15:20:54 -040079 utils::AssociationList assocs = {
80 {ACTIVATION_FWD_ASSOCIATION, ACTIVATION_REV_ASSOCIATION,
81 "a-different-path"}};
Lei YU4b9ac392019-10-12 11:02:26 +080082
83 EXPECT_FALSE(utils::isAssociated(path, assocs));
84
85 assocs.emplace_back(ACTIVATION_FWD_ASSOCIATION, ACTIVATION_REV_ASSOCIATION,
86 path);
87 EXPECT_TRUE(utils::isAssociated(path, assocs));
88}