xref: /openbmc/sdeventplus/test/event.cpp (revision 0005e30c)
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 
97fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareSuccessNone)
98fe059910SWilliam A. Kennington III {
99fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event)).WillOnce(Return(0));
100fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->prepare());
101fe059910SWilliam A. Kennington III }
102fe059910SWilliam A. Kennington III 
103fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareSuccessReady)
104fe059910SWilliam A. Kennington III {
105fe059910SWilliam A. Kennington III     const int events_ready = 10;
106fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event))
107fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
108fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->prepare());
109fe059910SWilliam A. Kennington III }
110fe059910SWilliam A. Kennington III 
111fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, PrepareInternalError)
112fe059910SWilliam A. Kennington III {
113fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_prepare(expected_event))
114fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
115fe059910SWilliam A. Kennington III     EXPECT_THROW(event->prepare(), SdEventError);
116fe059910SWilliam A. Kennington III }
117fe059910SWilliam A. Kennington III 
118fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitSuccessNone)
119fe059910SWilliam A. Kennington III {
120fe059910SWilliam A. Kennington III     const std::chrono::microseconds timeout{20};
121fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, timeout.count()))
122fe059910SWilliam A. Kennington III         .WillOnce(Return(0));
123fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->wait(timeout));
124fe059910SWilliam A. Kennington III }
125fe059910SWilliam A. Kennington III 
126fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitSuccessReady)
127fe059910SWilliam A. Kennington III {
128fe059910SWilliam A. Kennington III     const int events_ready = 10;
129fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
130fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
131fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->wait(std::experimental::nullopt));
132fe059910SWilliam A. Kennington III }
133fe059910SWilliam A. Kennington III 
134fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, WaitInternalError)
135fe059910SWilliam A. Kennington III {
136fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
137fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
138fe059910SWilliam A. Kennington III     EXPECT_THROW(event->wait(std::experimental::nullopt), SdEventError);
139fe059910SWilliam A. Kennington III }
140fe059910SWilliam A. Kennington III 
141fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchInitial)
142fe059910SWilliam A. Kennington III {
143fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event)).WillOnce(Return(0));
144fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->dispatch());
145fe059910SWilliam A. Kennington III }
146fe059910SWilliam A. Kennington III 
147fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchDone)
148fe059910SWilliam A. Kennington III {
149fe059910SWilliam A. Kennington III     const int done_code = 10;
150fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event))
151fe059910SWilliam A. Kennington III         .WillOnce(Return(done_code));
152fe059910SWilliam A. Kennington III     EXPECT_EQ(done_code, event->dispatch());
153fe059910SWilliam A. Kennington III }
154fe059910SWilliam A. Kennington III 
155fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, DispatchInternalError)
156fe059910SWilliam A. Kennington III {
157fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_dispatch(expected_event))
158fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
159fe059910SWilliam A. Kennington III     EXPECT_THROW(event->dispatch(), SdEventError);
160fe059910SWilliam A. Kennington III }
161fe059910SWilliam A. Kennington III 
162fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunSuccessNone)
163fe059910SWilliam A. Kennington III {
164fe059910SWilliam A. Kennington III     const std::chrono::microseconds timeout{20};
165fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, timeout.count()))
166fe059910SWilliam A. Kennington III         .WillOnce(Return(0));
167fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->run(timeout));
168fe059910SWilliam A. Kennington III }
169fe059910SWilliam A. Kennington III 
170fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunSuccessReady)
171fe059910SWilliam A. Kennington III {
172fe059910SWilliam A. Kennington III     const int events_ready = 10;
173fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
174fe059910SWilliam A. Kennington III         .WillOnce(Return(events_ready));
175fe059910SWilliam A. Kennington III     EXPECT_EQ(events_ready, event->run(std::experimental::nullopt));
176fe059910SWilliam A. Kennington III }
177fe059910SWilliam A. Kennington III 
178fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, RunInternalError)
179fe059910SWilliam A. Kennington III {
180fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
181fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
182fe059910SWilliam A. Kennington III     EXPECT_THROW(event->run(std::experimental::nullopt), SdEventError);
183fe059910SWilliam A. Kennington III }
184fe059910SWilliam 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 
205fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, ExitSuccess)
206fe059910SWilliam A. Kennington III {
207fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 0)).WillOnce(Return(2));
208*0005e30cSWilliam A. Kennington III     event->exit(0);
209*0005e30cSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 0)).WillOnce(Return(0));
210*0005e30cSWilliam A. Kennington III     event->exit(0);
211*0005e30cSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 10)).WillOnce(Return(0));
212*0005e30cSWilliam A. Kennington III     event->exit(10);
213fe059910SWilliam A. Kennington III }
214fe059910SWilliam A. Kennington III 
215fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, ExitInternalError)
216fe059910SWilliam A. Kennington III {
217fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_exit(expected_event, 5))
218fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
219fe059910SWilliam A. Kennington III     EXPECT_THROW(event->exit(5), SdEventError);
220fe059910SWilliam A. Kennington III }
221fe059910SWilliam A. Kennington III 
222fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, GetExitCodeSuccess)
223fe059910SWilliam A. Kennington III {
224fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
225fe059910SWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<1>(1), Return(0)));
226fe059910SWilliam A. Kennington III     EXPECT_EQ(1, event->get_exit_code());
227fe059910SWilliam A. Kennington III 
228fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
229fe059910SWilliam A. Kennington III         .WillOnce(DoAll(SetArgPointee<1>(0), Return(2)));
230fe059910SWilliam A. Kennington III     EXPECT_EQ(0, event->get_exit_code());
231fe059910SWilliam A. Kennington III }
232fe059910SWilliam A. Kennington III 
233fe059910SWilliam A. Kennington III TEST_F(EventMethodTest, GetExitCodeError)
234fe059910SWilliam A. Kennington III {
235fe059910SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
236fe059910SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
237fe059910SWilliam A. Kennington III     EXPECT_THROW(event->get_exit_code(), SdEventError);
238fe059910SWilliam A. Kennington III }
239fe059910SWilliam A. Kennington III 
240631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, GetWatchdogSuccess)
241631c2460SWilliam A. Kennington III {
242631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
243631c2460SWilliam A. Kennington III         .WillOnce(Return(0));
244*0005e30cSWilliam A. Kennington III     EXPECT_FALSE(event->get_watchdog());
245631c2460SWilliam A. Kennington III 
246631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
247631c2460SWilliam A. Kennington III         .WillOnce(Return(2));
248*0005e30cSWilliam A. Kennington III     EXPECT_TRUE(event->get_watchdog());
249631c2460SWilliam A. Kennington III }
250631c2460SWilliam A. Kennington III 
251631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, GetWatchdogError)
252631c2460SWilliam A. Kennington III {
253631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
254631c2460SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
255631c2460SWilliam A. Kennington III     EXPECT_THROW(event->get_watchdog(), SdEventError);
256631c2460SWilliam A. Kennington III }
257631c2460SWilliam A. Kennington III 
258631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, SetWatchdogSuccess)
259631c2460SWilliam A. Kennington III {
260*0005e30cSWilliam A. Kennington III     // Disable
261*0005e30cSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, false))
262631c2460SWilliam A. Kennington III         .WillOnce(Return(0));
263*0005e30cSWilliam A. Kennington III     EXPECT_FALSE(event->set_watchdog(false));
264631c2460SWilliam A. Kennington III 
265*0005e30cSWilliam A. Kennington III     // Enable but not supported
266*0005e30cSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, true))
267*0005e30cSWilliam A. Kennington III         .WillOnce(Return(0));
268*0005e30cSWilliam A. Kennington III     EXPECT_FALSE(event->set_watchdog(true));
269*0005e30cSWilliam A. Kennington III 
270*0005e30cSWilliam A. Kennington III     // Enabled and supported
271*0005e30cSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, true))
272631c2460SWilliam A. Kennington III         .WillOnce(Return(2));
273*0005e30cSWilliam A. Kennington III     EXPECT_TRUE(event->set_watchdog(true));
274631c2460SWilliam A. Kennington III }
275631c2460SWilliam A. Kennington III 
276631c2460SWilliam A. Kennington III TEST_F(EventMethodTest, SetWatchdogError)
277631c2460SWilliam A. Kennington III {
278631c2460SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1))
279631c2460SWilliam A. Kennington III         .WillOnce(Return(-EINVAL));
280631c2460SWilliam A. Kennington III     EXPECT_THROW(event->set_watchdog(1), SdEventError);
2818f90e28bSWilliam A. Kennington III }
2828f90e28bSWilliam A. Kennington III 
2838f90e28bSWilliam A. Kennington III } // namespace
2848f90e28bSWilliam A. Kennington III } // namespace sdeventplus
285