xref: /openbmc/telemetry/tests/src/test_trigger_manager.cpp (revision 405c1e4bf8b993cb3800adead546e91b030ecb9b)
1 #include "dbus_environment.hpp"
2 #include "helpers.hpp"
3 #include "mocks/trigger_factory_mock.hpp"
4 #include "mocks/trigger_mock.hpp"
5 #include "params/trigger_params.hpp"
6 #include "trigger_manager.hpp"
7 
8 using namespace testing;
9 
10 class TestTriggerManager : public Test
11 {
12   public:
13     std::pair<boost::system::error_code, std::string>
14         addTrigger(const TriggerParams& params)
15     {
16         std::promise<std::pair<boost::system::error_code, std::string>>
17             addTriggerPromise;
18         DbusEnvironment::getBus()->async_method_call(
19             [&addTriggerPromise](boost::system::error_code ec,
20                                  const std::string& path) {
21                 addTriggerPromise.set_value({ec, path});
22             },
23             DbusEnvironment::serviceName(), TriggerManager::triggerManagerPath,
24             TriggerManager::triggerManagerIfaceName, "AddTrigger",
25             params.name(), params.isDiscrete(), params.logToJournal(),
26             params.logToRedfish(), params.updateReport(), params.sensors(),
27             params.reportNames(), params.thresholdParams());
28         return DbusEnvironment::waitForFuture(addTriggerPromise.get_future());
29     }
30 
31     TriggerParams triggerParams;
32     std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr =
33         std::make_unique<NiceMock<TriggerFactoryMock>>();
34     TriggerFactoryMock& triggerFactoryMock = *triggerFactoryMockPtr;
35     std::unique_ptr<TriggerMock> triggerMockPtr =
36         std::make_unique<NiceMock<TriggerMock>>(triggerParams.name());
37     TriggerMock& triggerMock = *triggerMockPtr;
38     std::unique_ptr<TriggerManager> sut = std::make_unique<TriggerManager>(
39         std::move(triggerFactoryMockPtr),
40         std::move(DbusEnvironment::getObjServer()));
41     MockFunction<void(std::string)> checkPoint;
42 };
43 
44 TEST_F(TestTriggerManager, addTrigger)
45 {
46     triggerFactoryMock.expectMake(triggerParams, Ref(*sut))
47         .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
48 
49     auto [ec, path] = addTrigger(triggerParams);
50     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
51     EXPECT_THAT(path, Eq(triggerMock.getPath()));
52 }
53 
54 TEST_F(TestTriggerManager, DISABLED_failToAddTriggerTwice)
55 {
56     triggerFactoryMock.expectMake(triggerParams, Ref(*sut))
57         .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
58 
59     addTrigger(triggerParams);
60 
61     auto [ec, path] = addTrigger(triggerParams);
62     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
63     EXPECT_THAT(path, Eq(std::string()));
64 }
65 
66 TEST_F(TestTriggerManager, DISABLED_failToAddTriggerWhenMaxTriggerIsReached)
67 {
68     triggerFactoryMock.expectMake(std::nullopt, Ref(*sut))
69         .Times(TriggerManager::maxTriggers);
70 
71     for (size_t i = 0; i < TriggerManager::maxTriggers; i++)
72     {
73         triggerParams.name(triggerParams.name() + std::to_string(i));
74 
75         auto [ec, path] = addTrigger(triggerParams);
76         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
77     }
78 
79     triggerParams.name(triggerParams.name() +
80                        std::to_string(TriggerManager::maxTriggers));
81     auto [ec, path] = addTrigger(triggerParams);
82     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
83     EXPECT_THAT(path, Eq(std::string()));
84 }
85 
86 TEST_F(TestTriggerManager, removeTrigger)
87 {
88     {
89         InSequence seq;
90         triggerFactoryMock.expectMake(triggerParams, Ref(*sut))
91             .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
92         EXPECT_CALL(triggerMock, Die());
93         EXPECT_CALL(checkPoint, Call("end"));
94     }
95 
96     addTrigger(triggerParams);
97     sut->removeTrigger(&triggerMock);
98     checkPoint.Call("end");
99 }
100 
101 TEST_F(TestTriggerManager, removingTriggerThatIsNotInContainerHasNoEffect)
102 {
103     {
104         InSequence seq;
105         EXPECT_CALL(checkPoint, Call("end"));
106         EXPECT_CALL(triggerMock, Die());
107     }
108 
109     sut->removeTrigger(&triggerMock);
110     checkPoint.Call("end");
111 }
112 
113 TEST_F(TestTriggerManager, removingSameTriggerTwiceHasNoSideEffect)
114 {
115     {
116         InSequence seq;
117         triggerFactoryMock.expectMake(triggerParams, Ref(*sut))
118             .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
119         EXPECT_CALL(triggerMock, Die());
120         EXPECT_CALL(checkPoint, Call("end"));
121     }
122 
123     addTrigger(triggerParams);
124     sut->removeTrigger(&triggerMock);
125     sut->removeTrigger(&triggerMock);
126     checkPoint.Call("end");
127 }
128