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