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