xref: /openbmc/sdeventplus/test/event.cpp (revision fe059910)
18f90e28bSWilliam A. Kennington III #include <gmock/gmock.h>
28f90e28bSWilliam A. Kennington III #include <gtest/gtest.h>
3631c2460SWilliam A. Kennington III #include <memory>
48f90e28bSWilliam A. Kennington III #include <sdeventplus/event.hpp>
58f90e28bSWilliam A. Kennington III #include <sdeventplus/exception.hpp>
68f90e28bSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp>
78f90e28bSWilliam A. Kennington III #include <type_traits>
88f90e28bSWilliam A. Kennington III 
98f90e28bSWilliam A. Kennington III namespace sdeventplus
108f90e28bSWilliam A. Kennington III {
118f90e28bSWilliam A. Kennington III namespace
128f90e28bSWilliam A. Kennington III {
138f90e28bSWilliam A. Kennington III 
148f90e28bSWilliam A. Kennington III using testing::DoAll;
158f90e28bSWilliam A. Kennington III using testing::Return;
168f90e28bSWilliam A. Kennington III using testing::SetArgPointee;
178f90e28bSWilliam A. Kennington III 
188f90e28bSWilliam A. Kennington III class EventTest : public testing::Test
198f90e28bSWilliam A. Kennington III {
208f90e28bSWilliam A. Kennington III   protected:
210a816c5dSWilliam A. Kennington III     testing::StrictMock<test::SdEventMock> mock;
228f90e28bSWilliam A. Kennington III     sd_event* const expected_event = reinterpret_cast<sd_event*>(1234);
238f90e28bSWilliam A. Kennington III };
248f90e28bSWilliam A. Kennington III 
258f90e28bSWilliam A. Kennington III TEST_F(EventTest, NewEventRef)
268f90e28bSWilliam A. Kennington III {
278f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_ref(expected_event))
288f90e28bSWilliam A. Kennington III         .WillOnce(Return(expected_event));
298f90e28bSWilliam A. Kennington III     Event event(expected_event, &mock);
30bdc59018SWilliam A. Kennington III     EXPECT_EQ(&mock, event.getSdEvent());
31bdc59018SWilliam A. Kennington III     EXPECT_EQ(expected_event, event.get());
328f90e28bSWilliam A. Kennington III 
338f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
348f90e28bSWilliam A. Kennington III }
358f90e28bSWilliam A. Kennington III 
368f90e28bSWilliam A. Kennington III TEST_F(EventTest, NewEventNoRef)
378f90e28bSWilliam A. Kennington III {
388f90e28bSWilliam A. Kennington III     Event event(expected_event, std::false_type(), &mock);
39bdc59018SWilliam A. Kennington III     EXPECT_EQ(&mock, event.getSdEvent());
40bdc59018SWilliam A. Kennington III     EXPECT_EQ(expected_event, event.get());
418f90e28bSWilliam A. Kennington III 
428f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
438f90e28bSWilliam A. Kennington III }
448f90e28bSWilliam A. Kennington III 
458f90e28bSWilliam A. Kennington III TEST_F(EventTest, GetNewEvent)
468f90e28bSWilliam A. Kennington III {
478f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_new(testing::_))
488f90e28bSWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0)));
498f90e28bSWilliam A. Kennington III     Event event = Event::get_new(&mock);
50bdc59018SWilliam A. Kennington III     EXPECT_EQ(&mock, event.getSdEvent());
51bdc59018SWilliam A. Kennington III     EXPECT_EQ(expected_event, event.get());
528f90e28bSWilliam A. Kennington III 
538f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
548f90e28bSWilliam A. Kennington III }
558f90e28bSWilliam A. Kennington III 
568f90e28bSWilliam A. Kennington III TEST_F(EventTest, GetNewEventFail)
578f90e28bSWilliam A. Kennington III {
588f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_new(testing::_)).WillOnce(Return(-EINVAL));
598f90e28bSWilliam A. Kennington III     EXPECT_THROW(Event::get_new(&mock), SdEventError);
608f90e28bSWilliam A. Kennington III }
618f90e28bSWilliam A. Kennington III 
628f90e28bSWilliam A. Kennington III TEST_F(EventTest, GetDefaultEvent)
638f90e28bSWilliam A. Kennington III {
648f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_default(testing::_))
658f90e28bSWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0)));
668f90e28bSWilliam A. Kennington III     Event event = Event::get_default(&mock);
67bdc59018SWilliam A. Kennington III     EXPECT_EQ(&mock, event.getSdEvent());
68bdc59018SWilliam A. Kennington III     EXPECT_EQ(expected_event, event.get());
698f90e28bSWilliam A. Kennington III 
708f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
718f90e28bSWilliam A. Kennington III }
728f90e28bSWilliam A. Kennington III 
738f90e28bSWilliam A. Kennington III TEST_F(EventTest, GetDefaultEventFail)
748f90e28bSWilliam A. Kennington III {
758f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_default(testing::_)).WillOnce(Return(-EINVAL));
768f90e28bSWilliam A. Kennington III     EXPECT_THROW(Event::get_default(&mock), SdEventError);
778f90e28bSWilliam A. Kennington III }
788f90e28bSWilliam A. Kennington III 
79631c2460SWilliam A. Kennington III class EventMethodTest : public EventTest
808f90e28bSWilliam A. Kennington III {
81631c2460SWilliam A. Kennington III   protected:
82631c2460SWilliam A. Kennington III     std::unique_ptr<Event> event;
83631c2460SWilliam A. Kennington III 
84631c2460SWilliam A. Kennington III     void SetUp()
85631c2460SWilliam A. Kennington III     {
86631c2460SWilliam A. Kennington III         event =
87631c2460SWilliam A. Kennington III             std::make_unique<Event>(expected_event, std::false_type(), &mock);
888f90e28bSWilliam A. Kennington III     }
898f90e28bSWilliam A. Kennington III 
90631c2460SWilliam A. Kennington III     void TearDown()
91631c2460SWilliam A. Kennington III     {
92631c2460SWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_unref(expected_event))
93631c2460SWilliam A. Kennington III             .WillOnce(Return(nullptr));
94631c2460SWilliam A. Kennington III     }
95631c2460SWilliam A. Kennington III };
96631c2460SWilliam A. Kennington III 
97*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareSuccessNone)
98*fe059910SWilliam A. Kennington III {
99*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event)).WillOnce(Return(0));
100*fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->prepare());
101*fe059910SWilliam A. Kennington III }
102*fe059910SWilliam A. Kennington III 
103*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareSuccessReady)
104*fe059910SWilliam A. Kennington III {
105*fe059910SWilliam A. Kennington III     const int events_ready = 10;
106*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event))
107*fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
108*fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->prepare());
109*fe059910SWilliam A. Kennington III }
110*fe059910SWilliam A. Kennington III 
111*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareInternalError)
112*fe059910SWilliam A. Kennington III {
113*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event))
114*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
115*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->prepare(), SdEventError);
116*fe059910SWilliam A. Kennington III }
117*fe059910SWilliam A. Kennington III 
118*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitSuccessNone)
119*fe059910SWilliam A. Kennington III {
120*fe059910SWilliam A. Kennington III     const std::chrono::microseconds timeout{20};
121*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, timeout.count()))
122*fe059910SWilliam A. Kennington III         .WillOnce(Return(0));
123*fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->wait(timeout));
124*fe059910SWilliam A. Kennington III }
125*fe059910SWilliam A. Kennington III 
126*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitSuccessReady)
127*fe059910SWilliam A. Kennington III {
128*fe059910SWilliam A. Kennington III     const int events_ready = 10;
129*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
130*fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
131*fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->wait(std::experimental::nullopt));
132*fe059910SWilliam A. Kennington III }
133*fe059910SWilliam A. Kennington III 
134*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitInternalError)
135*fe059910SWilliam A. Kennington III {
136*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
137*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
138*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->wait(std::experimental::nullopt), SdEventError);
139*fe059910SWilliam A. Kennington III }
140*fe059910SWilliam A. Kennington III 
141*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchInitial)
142*fe059910SWilliam A. Kennington III {
143*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event)).WillOnce(Return(0));
144*fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->dispatch());
145*fe059910SWilliam A. Kennington III }
146*fe059910SWilliam A. Kennington III 
147*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchDone)
148*fe059910SWilliam A. Kennington III {
149*fe059910SWilliam A. Kennington III     const int done_code = 10;
150*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event))
151*fe059910SWilliam A. Kennington III         .WillOnce(Return(done_code));
152*fe059910SWilliam A. Kennington III     EXPECT_EQ(done_code, event->dispatch());
153*fe059910SWilliam A. Kennington III }
154*fe059910SWilliam A. Kennington III 
155*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchInternalError)
156*fe059910SWilliam A. Kennington III {
157*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event))
158*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
159*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->dispatch(), SdEventError);
160*fe059910SWilliam A. Kennington III }
161*fe059910SWilliam A. Kennington III 
162*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunSuccessNone)
163*fe059910SWilliam A. Kennington III {
164*fe059910SWilliam A. Kennington III     const std::chrono::microseconds timeout{20};
165*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, timeout.count()))
166*fe059910SWilliam A. Kennington III         .WillOnce(Return(0));
167*fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->run(timeout));
168*fe059910SWilliam A. Kennington III }
169*fe059910SWilliam A. Kennington III 
170*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunSuccessReady)
171*fe059910SWilliam A. Kennington III {
172*fe059910SWilliam A. Kennington III     const int events_ready = 10;
173*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
174*fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
175*fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->run(std::experimental::nullopt));
176*fe059910SWilliam A. Kennington III }
177*fe059910SWilliam A. Kennington III 
178*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunInternalError)
179*fe059910SWilliam A. Kennington III {
180*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
181*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
182*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->run(std::experimental::nullopt), SdEventError);
183*fe059910SWilliam A. Kennington III }
184*fe059910SWilliam A. Kennington III 
185631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, LoopSuccess)
186631c2460SWilliam A. Kennington III {
187631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(0));
188631c2460SWilliam A. Kennington III     EXPECT_EQ(0, event->loop());
189631c2460SWilliam A. Kennington III }
190631c2460SWilliam A. Kennington III 
191631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, LoopUserError)
1928f90e28bSWilliam A. Kennington III {
1938f90e28bSWilliam A. Kennington III     const int user_error = 10;
1948f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_loop(expected_event))
1958f90e28bSWilliam A. Kennington III         .WillOnce(Return(user_error));
1966364dd9eSWilliam A. Kennington III     EXPECT_EQ(user_error, event->loop());
1978f90e28bSWilliam A. Kennington III }
1988f90e28bSWilliam A. Kennington III 
199631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, LoopInternalError)
2008f90e28bSWilliam A. Kennington III {
2018f90e28bSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(-EINVAL));
202631c2460SWilliam A. Kennington III     EXPECT_THROW(event->loop(), SdEventError);
203631c2460SWilliam A. Kennington III }
204631c2460SWilliam A. Kennington III 
205*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, ExitSuccess)
206*fe059910SWilliam A. Kennington III {
207*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 0)).WillOnce(Return(2));
208*fe059910SWilliam A. Kennington III     EXPECT_EQ(2, event->exit(0));
209*fe059910SWilliam A. Kennington III }
210*fe059910SWilliam A. Kennington III 
211*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, ExitUserError)
212*fe059910SWilliam A. Kennington III {
213*fe059910SWilliam A. Kennington III     const int user_error = 10;
214*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, user_error))
215*fe059910SWilliam A. Kennington III         .WillOnce(Return(user_error));
216*fe059910SWilliam A. Kennington III     EXPECT_EQ(user_error, event->exit(user_error));
217*fe059910SWilliam A. Kennington III }
218*fe059910SWilliam A. Kennington III 
219*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, ExitInternalError)
220*fe059910SWilliam A. Kennington III {
221*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 5))
222*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
223*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->exit(5), SdEventError);
224*fe059910SWilliam A. Kennington III }
225*fe059910SWilliam A. Kennington III 
226*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, GetExitCodeSuccess)
227*fe059910SWilliam A. Kennington III {
228*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
229*fe059910SWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<1>(1), Return(0)));
230*fe059910SWilliam A. Kennington III     EXPECT_EQ(1, event->get_exit_code());
231*fe059910SWilliam A. Kennington III 
232*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
233*fe059910SWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<1>(0), Return(2)));
234*fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->get_exit_code());
235*fe059910SWilliam A. Kennington III }
236*fe059910SWilliam A. Kennington III 
237*fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, GetExitCodeError)
238*fe059910SWilliam A. Kennington III {
239*fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
240*fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
241*fe059910SWilliam A. Kennington III     EXPECT_THROW(event->get_exit_code(), SdEventError);
242*fe059910SWilliam A. Kennington III }
243*fe059910SWilliam A. Kennington III 
244631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, GetWatchdogSuccess)
245631c2460SWilliam A. Kennington III {
246631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
247631c2460SWilliam A. Kennington III         .WillOnce(Return(0));
248631c2460SWilliam A. Kennington III     EXPECT_EQ(0, event->get_watchdog());
249631c2460SWilliam A. Kennington III 
250631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
251631c2460SWilliam A. Kennington III         .WillOnce(Return(2));
252631c2460SWilliam A. Kennington III     EXPECT_EQ(2, event->get_watchdog());
253631c2460SWilliam A. Kennington III }
254631c2460SWilliam A. Kennington III 
255631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, GetWatchdogError)
256631c2460SWilliam A. Kennington III {
257631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
258631c2460SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
259631c2460SWilliam A. Kennington III     EXPECT_THROW(event->get_watchdog(), SdEventError);
260631c2460SWilliam A. Kennington III }
261631c2460SWilliam A. Kennington III 
262631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, SetWatchdogSuccess)
263631c2460SWilliam A. Kennington III {
264631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 0))
265631c2460SWilliam A. Kennington III         .WillOnce(Return(0));
266631c2460SWilliam A. Kennington III     EXPECT_EQ(0, event->set_watchdog(0));
267631c2460SWilliam A. Kennington III 
268631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1))
269631c2460SWilliam A. Kennington III         .WillOnce(Return(2));
270631c2460SWilliam A. Kennington III     EXPECT_EQ(2, event->set_watchdog(1));
271631c2460SWilliam A. Kennington III }
272631c2460SWilliam A. Kennington III 
273631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, SetWatchdogError)
274631c2460SWilliam A. Kennington III {
275631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1))
276631c2460SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
277631c2460SWilliam A. Kennington III     EXPECT_THROW(event->set_watchdog(1), SdEventError);
2788f90e28bSWilliam A. Kennington III }
2798f90e28bSWilliam A. Kennington III 
2808f90e28bSWilliam A. Kennington III } // namespace
2818f90e28bSWilliam A. Kennington III } // namespace sdeventplus
282