1*a8c11e3cSPatrick Williams #include <systemd/sd-event.h> 2*a8c11e3cSPatrick Williams 3715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp> 465db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp> 50a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp> 60a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp> 70a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp> 85320b1f5SWilliam A. Kennington III #include <sdeventplus/types.hpp> 9*a8c11e3cSPatrick Williams 10*a8c11e3cSPatrick Williams #include <cerrno> 11*a8c11e3cSPatrick Williams #include <functional> 12*a8c11e3cSPatrick Williams #include <memory> 13*a8c11e3cSPatrick Williams #include <optional> 1465db863eSWilliam A. Kennington III #include <string> 155320b1f5SWilliam A. Kennington III #include <tuple> 160a816c5dSWilliam A. Kennington III #include <type_traits> 17cc6b12beSWilliam A. Kennington III #include <utility> 180a816c5dSWilliam A. Kennington III 19*a8c11e3cSPatrick Williams #include <gmock/gmock.h> 20*a8c11e3cSPatrick Williams #include <gtest/gtest.h> 21*a8c11e3cSPatrick Williams 220a816c5dSWilliam A. Kennington III namespace sdeventplus 230a816c5dSWilliam A. Kennington III { 240a816c5dSWilliam A. Kennington III namespace source 250a816c5dSWilliam A. Kennington III { 260a816c5dSWilliam A. Kennington III namespace 270a816c5dSWilliam A. Kennington III { 280a816c5dSWilliam A. Kennington III 2965db863eSWilliam A. Kennington III using testing::DoAll; 300a816c5dSWilliam A. Kennington III using testing::Return; 3148c42751SWilliam A. Kennington III using testing::SaveArg; 3265db863eSWilliam A. Kennington III using testing::SetArgPointee; 330a816c5dSWilliam A. Kennington III 34e3e1df0bSWilliam A. Kennington III using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>; 35e3e1df0bSWilliam A. Kennington III 365320b1f5SWilliam A. Kennington III class BaseImplData; 375320b1f5SWilliam A. Kennington III 380a816c5dSWilliam A. Kennington III class BaseImpl : public Base 390a816c5dSWilliam A. Kennington III { 400a816c5dSWilliam A. Kennington III public: 415320b1f5SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source, std::false_type); 425320b1f5SWilliam A. Kennington III 435320b1f5SWilliam A. Kennington III BaseImpl(const BaseImpl& other, sdeventplus::internal::NoOwn) : 445320b1f5SWilliam A. Kennington III Base(other, sdeventplus::internal::NoOwn()) 45*a8c11e3cSPatrick Williams {} 46e0f1d199SWilliam A. Kennington III 47e0f1d199SWilliam A. Kennington III using Base::get_prepare; 480a816c5dSWilliam A. Kennington III }; 490a816c5dSWilliam A. Kennington III 505320b1f5SWilliam A. Kennington III class BaseImplData : public BaseImpl, public detail::BaseData 515320b1f5SWilliam A. Kennington III { 525320b1f5SWilliam A. Kennington III public: 535320b1f5SWilliam A. Kennington III BaseImplData(const BaseImpl& base) : 545320b1f5SWilliam A. Kennington III BaseImpl(base, sdeventplus::internal::NoOwn()), BaseData(base) 55*a8c11e3cSPatrick Williams {} 565320b1f5SWilliam A. Kennington III }; 575320b1f5SWilliam A. Kennington III 585320b1f5SWilliam A. Kennington III BaseImpl::BaseImpl(const Event& event, sd_event_source* source, 595320b1f5SWilliam A. Kennington III std::false_type) : 605320b1f5SWilliam A. Kennington III Base(event, source, std::false_type()) 615320b1f5SWilliam A. Kennington III { 625320b1f5SWilliam A. Kennington III set_userdata(std::make_unique<BaseImplData>(*this)); 635320b1f5SWilliam A. Kennington III } 645320b1f5SWilliam A. Kennington III 650a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test 660a816c5dSWilliam A. Kennington III { 670a816c5dSWilliam A. Kennington III protected: 680a816c5dSWilliam A. Kennington III testing::StrictMock<test::SdEventMock> mock; 69e3e1df0bSWilliam A. Kennington III sd_event_source* const expected_source = 70e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(1234); 715320b1f5SWilliam A. Kennington III sd_event_source* const expected_source2 = 725320b1f5SWilliam A. Kennington III reinterpret_cast<sd_event_source*>(3456); 73e3e1df0bSWilliam A. Kennington III sd_event* const expected_event = reinterpret_cast<sd_event*>(2345); 745320b1f5SWilliam A. Kennington III sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567); 755320b1f5SWilliam A. Kennington III 76e3e1df0bSWilliam A. Kennington III UniqueEvent event = make_event(expected_event); 77715c72f8SWilliam A. Kennington III 78e3e1df0bSWilliam A. Kennington III UniqueEvent make_event(sd_event* event) 79715c72f8SWilliam A. Kennington III { 80e3e1df0bSWilliam A. Kennington III auto deleter = [this, event](Event* e) { 81e3e1df0bSWilliam A. Kennington III EXPECT_CALL(this->mock, sd_event_unref(event)) 82715c72f8SWilliam A. Kennington III .WillOnce(Return(nullptr)); 83e3e1df0bSWilliam A. Kennington III delete e; 84e3e1df0bSWilliam A. Kennington III }; 85e3e1df0bSWilliam A. Kennington III return UniqueEvent(new Event(event, std::false_type(), &mock), deleter); 86e3e1df0bSWilliam A. Kennington III } 87e3e1df0bSWilliam A. Kennington III 88e3e1df0bSWilliam A. Kennington III // Using a unique_ptr to make sure we don't get any superfluous moves or 89e3e1df0bSWilliam A. Kennington III // copies. 905320b1f5SWilliam A. Kennington III std::tuple<std::unique_ptr<BaseImpl>, std::function<void()>> 915320b1f5SWilliam A. Kennington III make_base(const Event& event, sd_event_source* source) 92e3e1df0bSWilliam A. Kennington III { 93e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(event.get())) 94e3e1df0bSWilliam A. Kennington III .WillOnce(Return(event.get())); 955320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 962d943eadSWilliam A. Kennington III void* userdata; 975320b1f5SWilliam A. Kennington III { 985320b1f5SWilliam A. Kennington III testing::InSequence seq; 995320b1f5SWilliam A. Kennington III EXPECT_CALL( 1005320b1f5SWilliam A. Kennington III mock, sd_event_source_set_destroy_callback(source, testing::_)) 1015320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1022d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_)) 1032d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 1045320b1f5SWilliam A. Kennington III } 105e3e1df0bSWilliam A. Kennington III auto ret = std::make_unique<BaseImpl>(event, source, std::false_type()); 1065320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(source)) 1075320b1f5SWilliam A. Kennington III .WillRepeatedly(Return(userdata)); 1085320b1f5SWilliam A. Kennington III EXPECT_NE(ret.get(), userdata); 109e3e1df0bSWilliam A. Kennington III EXPECT_EQ(source, ret->get()); 110e3e1df0bSWilliam A. Kennington III EXPECT_NE(&event, &ret->get_event()); 111e3e1df0bSWilliam A. Kennington III EXPECT_EQ(event.get(), ret->get_event().get()); 112e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(ret->get_prepare()); 1135320b1f5SWilliam A. Kennington III return {std::move(ret), std::bind(destroy, userdata)}; 114e3e1df0bSWilliam A. Kennington III } 115e3e1df0bSWilliam A. Kennington III 116e0f1d199SWilliam A. Kennington III void set_prepare_placeholder(BaseImpl& base) 117e3e1df0bSWilliam A. Kennington III { 118e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_)) 119e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 120e3e1df0bSWilliam A. Kennington III base.set_prepare([](Base&) {}); 121e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(base.get_prepare()); 122e3e1df0bSWilliam A. Kennington III } 123e3e1df0bSWilliam A. Kennington III 124e3e1df0bSWilliam A. Kennington III void empty_base(BaseImpl&& other) 125e3e1df0bSWilliam A. Kennington III { 126e3e1df0bSWilliam A. Kennington III BaseImpl mover(std::move(other)); 127e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get(), std::bad_optional_access); 128e04cb03bSWilliam A. Kennington III EXPECT_THROW(other.get_event().get(), std::bad_optional_access); 1295320b1f5SWilliam A. Kennington III EXPECT_THROW(other.get_prepare(), std::bad_optional_access); 130e3e1df0bSWilliam A. Kennington III 131e3e1df0bSWilliam A. Kennington III expect_base_destruct(mover.get_event(), mover.get()); 132e3e1df0bSWilliam A. Kennington III } 133e3e1df0bSWilliam A. Kennington III 134e3e1df0bSWilliam A. Kennington III void expect_base_destruct(const Event& event, sd_event_source* source) 135e3e1df0bSWilliam A. Kennington III { 136e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(source)) 137e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 138e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_unref(event.get())) 139e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 140715c72f8SWilliam A. Kennington III } 1410a816c5dSWilliam A. Kennington III }; 1420a816c5dSWilliam A. Kennington III 1435320b1f5SWilliam A. Kennington III TEST_F(BaseTest, NewBaseFail) 1445320b1f5SWilliam A. Kennington III { 1455320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 1465320b1f5SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1475320b1f5SWilliam A. Kennington III EXPECT_CALL( 1485320b1f5SWilliam A. Kennington III mock, sd_event_source_set_destroy_callback(expected_source, testing::_)) 1495320b1f5SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 1505320b1f5SWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1515320b1f5SWilliam A. Kennington III EXPECT_THROW(BaseImpl(*event, expected_source, std::false_type()), 1525320b1f5SWilliam A. Kennington III SdEventError); 1535320b1f5SWilliam A. Kennington III } 1545320b1f5SWilliam A. Kennington III 1550a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef) 1560a816c5dSWilliam A. Kennington III { 157715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 158715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1595320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 1602d943eadSWilliam A. Kennington III void* userdata; 1615320b1f5SWilliam A. Kennington III { 1625320b1f5SWilliam A. Kennington III testing::InSequence seq; 1635320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_destroy_callback(expected_source, 1645320b1f5SWilliam A. Kennington III testing::_)) 1655320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1665320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, 1675320b1f5SWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1682d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 1695320b1f5SWilliam A. Kennington III } 170715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source, std::false_type()); 1715320b1f5SWilliam A. Kennington III EXPECT_NE(&source, userdata); 1724863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1734863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1744863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 1755320b1f5SWilliam A. Kennington III 1765320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(expected_source)) 1775320b1f5SWilliam A. Kennington III .WillOnce(Return(userdata)); 178f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1790a816c5dSWilliam A. Kennington III 180e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1815320b1f5SWilliam A. Kennington III destroy(userdata); 1827c24e057SWilliam A. Kennington III } 1837c24e057SWilliam A. Kennington III 1845320b1f5SWilliam A. Kennington III TEST_F(BaseTest, UserdataOutlives) 185cc6b12beSWilliam A. Kennington III { 1865320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 1875320b1f5SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1885320b1f5SWilliam A. Kennington III sd_event_destroy_t destroy; 1892d943eadSWilliam A. Kennington III void* userdata; 190cc6b12beSWilliam A. Kennington III { 1915320b1f5SWilliam A. Kennington III testing::InSequence seq; 1925320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_destroy_callback(expected_source, 1935320b1f5SWilliam A. Kennington III testing::_)) 1945320b1f5SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&destroy), Return(0))); 1952d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 1962d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1972d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 198cc6b12beSWilliam A. Kennington III } 199*a8c11e3cSPatrick Williams auto source = std::make_unique<BaseImpl>(*event, expected_source, 200*a8c11e3cSPatrick Williams std::false_type()); 2015320b1f5SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_userdata(expected_source)) 2025320b1f5SWilliam A. Kennington III .WillRepeatedly(Return(userdata)); 2035320b1f5SWilliam A. Kennington III EXPECT_FALSE(source->get_prepare()); 204e3e1df0bSWilliam A. Kennington III 205e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 2065320b1f5SWilliam A. Kennington III source.reset(); 2075320b1f5SWilliam A. Kennington III EXPECT_FALSE(reinterpret_cast<BaseImpl*>(userdata)->get_prepare()); 2085320b1f5SWilliam A. Kennington III destroy(userdata); 209cc6b12beSWilliam A. Kennington III } 210cc6b12beSWilliam A. Kennington III 21156dc78baSWilliam A. Kennington III TEST_F(BaseTest, CopyCorrectness) 21256dc78baSWilliam A. Kennington III { 21356dc78baSWilliam A. Kennington III std::unique_ptr<BaseImpl> base1, base2; 21456dc78baSWilliam A. Kennington III std::function<void()> destroy; 21556dc78baSWilliam A. Kennington III std::tie(base1, destroy) = make_base(*event, expected_source); 21656dc78baSWilliam A. Kennington III set_prepare_placeholder(*base1); 21756dc78baSWilliam A. Kennington III EXPECT_TRUE(base1->get_prepare()); 21856dc78baSWilliam A. Kennington III 21956dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 22056dc78baSWilliam A. Kennington III .WillOnce(Return(expected_event)); 22156dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 22256dc78baSWilliam A. Kennington III .WillOnce(Return(expected_source)); 22356dc78baSWilliam A. Kennington III base2 = std::make_unique<BaseImpl>(*base1); 22456dc78baSWilliam A. Kennington III EXPECT_EQ(&base1->get_prepare(), &base2->get_prepare()); 22556dc78baSWilliam A. Kennington III 22656dc78baSWilliam A. Kennington III empty_base(std::move(*base1)); 22756dc78baSWilliam A. Kennington III EXPECT_THROW(base1->get_prepare(), std::bad_optional_access); 22856dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 22956dc78baSWilliam A. Kennington III .WillOnce(Return(expected_event)); 23056dc78baSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 23156dc78baSWilliam A. Kennington III .WillOnce(Return(expected_source)); 23256dc78baSWilliam A. Kennington III *base1 = *base2; 23356dc78baSWilliam A. Kennington III EXPECT_EQ(&base1->get_prepare(), &base2->get_prepare()); 23456dc78baSWilliam A. Kennington III 23556dc78baSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 23656dc78baSWilliam A. Kennington III base2.reset(); 23756dc78baSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 23856dc78baSWilliam A. Kennington III base1.reset(); 23956dc78baSWilliam A. Kennington III destroy(); 24056dc78baSWilliam A. Kennington III } 24156dc78baSWilliam A. Kennington III 24265db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest 24365db863eSWilliam A. Kennington III { 24465db863eSWilliam A. Kennington III protected: 2455320b1f5SWilliam A. Kennington III std::unique_ptr<BaseImpl> base; 2465320b1f5SWilliam A. Kennington III std::function<void()> destroy; 2475320b1f5SWilliam A. Kennington III 2485320b1f5SWilliam A. Kennington III void SetUp() 2495320b1f5SWilliam A. Kennington III { 2505320b1f5SWilliam A. Kennington III std::tie(base, destroy) = make_base(*event, expected_source); 2515320b1f5SWilliam A. Kennington III } 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(); 2575320b1f5SWilliam A. Kennington III destroy(); 25865db863eSWilliam A. Kennington III } 25965db863eSWilliam A. Kennington III }; 26065db863eSWilliam A. Kennington III 26165db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionSuccess) 26265db863eSWilliam A. Kennington III { 26365db863eSWilliam A. Kennington III const char* expected = "test_desc"; 26465db863eSWilliam A. Kennington III EXPECT_CALL(mock, 26565db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 26665db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(expected), Return(0))); 26765db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 26865db863eSWilliam A. Kennington III EXPECT_EQ(expected, base->get_description()); 26965db863eSWilliam A. Kennington III } 27065db863eSWilliam A. Kennington III 27165db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionError) 27265db863eSWilliam A. Kennington III { 27365db863eSWilliam A. Kennington III EXPECT_CALL(mock, 27465db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 27565db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 27665db863eSWilliam A. Kennington III EXPECT_THROW(base->get_description(), SdEventError); 27765db863eSWilliam A. Kennington III } 27865db863eSWilliam A. Kennington III 27965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionSuccess) 28065db863eSWilliam A. Kennington III { 28165db863eSWilliam A. Kennington III const char* expected = "test desc"; 28265db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 28365db863eSWilliam A. Kennington III EXPECT_CALL(mock, 28465db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 28565db863eSWilliam A. Kennington III .WillOnce(Return(0)); 28665db863eSWilliam A. Kennington III base->set_description(expected); 28765db863eSWilliam A. Kennington III } 28865db863eSWilliam A. Kennington III 28965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionError) 29065db863eSWilliam A. Kennington III { 29165db863eSWilliam A. Kennington III const char* expected = "test desc"; 29265db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 29365db863eSWilliam A. Kennington III EXPECT_CALL(mock, 29465db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 29565db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 29665db863eSWilliam A. Kennington III EXPECT_THROW(base->set_description(expected), SdEventError); 29765db863eSWilliam A. Kennington III } 29865db863eSWilliam A. Kennington III 29948c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallback) 30048c42751SWilliam A. Kennington III { 30148c42751SWilliam A. Kennington III bool completed = false; 30248c42751SWilliam A. Kennington III Base::Callback callback = [&completed](Base&) { completed = true; }; 30348c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 30448c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 30548c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 30648c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 307f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 30848c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 30948c42751SWilliam A. Kennington III EXPECT_FALSE(completed); 31048c42751SWilliam A. Kennington III 31148c42751SWilliam A. Kennington III EXPECT_EQ(0, event_handler(nullptr, base.get())); 31248c42751SWilliam A. Kennington III EXPECT_TRUE(completed); 31348c42751SWilliam A. Kennington III } 31448c42751SWilliam A. Kennington III 31548c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallbackNoUserdata) 31648c42751SWilliam A. Kennington III { 31748c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 31848c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 31948c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 32048c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 32148c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 322f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 32348c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 32448c42751SWilliam A. Kennington III 32548c42751SWilliam A. Kennington III EXPECT_EQ(-EINVAL, event_handler(nullptr, nullptr)); 32648c42751SWilliam A. Kennington III } 32748c42751SWilliam A. Kennington III 32848c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareError) 32948c42751SWilliam A. Kennington III { 330feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 331feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 332651e87adSWilliam A. Kennington III base->set_prepare([](Base&) {}); 333feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 334feef68f7SWilliam A. Kennington III 33548c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 33648c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 33748c42751SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 33848c42751SWilliam A. Kennington III EXPECT_THROW(base->set_prepare(std::move(callback)), SdEventError); 339f5285c73SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 34048c42751SWilliam A. Kennington III EXPECT_TRUE(callback); 341feef68f7SWilliam A. Kennington III } 342feef68f7SWilliam A. Kennington III 343feef68f7SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareNull) 344feef68f7SWilliam A. Kennington III { 345feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 346feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 347651e87adSWilliam A. Kennington III base->set_prepare([](Base&) {}); 348feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 349feef68f7SWilliam A. Kennington III 350feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, nullptr)) 351feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 352feef68f7SWilliam A. Kennington III base->set_prepare(nullptr); 353feef68f7SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 35448c42751SWilliam A. Kennington III } 35548c42751SWilliam A. Kennington III 35665db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingSuccess) 35765db863eSWilliam A. Kennington III { 35865db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 35965db863eSWilliam A. Kennington III .WillOnce(Return(0)); 3608fd0cd4cSWilliam A. Kennington III EXPECT_FALSE(base->get_pending()); 36165db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36265db863eSWilliam A. Kennington III .WillOnce(Return(4)); 3638fd0cd4cSWilliam A. Kennington III EXPECT_TRUE(base->get_pending()); 36465db863eSWilliam A. Kennington III } 36565db863eSWilliam A. Kennington III 36665db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingError) 36765db863eSWilliam A. Kennington III { 36865db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36965db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 37065db863eSWilliam A. Kennington III EXPECT_THROW(base->get_pending(), SdEventError); 37165db863eSWilliam A. Kennington III } 37265db863eSWilliam A. Kennington III 37365db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPrioritySuccess) 37465db863eSWilliam A. Kennington III { 37565db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 37665db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(1024), Return(0))); 37765db863eSWilliam A. Kennington III EXPECT_EQ(1024, base->get_priority()); 37865db863eSWilliam A. Kennington III } 37965db863eSWilliam A. Kennington III 38065db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPriorityError) 38165db863eSWilliam A. Kennington III { 38265db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 38365db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 38465db863eSWilliam A. Kennington III EXPECT_THROW(base->get_priority(), SdEventError); 38565db863eSWilliam A. Kennington III } 38665db863eSWilliam A. Kennington III 38765db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrioritySuccess) 38865db863eSWilliam A. Kennington III { 38965db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 39065db863eSWilliam A. Kennington III .WillOnce(Return(0)); 39165db863eSWilliam A. Kennington III base->set_priority(1024); 39265db863eSWilliam A. Kennington III } 39365db863eSWilliam A. Kennington III 39465db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPriorityError) 39565db863eSWilliam A. Kennington III { 39665db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 39765db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 39865db863eSWilliam A. Kennington III EXPECT_THROW(base->set_priority(1024), SdEventError); 39965db863eSWilliam A. Kennington III } 40065db863eSWilliam A. Kennington III 40165db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledSuccess) 40265db863eSWilliam A. Kennington III { 40365db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 40465db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(SD_EVENT_ON), Return(0))); 4058fd0cd4cSWilliam A. Kennington III EXPECT_EQ(Enabled::On, base->get_enabled()); 40665db863eSWilliam A. Kennington III } 40765db863eSWilliam A. Kennington III 40865db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledError) 40965db863eSWilliam A. Kennington III { 41065db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 41165db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 41265db863eSWilliam A. Kennington III EXPECT_THROW(base->get_enabled(), SdEventError); 41365db863eSWilliam A. Kennington III } 41465db863eSWilliam A. Kennington III 41565db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledSuccess) 41665db863eSWilliam A. Kennington III { 41765db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, SD_EVENT_ON)) 41865db863eSWilliam A. Kennington III .WillOnce(Return(0)); 4198fd0cd4cSWilliam A. Kennington III base->set_enabled(Enabled::On); 42065db863eSWilliam A. Kennington III } 42165db863eSWilliam A. Kennington III 42265db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledError) 42365db863eSWilliam A. Kennington III { 4248fd0cd4cSWilliam A. Kennington III EXPECT_CALL(mock, 4258fd0cd4cSWilliam A. Kennington III sd_event_source_set_enabled(expected_source, SD_EVENT_ONESHOT)) 42665db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 4278fd0cd4cSWilliam A. Kennington III EXPECT_THROW(base->set_enabled(Enabled::OneShot), SdEventError); 42865db863eSWilliam A. Kennington III } 4290a816c5dSWilliam A. Kennington III 43043493b58SWilliam A. Kennington III TEST_F(BaseMethodTest, GetFloatingSuccess) 43143493b58SWilliam A. Kennington III { 43243493b58SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_floating(expected_source)) 43343493b58SWilliam A. Kennington III .WillOnce(Return(2)); 43443493b58SWilliam A. Kennington III EXPECT_TRUE(base->get_floating()); 43543493b58SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_floating(expected_source)) 43643493b58SWilliam A. Kennington III .WillOnce(Return(0)); 43743493b58SWilliam A. Kennington III EXPECT_FALSE(base->get_floating()); 43843493b58SWilliam A. Kennington III } 43943493b58SWilliam A. Kennington III 44043493b58SWilliam A. Kennington III TEST_F(BaseMethodTest, GetFloatingError) 44143493b58SWilliam A. Kennington III { 44243493b58SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_floating(expected_source)) 44343493b58SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 44443493b58SWilliam A. Kennington III EXPECT_THROW(base->get_floating(), SdEventError); 44543493b58SWilliam A. Kennington III } 44643493b58SWilliam A. Kennington III 44743493b58SWilliam A. Kennington III TEST_F(BaseMethodTest, SetFloatingSuccess) 44843493b58SWilliam A. Kennington III { 44943493b58SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_floating(expected_source, 1)) 45043493b58SWilliam A. Kennington III .WillOnce(Return(0)); 45143493b58SWilliam A. Kennington III base->set_floating(true); 45243493b58SWilliam A. Kennington III } 45343493b58SWilliam A. Kennington III 45443493b58SWilliam A. Kennington III TEST_F(BaseMethodTest, SetFloatingError) 45543493b58SWilliam A. Kennington III { 45643493b58SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_floating(expected_source, 1)) 45743493b58SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 45843493b58SWilliam A. Kennington III EXPECT_THROW(base->set_floating(true), SdEventError); 45943493b58SWilliam A. Kennington III } 46043493b58SWilliam A. Kennington III 4610a816c5dSWilliam A. Kennington III } // namespace 4620a816c5dSWilliam A. Kennington III } // namespace source 4630a816c5dSWilliam A. Kennington III } // namespace sdeventplus 464