148c42751SWilliam A. Kennington III #include <cerrno> 25320b1f5SWilliam A. Kennington III #include <functional> 30a816c5dSWilliam A. Kennington III #include <gmock/gmock.h> 40a816c5dSWilliam A. Kennington III #include <gtest/gtest.h> 5715c72f8SWilliam A. Kennington III #include <memory> 6e04cb03bSWilliam A. Kennington III #include <optional> 7715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp> 865db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp> 90a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp> 100a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp> 110a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp> 125320b1f5SWilliam A. Kennington III #include <sdeventplus/types.hpp> 1365db863eSWilliam A. Kennington III #include <string> 14715c72f8SWilliam A. Kennington III #include <systemd/sd-event.h> 155320b1f5SWilliam A. Kennington III #include <tuple> 160a816c5dSWilliam A. Kennington III #include <type_traits> 17cc6b12beSWilliam A. Kennington III #include <utility> 180a816c5dSWilliam A. Kennington III 190a816c5dSWilliam A. Kennington III namespace sdeventplus 200a816c5dSWilliam A. Kennington III { 210a816c5dSWilliam A. Kennington III namespace source 220a816c5dSWilliam A. Kennington III { 230a816c5dSWilliam A. Kennington III namespace 240a816c5dSWilliam A. Kennington III { 250a816c5dSWilliam A. Kennington III 2665db863eSWilliam A. Kennington III using testing::DoAll; 270a816c5dSWilliam A. Kennington III using testing::Return; 2848c42751SWilliam A. Kennington III using testing::SaveArg; 2965db863eSWilliam A. Kennington III using testing::SetArgPointee; 300a816c5dSWilliam A. Kennington III 31e3e1df0bSWilliam A. Kennington III using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>; 32e3e1df0bSWilliam A. Kennington III 335320b1f5SWilliam A. Kennington III class BaseImplData; 345320b1f5SWilliam A. Kennington III 350a816c5dSWilliam A. Kennington III class BaseImpl : public Base 360a816c5dSWilliam A. Kennington III { 370a816c5dSWilliam A. Kennington III public: 385320b1f5SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source, std::false_type); 395320b1f5SWilliam A. Kennington III 405320b1f5SWilliam A. Kennington III BaseImpl(const BaseImpl& other, sdeventplus::internal::NoOwn) : 415320b1f5SWilliam A. Kennington III Base(other, sdeventplus::internal::NoOwn()) 420a816c5dSWilliam A. Kennington III { 430a816c5dSWilliam A. Kennington III } 44e0f1d199SWilliam A. Kennington III 45e0f1d199SWilliam A. Kennington III using Base::get_prepare; 460a816c5dSWilliam A. Kennington III }; 470a816c5dSWilliam A. Kennington III 485320b1f5SWilliam A. Kennington III class BaseImplData : public BaseImpl, public detail::BaseData 495320b1f5SWilliam A. Kennington III { 505320b1f5SWilliam A. Kennington III public: 515320b1f5SWilliam A. Kennington III BaseImplData(const BaseImpl& base) : 525320b1f5SWilliam A. Kennington III BaseImpl(base, sdeventplus::internal::NoOwn()), BaseData(base) 535320b1f5SWilliam A. Kennington III { 545320b1f5SWilliam A. Kennington III } 555320b1f5SWilliam A. Kennington III }; 565320b1f5SWilliam A. Kennington III 575320b1f5SWilliam A. Kennington III BaseImpl::BaseImpl(const Event& event, sd_event_source* source, 585320b1f5SWilliam A. Kennington III std::false_type) : 595320b1f5SWilliam A. Kennington III Base(event, source, std::false_type()) 605320b1f5SWilliam A. Kennington III { 615320b1f5SWilliam A. Kennington III set_userdata(std::make_unique<BaseImplData>(*this)); 625320b1f5SWilliam A. Kennington III } 635320b1f5SWilliam A. Kennington III 640a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test 650a816c5dSWilliam A. Kennington III { 660a816c5dSWilliam A. Kennington III protected: 670a816c5dSWilliam A. Kennington III testing::StrictMock<test::SdEventMock> mock; 68e3e1df0bSWilliam A. Kennington III sd_event_source* const expected_source = 69e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(1234); 705320b1f5SWilliam A. Kennington III sd_event_source* const expected_source2 = 715320b1f5SWilliam A. Kennington III reinterpret_cast<sd_event_source*>(3456); 72e3e1df0bSWilliam A. Kennington III sd_event* const expected_event = reinterpret_cast<sd_event*>(2345); 735320b1f5SWilliam A. Kennington III sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567); 745320b1f5SWilliam A. Kennington III 75e3e1df0bSWilliam A. Kennington III UniqueEvent event = make_event(expected_event); 76715c72f8SWilliam A. Kennington III 77e3e1df0bSWilliam A. Kennington III UniqueEvent make_event(sd_event* event) 78715c72f8SWilliam A. Kennington III { 79e3e1df0bSWilliam A. Kennington III auto deleter = [this, event](Event* e) { 80e3e1df0bSWilliam A. Kennington III EXPECT_CALL(this->mock, sd_event_unref(event)) 81715c72f8SWilliam A. Kennington III .WillOnce(Return(nullptr)); 82e3e1df0bSWilliam A. Kennington III delete e; 83e3e1df0bSWilliam A. Kennington III }; 84e3e1df0bSWilliam A. Kennington III return UniqueEvent(new Event(event, std::false_type(), &mock), deleter); 85e3e1df0bSWilliam A. Kennington III } 86e3e1df0bSWilliam A. Kennington III 87e3e1df0bSWilliam A. Kennington III // Using a unique_ptr to make sure we don't get any superfluous moves or 88e3e1df0bSWilliam A. Kennington III // copies. 895320b1f5SWilliam A. Kennington III std::tuple<std::unique_ptr<BaseImpl>, std::function<void()>> 905320b1f5SWilliam A. Kennington III make_base(const Event& event, sd_event_source* source) 91e3e1df0bSWilliam A. Kennington III { 92e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(event.get())) 93e3e1df0bSWilliam A. Kennington III .WillOnce(Return(event.get())); 945320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 952d943eadSWilliam A. Kennington III void* userdata; 965320b1f5SWilliam A. Kennington III { 975320b1f5SWilliam A. Kennington III testing::InSequence seq; 985320b1f5SWilliam A. Kennington III EXPECT_CALL( 995320b1f5SWilliam A. Kennington III mock, sd_event_source_set_destroy_callback(source, testing::_)) 1005320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1012d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_)) 1022d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 1035320b1f5SWilliam A. Kennington III } 104e3e1df0bSWilliam A. Kennington III auto ret = std::make_unique<BaseImpl>(event, source, std::false_type()); 1055320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(source)) 1065320b1f5SWilliam A. Kennington III .WillRepeatedly(Return(userdata)); 1075320b1f5SWilliam A. Kennington III EXPECT_NE(ret.get(), userdata); 108e3e1df0bSWilliam A. Kennington III EXPECT_EQ(source, ret->get()); 109e3e1df0bSWilliam A. Kennington III EXPECT_NE(&event, &ret->get_event()); 110e3e1df0bSWilliam A. Kennington III EXPECT_EQ(event.get(), ret->get_event().get()); 111e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(ret->get_prepare()); 1125320b1f5SWilliam A. Kennington III return {std::move(ret), std::bind(destroy, userdata)}; 113e3e1df0bSWilliam A. Kennington III } 114e3e1df0bSWilliam A. Kennington III 115e0f1d199SWilliam A. Kennington III void set_prepare_placeholder(BaseImpl& base) 116e3e1df0bSWilliam A. Kennington III { 117e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_)) 118e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 119e3e1df0bSWilliam A. Kennington III base.set_prepare([](Base&) {}); 120e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(base.get_prepare()); 121e3e1df0bSWilliam A. Kennington III } 122e3e1df0bSWilliam A. Kennington III 123e3e1df0bSWilliam A. Kennington III void empty_base(BaseImpl&& other) 124e3e1df0bSWilliam A. Kennington III { 125e3e1df0bSWilliam A. Kennington III BaseImpl mover(std::move(other)); 126e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get(), std::bad_optional_access); 127e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get_event().get(), std::bad_optional_access); 1285320b1f5SWilliam A. Kennington III EXPECT_THROW(other.get_prepare(), std::bad_optional_access); 129e3e1df0bSWilliam A. Kennington III 130e3e1df0bSWilliam A. Kennington III expect_base_destruct(mover.get_event(), mover.get()); 131e3e1df0bSWilliam A. Kennington III } 132e3e1df0bSWilliam A. Kennington III 133e3e1df0bSWilliam A. Kennington III void expect_base_destruct(const Event& event, sd_event_source* source) 134e3e1df0bSWilliam A. Kennington III { 135e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(source)) 136e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 137e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_unref(event.get())) 138e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 139715c72f8SWilliam A. Kennington III } 1400a816c5dSWilliam A. Kennington III }; 1410a816c5dSWilliam A. Kennington III 1425320b1f5SWilliam A. Kennington III TEST_F(BaseTest, NewBaseFail) 1435320b1f5SWilliam A. Kennington III { 1445320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 1455320b1f5SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1465320b1f5SWilliam A. Kennington III EXPECT_CALL( 1475320b1f5SWilliam A. Kennington III mock, sd_event_source_set_destroy_callback(expected_source, testing::_)) 1485320b1f5SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 1495320b1f5SWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1505320b1f5SWilliam A. Kennington III EXPECT_THROW(BaseImpl(*event, expected_source, std::false_type()), 1515320b1f5SWilliam A. Kennington III SdEventError); 1525320b1f5SWilliam A. Kennington III } 1535320b1f5SWilliam A. Kennington III 1540a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef) 1550a816c5dSWilliam A. Kennington III { 156715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 157715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1585320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 1592d943eadSWilliam A. Kennington III void* userdata; 1605320b1f5SWilliam A. Kennington III { 1615320b1f5SWilliam A. Kennington III testing::InSequence seq; 1625320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_destroy_callback(expected_source, 1635320b1f5SWilliam A. Kennington III testing::_)) 1645320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1655320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, 1665320b1f5SWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1672d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 1685320b1f5SWilliam A. Kennington III } 169715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source, std::false_type()); 1705320b1f5SWilliam A. Kennington III EXPECT_NE(&source, userdata); 1714863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1724863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1734863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 1745320b1f5SWilliam A. Kennington III 1755320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(expected_source)) 1765320b1f5SWilliam A. Kennington III .WillOnce(Return(userdata)); 177f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1780a816c5dSWilliam A. Kennington III 179e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1805320b1f5SWilliam A. Kennington III destroy(userdata); 1817c24e057SWilliam A. Kennington III } 1827c24e057SWilliam A. Kennington III 1835320b1f5SWilliam A. Kennington III TEST_F(BaseTest, UserdataOutlives) 184cc6b12beSWilliam A. Kennington III { 1855320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 1865320b1f5SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1875320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 1882d943eadSWilliam A. Kennington III void* userdata; 189cc6b12beSWilliam A. Kennington III { 1905320b1f5SWilliam A. Kennington III testing::InSequence seq; 1915320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_destroy_callback(expected_source, 1925320b1f5SWilliam A. Kennington III testing::_)) 1935320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1942d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 1952d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1962d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 197cc6b12beSWilliam A. Kennington III } 1985320b1f5SWilliam A. Kennington III auto source = 1995320b1f5SWilliam A. Kennington III std::make_unique<BaseImpl>(*event, expected_source, std::false_type()); 2005320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(expected_source)) 2015320b1f5SWilliam A. Kennington III .WillRepeatedly(Return(userdata)); 2025320b1f5SWilliam A. Kennington III EXPECT_FALSE(source->get_prepare()); 203e3e1df0bSWilliam A. Kennington III 204e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 2055320b1f5SWilliam A. Kennington III source.reset(); 2065320b1f5SWilliam A. Kennington III EXPECT_FALSE(reinterpret_cast<BaseImpl*>(userdata)->get_prepare()); 2075320b1f5SWilliam A. Kennington III destroy(userdata); 208cc6b12beSWilliam A. Kennington III } 209cc6b12beSWilliam A. Kennington III 210*56dc78baSWilliam A. Kennington III TEST_F(BaseTest, CopyCorrectness) 211*56dc78baSWilliam A. Kennington III { 212*56dc78baSWilliam A. Kennington III std::unique_ptr<BaseImpl> base1, base2; 213*56dc78baSWilliam A. Kennington III std::function<void()> destroy; 214*56dc78baSWilliam A. Kennington III std::tie(base1, destroy) = make_base(*event, expected_source); 215*56dc78baSWilliam A. Kennington III set_prepare_placeholder(*base1); 216*56dc78baSWilliam A. Kennington III EXPECT_TRUE(base1->get_prepare()); 217*56dc78baSWilliam A. Kennington III 218*56dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 219*56dc78baSWilliam A. Kennington III .WillOnce(Return(expected_event)); 220*56dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 221*56dc78baSWilliam A. Kennington III .WillOnce(Return(expected_source)); 222*56dc78baSWilliam A. Kennington III base2 = std::make_unique<BaseImpl>(*base1); 223*56dc78baSWilliam A. Kennington III EXPECT_EQ(&base1->get_prepare(), &base2->get_prepare()); 224*56dc78baSWilliam A. Kennington III 225*56dc78baSWilliam A. Kennington III empty_base(std::move(*base1)); 226*56dc78baSWilliam A. Kennington III EXPECT_THROW(base1->get_prepare(), std::bad_optional_access); 227*56dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 228*56dc78baSWilliam A. Kennington III .WillOnce(Return(expected_event)); 229*56dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 230*56dc78baSWilliam A. Kennington III .WillOnce(Return(expected_source)); 231*56dc78baSWilliam A. Kennington III *base1 = *base2; 232*56dc78baSWilliam A. Kennington III EXPECT_EQ(&base1->get_prepare(), &base2->get_prepare()); 233*56dc78baSWilliam A. Kennington III 234*56dc78baSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 235*56dc78baSWilliam A. Kennington III base2.reset(); 236*56dc78baSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 237*56dc78baSWilliam A. Kennington III base1.reset(); 238*56dc78baSWilliam A. Kennington III destroy(); 239*56dc78baSWilliam A. Kennington III } 240*56dc78baSWilliam A. Kennington III 24165db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest 24265db863eSWilliam A. Kennington III { 24365db863eSWilliam A. Kennington III protected: 2445320b1f5SWilliam A. Kennington III std::unique_ptr<BaseImpl> base; 2455320b1f5SWilliam A. Kennington III std::function<void()> destroy; 2465320b1f5SWilliam A. Kennington III 2475320b1f5SWilliam A. Kennington III void SetUp() 2485320b1f5SWilliam A. Kennington III { 2495320b1f5SWilliam A. Kennington III std::tie(base, destroy) = make_base(*event, expected_source); 2505320b1f5SWilliam A. Kennington III } 25165db863eSWilliam A. Kennington III 252e3e1df0bSWilliam A. Kennington III void TearDown() 25365db863eSWilliam A. Kennington III { 254e3e1df0bSWilliam A. Kennington III expect_base_destruct(base->get_event(), base->get()); 255715c72f8SWilliam A. Kennington III base.reset(); 2565320b1f5SWilliam A. Kennington III destroy(); 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