148c42751SWilliam A. Kennington III #include <cerrno> 20a816c5dSWilliam A. Kennington III #include <gmock/gmock.h> 30a816c5dSWilliam A. Kennington III #include <gtest/gtest.h> 4715c72f8SWilliam A. Kennington III #include <memory> 5*e04cb03bSWilliam A. Kennington III #include <optional> 6715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp> 765db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp> 80a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp> 90a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp> 100a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp> 1165db863eSWilliam A. Kennington III #include <string> 12715c72f8SWilliam A. Kennington III #include <systemd/sd-event.h> 130a816c5dSWilliam A. Kennington III #include <type_traits> 14cc6b12beSWilliam A. Kennington III #include <utility> 150a816c5dSWilliam A. Kennington III 160a816c5dSWilliam A. Kennington III namespace sdeventplus 170a816c5dSWilliam A. Kennington III { 180a816c5dSWilliam A. Kennington III namespace source 190a816c5dSWilliam A. Kennington III { 200a816c5dSWilliam A. Kennington III namespace 210a816c5dSWilliam A. Kennington III { 220a816c5dSWilliam A. Kennington III 2365db863eSWilliam A. Kennington III using testing::DoAll; 240a816c5dSWilliam A. Kennington III using testing::Return; 2548c42751SWilliam A. Kennington III using testing::SaveArg; 2665db863eSWilliam A. Kennington III using testing::SetArgPointee; 270a816c5dSWilliam A. Kennington III 28e3e1df0bSWilliam A. Kennington III using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>; 29e3e1df0bSWilliam A. Kennington III 300a816c5dSWilliam A. Kennington III class BaseImpl : public Base 310a816c5dSWilliam A. Kennington III { 320a816c5dSWilliam A. Kennington III public: 33715c72f8SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source) : Base(event, source) 340a816c5dSWilliam A. Kennington III { 350a816c5dSWilliam A. Kennington III } 36715c72f8SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source, std::false_type) : 37715c72f8SWilliam A. Kennington III Base(event, source, std::false_type()) 380a816c5dSWilliam A. Kennington III { 390a816c5dSWilliam A. Kennington III } 40e0f1d199SWilliam A. Kennington III 41e0f1d199SWilliam A. Kennington III using Base::get_prepare; 420a816c5dSWilliam A. Kennington III }; 430a816c5dSWilliam A. Kennington III 440a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test 450a816c5dSWilliam A. Kennington III { 460a816c5dSWilliam A. Kennington III protected: 470a816c5dSWilliam A. Kennington III testing::StrictMock<test::SdEventMock> mock; 48e3e1df0bSWilliam A. Kennington III sd_event_source* const expected_source = 49e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(1234); 50e3e1df0bSWilliam A. Kennington III sd_event* const expected_event = reinterpret_cast<sd_event*>(2345); 51e3e1df0bSWilliam A. Kennington III UniqueEvent event = make_event(expected_event); 52715c72f8SWilliam A. Kennington III 53e3e1df0bSWilliam A. Kennington III UniqueEvent make_event(sd_event* event) 54715c72f8SWilliam A. Kennington III { 55e3e1df0bSWilliam A. Kennington III auto deleter = [this, event](Event* e) { 56e3e1df0bSWilliam A. Kennington III EXPECT_CALL(this->mock, sd_event_unref(event)) 57715c72f8SWilliam A. Kennington III .WillOnce(Return(nullptr)); 58e3e1df0bSWilliam A. Kennington III delete e; 59e3e1df0bSWilliam A. Kennington III }; 60e3e1df0bSWilliam A. Kennington III return UniqueEvent(new Event(event, std::false_type(), &mock), deleter); 61e3e1df0bSWilliam A. Kennington III } 62e3e1df0bSWilliam A. Kennington III 63e3e1df0bSWilliam A. Kennington III // Using a unique_ptr to make sure we don't get any superfluous moves or 64e3e1df0bSWilliam A. Kennington III // copies. 65e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> make_base(const Event& event, 66e3e1df0bSWilliam A. Kennington III sd_event_source* source) 67e3e1df0bSWilliam A. Kennington III { 68e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(event.get())) 69e3e1df0bSWilliam A. Kennington III .WillOnce(Return(event.get())); 702d943eadSWilliam A. Kennington III void* userdata; 712d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_)) 722d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 73e3e1df0bSWilliam A. Kennington III auto ret = std::make_unique<BaseImpl>(event, source, std::false_type()); 742d943eadSWilliam A. Kennington III EXPECT_EQ(ret.get(), userdata); 75e3e1df0bSWilliam A. Kennington III EXPECT_EQ(source, ret->get()); 76e3e1df0bSWilliam A. Kennington III EXPECT_NE(&event, &ret->get_event()); 77e3e1df0bSWilliam A. Kennington III EXPECT_EQ(event.get(), ret->get_event().get()); 78e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(ret->get_prepare()); 79e3e1df0bSWilliam A. Kennington III return ret; 80e3e1df0bSWilliam A. Kennington III } 81e3e1df0bSWilliam A. Kennington III 82e0f1d199SWilliam A. Kennington III void set_prepare_placeholder(BaseImpl& base) 83e3e1df0bSWilliam A. Kennington III { 84e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_)) 85e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 86e3e1df0bSWilliam A. Kennington III base.set_prepare([](Base&) {}); 87e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(base.get_prepare()); 88e3e1df0bSWilliam A. Kennington III } 89e3e1df0bSWilliam A. Kennington III 90e3e1df0bSWilliam A. Kennington III void empty_base(BaseImpl&& other) 91e3e1df0bSWilliam A. Kennington III { 922d943eadSWilliam A. Kennington III void* userdata; 932d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(other.get(), testing::_)) 942d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 95e3e1df0bSWilliam A. Kennington III BaseImpl mover(std::move(other)); 962d943eadSWilliam A. Kennington III EXPECT_EQ(&mover, userdata); 97*e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get(), std::bad_optional_access); 98*e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get_event().get(), std::bad_optional_access); 99e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(other.get_prepare()); 100e3e1df0bSWilliam A. Kennington III 101e3e1df0bSWilliam A. Kennington III expect_base_destruct(mover.get_event(), mover.get()); 102e3e1df0bSWilliam A. Kennington III } 103e3e1df0bSWilliam A. Kennington III 104e3e1df0bSWilliam A. Kennington III void expect_base_destruct(const Event& event, sd_event_source* source) 105e3e1df0bSWilliam A. Kennington III { 106e3e1df0bSWilliam A. Kennington III { 107e3e1df0bSWilliam A. Kennington III testing::InSequence seq; 108e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(source, SD_EVENT_OFF)) 109e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 110e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(source)) 111e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 112e3e1df0bSWilliam A. Kennington III } 113e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_unref(event.get())) 114e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 115715c72f8SWilliam A. Kennington III } 1160a816c5dSWilliam A. Kennington III }; 1170a816c5dSWilliam A. Kennington III 1180a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseRef) 1190a816c5dSWilliam A. Kennington III { 120715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 121715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1220a816c5dSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 1230a816c5dSWilliam A. Kennington III .WillOnce(Return(expected_source)); 1242d943eadSWilliam A. Kennington III void* userdata; 1252d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1262d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 127715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source); 1282d943eadSWilliam A. Kennington III EXPECT_EQ(&source, userdata); 1294863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1304863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1314863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 132f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1330a816c5dSWilliam A. Kennington III 134e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 13565db863eSWilliam A. Kennington III } 1360a816c5dSWilliam A. Kennington III 1370a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef) 1380a816c5dSWilliam A. Kennington III { 139715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 140715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1412d943eadSWilliam A. Kennington III void* userdata; 1422d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1432d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 144715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source, std::false_type()); 1452d943eadSWilliam A. Kennington III EXPECT_EQ(&source, userdata); 1464863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1474863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1484863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 149f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1500a816c5dSWilliam A. Kennington III 151e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1527c24e057SWilliam A. Kennington III } 1537c24e057SWilliam A. Kennington III 154cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveConstruct) 155cc6b12beSWilliam A. Kennington III { 156e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 157e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 158cc6b12beSWilliam A. Kennington III 1592d943eadSWilliam A. Kennington III void* userdata; 1602d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1612d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 162e3e1df0bSWilliam A. Kennington III BaseImpl source2(std::move(*source1)); 1632d943eadSWilliam A. Kennington III EXPECT_EQ(&source2, userdata); 164*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get(), std::bad_optional_access); 165*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get_event().get(), std::bad_optional_access); 166e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 167cc6b12beSWilliam A. Kennington III EXPECT_EQ(expected_source, source2.get()); 168cc6b12beSWilliam A. Kennington III EXPECT_EQ(expected_event, source2.get_event().get()); 169cc6b12beSWilliam A. Kennington III EXPECT_TRUE(source2.get_prepare()); 170cc6b12beSWilliam A. Kennington III 171e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 172cc6b12beSWilliam A. Kennington III } 173cc6b12beSWilliam A. Kennington III 174cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignSelf) 175cc6b12beSWilliam A. Kennington III { 176e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 177e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 178cc6b12beSWilliam A. Kennington III 179e3e1df0bSWilliam A. Kennington III *source1 = std::move(*source1); 180e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source1->get()); 181e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source1->get_event().get()); 182e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source1->get_prepare()); 183cc6b12beSWilliam A. Kennington III 184e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 185cc6b12beSWilliam A. Kennington III } 186cc6b12beSWilliam A. Kennington III 187cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignEmpty) 188cc6b12beSWilliam A. Kennington III { 189e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 190e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 191cc6b12beSWilliam A. Kennington III 192e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source2 = make_base(*event, expected_source); 193e3e1df0bSWilliam A. Kennington III empty_base(std::move(*source2)); 194cc6b12beSWilliam A. Kennington III 195cc6b12beSWilliam A. Kennington III { 1962d943eadSWilliam A. Kennington III void* userdata; 1972d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 1982d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1992d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 200e3e1df0bSWilliam A. Kennington III *source2 = std::move(*source1); 2012d943eadSWilliam A. Kennington III EXPECT_EQ(source2.get(), userdata); 202cc6b12beSWilliam A. Kennington III } 203*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get(), std::bad_optional_access); 204*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get_event().get(), std::bad_optional_access); 205e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 206e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source2->get()); 207e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source2->get_event().get()); 208e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source2->get_prepare()); 209e3e1df0bSWilliam A. Kennington III 210e3e1df0bSWilliam A. Kennington III // Make sure source1 is deleted to ensure it isn't holding a reference 211e3e1df0bSWilliam A. Kennington III source1.reset(); 212e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 213cc6b12beSWilliam A. Kennington III } 214cc6b12beSWilliam A. Kennington III 215cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignExisting) 216cc6b12beSWilliam A. Kennington III { 217cc6b12beSWilliam A. Kennington III sd_event_source* const expected_source2 = 218e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(3456); 219e3e1df0bSWilliam A. Kennington III sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567); 220e3e1df0bSWilliam A. Kennington III 221e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 222e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 223e3e1df0bSWilliam A. Kennington III 224e3e1df0bSWilliam A. Kennington III UniqueEvent event2 = make_event(expected_event2); 225e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source2 = make_base(*event2, expected_source2); 226cc6b12beSWilliam A. Kennington III 227cc6b12beSWilliam A. Kennington III { 228e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event2, expected_source2); 2292d943eadSWilliam A. Kennington III void* userdata; 2302d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 2312d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 2322d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 233e3e1df0bSWilliam A. Kennington III *source2 = std::move(*source1); 2342d943eadSWilliam A. Kennington III EXPECT_EQ(source2.get(), userdata); 235cc6b12beSWilliam A. Kennington III } 236*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get(), std::bad_optional_access); 237*e04cb03bSWilliam A. Kennington III EXPECT_THROW(source1->get_event().get(), std::bad_optional_access); 238e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 239e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source2->get()); 240e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source2->get_event().get()); 241e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source2->get_prepare()); 242cc6b12beSWilliam A. Kennington III 243e3e1df0bSWilliam A. Kennington III // Make sure source1 is deleted to ensure it isn't holding a reference 244e3e1df0bSWilliam A. Kennington III source1.reset(); 245e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 246cc6b12beSWilliam A. Kennington III } 247cc6b12beSWilliam A. Kennington III 24865db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest 24965db863eSWilliam A. Kennington III { 25065db863eSWilliam A. Kennington III protected: 251e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> base = make_base(*event, expected_source); 25265db863eSWilliam A. Kennington III 253e3e1df0bSWilliam A. Kennington III void TearDown() 25465db863eSWilliam A. Kennington III { 255e3e1df0bSWilliam A. Kennington III expect_base_destruct(base->get_event(), base->get()); 256715c72f8SWilliam A. Kennington III base.reset(); 25765db863eSWilliam A. Kennington III } 25865db863eSWilliam A. Kennington III }; 25965db863eSWilliam A. Kennington III 26065db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionSuccess) 26165db863eSWilliam A. Kennington III { 26265db863eSWilliam A. Kennington III const char* expected = "test_desc"; 26365db863eSWilliam A. Kennington III EXPECT_CALL(mock, 26465db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 26565db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(expected), Return(0))); 26665db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 26765db863eSWilliam A. Kennington III EXPECT_EQ(expected, base->get_description()); 26865db863eSWilliam A. Kennington III } 26965db863eSWilliam A. Kennington III 27065db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionError) 27165db863eSWilliam A. Kennington III { 27265db863eSWilliam A. Kennington III EXPECT_CALL(mock, 27365db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 27465db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 27565db863eSWilliam A. Kennington III EXPECT_THROW(base->get_description(), SdEventError); 27665db863eSWilliam A. Kennington III } 27765db863eSWilliam A. Kennington III 27865db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionSuccess) 27965db863eSWilliam A. Kennington III { 28065db863eSWilliam A. Kennington III const char* expected = "test desc"; 28165db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 28265db863eSWilliam A. Kennington III EXPECT_CALL(mock, 28365db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 28465db863eSWilliam A. Kennington III .WillOnce(Return(0)); 28565db863eSWilliam A. Kennington III base->set_description(expected); 28665db863eSWilliam A. Kennington III } 28765db863eSWilliam A. Kennington III 28865db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionError) 28965db863eSWilliam A. Kennington III { 29065db863eSWilliam A. Kennington III const char* expected = "test desc"; 29165db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 29265db863eSWilliam A. Kennington III EXPECT_CALL(mock, 29365db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 29465db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 29565db863eSWilliam A. Kennington III EXPECT_THROW(base->set_description(expected), SdEventError); 29665db863eSWilliam A. Kennington III } 29765db863eSWilliam A. Kennington III 29848c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallback) 29948c42751SWilliam A. Kennington III { 30048c42751SWilliam A. Kennington III bool completed = false; 30148c42751SWilliam A. Kennington III Base::Callback callback = [&completed](Base&) { completed = true; }; 30248c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 30348c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 30448c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 30548c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 306f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 30748c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 30848c42751SWilliam A. Kennington III EXPECT_FALSE(completed); 30948c42751SWilliam A. Kennington III 31048c42751SWilliam A. Kennington III EXPECT_EQ(0, event_handler(nullptr, base.get())); 31148c42751SWilliam A. Kennington III EXPECT_TRUE(completed); 31248c42751SWilliam A. Kennington III } 31348c42751SWilliam A. Kennington III 31448c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallbackNoUserdata) 31548c42751SWilliam A. Kennington III { 31648c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 31748c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 31848c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 31948c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 32048c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 321f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 32248c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 32348c42751SWilliam A. Kennington III 32448c42751SWilliam A. Kennington III EXPECT_EQ(-EINVAL, event_handler(nullptr, nullptr)); 32548c42751SWilliam A. Kennington III } 32648c42751SWilliam A. Kennington III 32748c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareError) 32848c42751SWilliam A. Kennington III { 329feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 330feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 331651e87adSWilliam A. Kennington III base->set_prepare([](Base&) {}); 332feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 333feef68f7SWilliam A. Kennington III 33448c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 33548c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 33648c42751SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 33748c42751SWilliam A. Kennington III EXPECT_THROW(base->set_prepare(std::move(callback)), SdEventError); 338f5285c73SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 33948c42751SWilliam A. Kennington III EXPECT_TRUE(callback); 340feef68f7SWilliam A. Kennington III } 341feef68f7SWilliam A. Kennington III 342feef68f7SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareNull) 343feef68f7SWilliam A. Kennington III { 344feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 345feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 346651e87adSWilliam A. Kennington III base->set_prepare([](Base&) {}); 347feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 348feef68f7SWilliam A. Kennington III 349feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, nullptr)) 350feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 351feef68f7SWilliam A. Kennington III base->set_prepare(nullptr); 352feef68f7SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 35348c42751SWilliam A. Kennington III } 35448c42751SWilliam A. Kennington III 35565db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingSuccess) 35665db863eSWilliam A. Kennington III { 35765db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 35865db863eSWilliam A. Kennington III .WillOnce(Return(0)); 3598fd0cd4cSWilliam A. Kennington III EXPECT_FALSE(base->get_pending()); 36065db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36165db863eSWilliam A. Kennington III .WillOnce(Return(4)); 3628fd0cd4cSWilliam A. Kennington III EXPECT_TRUE(base->get_pending()); 36365db863eSWilliam A. Kennington III } 36465db863eSWilliam A. Kennington III 36565db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingError) 36665db863eSWilliam A. Kennington III { 36765db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36865db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 36965db863eSWilliam A. Kennington III EXPECT_THROW(base->get_pending(), SdEventError); 37065db863eSWilliam A. Kennington III } 37165db863eSWilliam A. Kennington III 37265db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPrioritySuccess) 37365db863eSWilliam A. Kennington III { 37465db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 37565db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(1024), Return(0))); 37665db863eSWilliam A. Kennington III EXPECT_EQ(1024, base->get_priority()); 37765db863eSWilliam A. Kennington III } 37865db863eSWilliam A. Kennington III 37965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPriorityError) 38065db863eSWilliam A. Kennington III { 38165db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 38265db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 38365db863eSWilliam A. Kennington III EXPECT_THROW(base->get_priority(), SdEventError); 38465db863eSWilliam A. Kennington III } 38565db863eSWilliam A. Kennington III 38665db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrioritySuccess) 38765db863eSWilliam A. Kennington III { 38865db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 38965db863eSWilliam A. Kennington III .WillOnce(Return(0)); 39065db863eSWilliam A. Kennington III base->set_priority(1024); 39165db863eSWilliam A. Kennington III } 39265db863eSWilliam A. Kennington III 39365db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPriorityError) 39465db863eSWilliam A. Kennington III { 39565db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 39665db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 39765db863eSWilliam A. Kennington III EXPECT_THROW(base->set_priority(1024), SdEventError); 39865db863eSWilliam A. Kennington III } 39965db863eSWilliam A. Kennington III 40065db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledSuccess) 40165db863eSWilliam A. Kennington III { 40265db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 40365db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(SD_EVENT_ON), Return(0))); 4048fd0cd4cSWilliam A. Kennington III EXPECT_EQ(Enabled::On, base->get_enabled()); 40565db863eSWilliam A. Kennington III } 40665db863eSWilliam A. Kennington III 40765db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledError) 40865db863eSWilliam A. Kennington III { 40965db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 41065db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 41165db863eSWilliam A. Kennington III EXPECT_THROW(base->get_enabled(), SdEventError); 41265db863eSWilliam A. Kennington III } 41365db863eSWilliam A. Kennington III 41465db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledSuccess) 41565db863eSWilliam A. Kennington III { 41665db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, SD_EVENT_ON)) 41765db863eSWilliam A. Kennington III .WillOnce(Return(0)); 4188fd0cd4cSWilliam A. Kennington III base->set_enabled(Enabled::On); 41965db863eSWilliam A. Kennington III } 42065db863eSWilliam A. Kennington III 42165db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledError) 42265db863eSWilliam A. Kennington III { 4238fd0cd4cSWilliam A. Kennington III EXPECT_CALL(mock, 4248fd0cd4cSWilliam A. Kennington III sd_event_source_set_enabled(expected_source, SD_EVENT_ONESHOT)) 42565db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 4268fd0cd4cSWilliam A. Kennington III EXPECT_THROW(base->set_enabled(Enabled::OneShot), SdEventError); 42765db863eSWilliam A. Kennington III } 4280a816c5dSWilliam A. Kennington III 4290a816c5dSWilliam A. Kennington III } // namespace 4300a816c5dSWilliam A. Kennington III } // namespace source 4310a816c5dSWilliam A. Kennington III } // namespace sdeventplus 432