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> 5715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp> 665db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp> 70a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp> 80a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp> 90a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp> 1065db863eSWilliam A. Kennington III #include <string> 11715c72f8SWilliam A. Kennington III #include <systemd/sd-event.h> 120a816c5dSWilliam A. Kennington III #include <type_traits> 13cc6b12beSWilliam A. Kennington III #include <utility> 140a816c5dSWilliam A. Kennington III 150a816c5dSWilliam A. Kennington III namespace sdeventplus 160a816c5dSWilliam A. Kennington III { 170a816c5dSWilliam A. Kennington III namespace source 180a816c5dSWilliam A. Kennington III { 190a816c5dSWilliam A. Kennington III namespace 200a816c5dSWilliam A. Kennington III { 210a816c5dSWilliam A. Kennington III 2265db863eSWilliam A. Kennington III using testing::DoAll; 230a816c5dSWilliam A. Kennington III using testing::Return; 2448c42751SWilliam A. Kennington III using testing::SaveArg; 2565db863eSWilliam A. Kennington III using testing::SetArgPointee; 260a816c5dSWilliam A. Kennington III 27e3e1df0bSWilliam A. Kennington III using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>; 28e3e1df0bSWilliam A. Kennington III 290a816c5dSWilliam A. Kennington III class BaseImpl : public Base 300a816c5dSWilliam A. Kennington III { 310a816c5dSWilliam A. Kennington III public: 32715c72f8SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source) : Base(event, source) 330a816c5dSWilliam A. Kennington III { 340a816c5dSWilliam A. Kennington III } 35715c72f8SWilliam A. Kennington III BaseImpl(const Event& event, sd_event_source* source, std::false_type) : 36715c72f8SWilliam A. Kennington III Base(event, source, std::false_type()) 370a816c5dSWilliam A. Kennington III { 380a816c5dSWilliam A. Kennington III } 39e0f1d199SWilliam A. Kennington III 40e0f1d199SWilliam A. Kennington III using Base::get_prepare; 410a816c5dSWilliam A. Kennington III }; 420a816c5dSWilliam A. Kennington III 430a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test 440a816c5dSWilliam A. Kennington III { 450a816c5dSWilliam A. Kennington III protected: 460a816c5dSWilliam A. Kennington III testing::StrictMock<test::SdEventMock> mock; 47e3e1df0bSWilliam A. Kennington III sd_event_source* const expected_source = 48e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(1234); 49e3e1df0bSWilliam A. Kennington III sd_event* const expected_event = reinterpret_cast<sd_event*>(2345); 50e3e1df0bSWilliam A. Kennington III UniqueEvent event = make_event(expected_event); 51715c72f8SWilliam A. Kennington III 52e3e1df0bSWilliam A. Kennington III UniqueEvent make_event(sd_event* event) 53715c72f8SWilliam A. Kennington III { 54e3e1df0bSWilliam A. Kennington III auto deleter = [this, event](Event* e) { 55e3e1df0bSWilliam A. Kennington III EXPECT_CALL(this->mock, sd_event_unref(event)) 56715c72f8SWilliam A. Kennington III .WillOnce(Return(nullptr)); 57e3e1df0bSWilliam A. Kennington III delete e; 58e3e1df0bSWilliam A. Kennington III }; 59e3e1df0bSWilliam A. Kennington III return UniqueEvent(new Event(event, std::false_type(), &mock), deleter); 60e3e1df0bSWilliam A. Kennington III } 61e3e1df0bSWilliam A. Kennington III 62e3e1df0bSWilliam A. Kennington III // Using a unique_ptr to make sure we don't get any superfluous moves or 63e3e1df0bSWilliam A. Kennington III // copies. 64e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> make_base(const Event& event, 65e3e1df0bSWilliam A. Kennington III sd_event_source* source) 66e3e1df0bSWilliam A. Kennington III { 67e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(event.get())) 68e3e1df0bSWilliam A. Kennington III .WillOnce(Return(event.get())); 692d943eadSWilliam A. Kennington III void* userdata; 702d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_)) 712d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 72e3e1df0bSWilliam A. Kennington III auto ret = std::make_unique<BaseImpl>(event, source, std::false_type()); 732d943eadSWilliam A. Kennington III EXPECT_EQ(ret.get(), userdata); 74e3e1df0bSWilliam A. Kennington III EXPECT_EQ(source, ret->get()); 75e3e1df0bSWilliam A. Kennington III EXPECT_NE(&event, &ret->get_event()); 76e3e1df0bSWilliam A. Kennington III EXPECT_EQ(event.get(), ret->get_event().get()); 77e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(ret->get_prepare()); 78e3e1df0bSWilliam A. Kennington III return ret; 79e3e1df0bSWilliam A. Kennington III } 80e3e1df0bSWilliam A. Kennington III 81e0f1d199SWilliam A. Kennington III void set_prepare_placeholder(BaseImpl& base) 82e3e1df0bSWilliam A. Kennington III { 83e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_)) 84e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 85e3e1df0bSWilliam A. Kennington III base.set_prepare([](Base&) {}); 86e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(base.get_prepare()); 87e3e1df0bSWilliam A. Kennington III } 88e3e1df0bSWilliam A. Kennington III 89e3e1df0bSWilliam A. Kennington III void empty_base(BaseImpl&& other) 90e3e1df0bSWilliam A. Kennington III { 912d943eadSWilliam A. Kennington III void* userdata; 922d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(other.get(), testing::_)) 932d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 94e3e1df0bSWilliam A. Kennington III BaseImpl mover(std::move(other)); 952d943eadSWilliam A. Kennington III EXPECT_EQ(&mover, userdata); 96e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, other.get()); 97e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, other.get_event().get()); 98e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(other.get_prepare()); 99e3e1df0bSWilliam A. Kennington III 100e3e1df0bSWilliam A. Kennington III expect_base_destruct(mover.get_event(), mover.get()); 101e3e1df0bSWilliam A. Kennington III } 102e3e1df0bSWilliam A. Kennington III 103e3e1df0bSWilliam A. Kennington III void expect_base_destruct(const Event& event, sd_event_source* source) 104e3e1df0bSWilliam A. Kennington III { 105e3e1df0bSWilliam A. Kennington III { 106e3e1df0bSWilliam A. Kennington III testing::InSequence seq; 107e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(source, SD_EVENT_OFF)) 108e3e1df0bSWilliam A. Kennington III .WillOnce(Return(0)); 109e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(source)) 110e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 111e3e1df0bSWilliam A. Kennington III } 112e3e1df0bSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_unref(event.get())) 113e3e1df0bSWilliam A. Kennington III .WillOnce(Return(nullptr)); 114715c72f8SWilliam A. Kennington III } 1150a816c5dSWilliam A. Kennington III }; 1160a816c5dSWilliam A. Kennington III 1170a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseRef) 1180a816c5dSWilliam A. Kennington III { 119715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 120715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1210a816c5dSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 1220a816c5dSWilliam A. Kennington III .WillOnce(Return(expected_source)); 1232d943eadSWilliam A. Kennington III void* userdata; 1242d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1252d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 126715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source); 1272d943eadSWilliam A. Kennington III EXPECT_EQ(&source, userdata); 1284863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1294863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1304863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 131f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1320a816c5dSWilliam A. Kennington III 133e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 13465db863eSWilliam A. Kennington III } 1350a816c5dSWilliam A. Kennington III 1360a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef) 1370a816c5dSWilliam A. Kennington III { 138715c72f8SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_ref(expected_event)) 139715c72f8SWilliam A. Kennington III .WillOnce(Return(expected_event)); 1402d943eadSWilliam A. Kennington III void* userdata; 1412d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1422d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 143715c72f8SWilliam A. Kennington III BaseImpl source(*event, expected_source, std::false_type()); 1442d943eadSWilliam A. Kennington III EXPECT_EQ(&source, userdata); 1454863b96bSWilliam A. Kennington III EXPECT_EQ(expected_source, source.get()); 1464863b96bSWilliam A. Kennington III EXPECT_NE(event.get(), &source.get_event()); 1474863b96bSWilliam A. Kennington III EXPECT_EQ(expected_event, source.get_event().get()); 148f5285c73SWilliam A. Kennington III EXPECT_FALSE(source.get_prepare()); 1490a816c5dSWilliam A. Kennington III 150e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 1517c24e057SWilliam A. Kennington III } 1527c24e057SWilliam A. Kennington III 153cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveConstruct) 154cc6b12beSWilliam A. Kennington III { 155e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 156e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 157cc6b12beSWilliam A. Kennington III 1582d943eadSWilliam A. Kennington III void* userdata; 1592d943eadSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_)) 1602d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 161e3e1df0bSWilliam A. Kennington III BaseImpl source2(std::move(*source1)); 1622d943eadSWilliam A. Kennington III EXPECT_EQ(&source2, userdata); 163e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get()); 164e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get_event().get()); 165e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 166cc6b12beSWilliam A. Kennington III EXPECT_EQ(expected_source, source2.get()); 167cc6b12beSWilliam A. Kennington III EXPECT_EQ(expected_event, source2.get_event().get()); 168cc6b12beSWilliam A. Kennington III EXPECT_TRUE(source2.get_prepare()); 169cc6b12beSWilliam A. Kennington III 170e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 171cc6b12beSWilliam A. Kennington III } 172cc6b12beSWilliam A. Kennington III 173cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignSelf) 174cc6b12beSWilliam A. Kennington III { 175e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 176e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 177cc6b12beSWilliam A. Kennington III 178e3e1df0bSWilliam A. Kennington III *source1 = std::move(*source1); 179e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source1->get()); 180e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source1->get_event().get()); 181e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source1->get_prepare()); 182cc6b12beSWilliam A. Kennington III 183e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 184cc6b12beSWilliam A. Kennington III } 185cc6b12beSWilliam A. Kennington III 186cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignEmpty) 187cc6b12beSWilliam A. Kennington III { 188e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 189e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 190cc6b12beSWilliam A. Kennington III 191e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source2 = make_base(*event, expected_source); 192e3e1df0bSWilliam A. Kennington III empty_base(std::move(*source2)); 193cc6b12beSWilliam A. Kennington III 194cc6b12beSWilliam A. Kennington III { 1952d943eadSWilliam A. Kennington III void* userdata; 1962d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 1972d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 1982d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 199e3e1df0bSWilliam A. Kennington III *source2 = std::move(*source1); 2002d943eadSWilliam A. Kennington III EXPECT_EQ(source2.get(), userdata); 201cc6b12beSWilliam A. Kennington III } 202e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get()); 203e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get_event().get()); 204e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 205e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source2->get()); 206e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source2->get_event().get()); 207e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source2->get_prepare()); 208e3e1df0bSWilliam A. Kennington III 209e3e1df0bSWilliam A. Kennington III // Make sure source1 is deleted to ensure it isn't holding a reference 210e3e1df0bSWilliam A. Kennington III source1.reset(); 211e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 212cc6b12beSWilliam A. Kennington III } 213cc6b12beSWilliam A. Kennington III 214cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignExisting) 215cc6b12beSWilliam A. Kennington III { 216cc6b12beSWilliam A. Kennington III sd_event_source* const expected_source2 = 217e3e1df0bSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(3456); 218e3e1df0bSWilliam A. Kennington III sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567); 219e3e1df0bSWilliam A. Kennington III 220e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source); 221e3e1df0bSWilliam A. Kennington III set_prepare_placeholder(*source1); 222e3e1df0bSWilliam A. Kennington III 223e3e1df0bSWilliam A. Kennington III UniqueEvent event2 = make_event(expected_event2); 224e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> source2 = make_base(*event2, expected_source2); 225cc6b12beSWilliam A. Kennington III 226cc6b12beSWilliam A. Kennington III { 227e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event2, expected_source2); 2282d943eadSWilliam A. Kennington III void* userdata; 2292d943eadSWilliam A. Kennington III EXPECT_CALL(mock, 2302d943eadSWilliam A. Kennington III sd_event_source_set_userdata(expected_source, testing::_)) 2312d943eadSWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr))); 232e3e1df0bSWilliam A. Kennington III *source2 = std::move(*source1); 2332d943eadSWilliam A. Kennington III EXPECT_EQ(source2.get(), userdata); 234cc6b12beSWilliam A. Kennington III } 235e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get()); 236e3e1df0bSWilliam A. Kennington III EXPECT_EQ(nullptr, source1->get_event().get()); 237e3e1df0bSWilliam A. Kennington III EXPECT_FALSE(source1->get_prepare()); 238e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_source, source2->get()); 239e3e1df0bSWilliam A. Kennington III EXPECT_EQ(expected_event, source2->get_event().get()); 240e3e1df0bSWilliam A. Kennington III EXPECT_TRUE(source2->get_prepare()); 241cc6b12beSWilliam A. Kennington III 242e3e1df0bSWilliam A. Kennington III // Make sure source1 is deleted to ensure it isn't holding a reference 243e3e1df0bSWilliam A. Kennington III source1.reset(); 244e3e1df0bSWilliam A. Kennington III expect_base_destruct(*event, expected_source); 245cc6b12beSWilliam A. Kennington III } 246cc6b12beSWilliam A. Kennington III 24765db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest 24865db863eSWilliam A. Kennington III { 24965db863eSWilliam A. Kennington III protected: 250e3e1df0bSWilliam A. Kennington III std::unique_ptr<BaseImpl> base = make_base(*event, expected_source); 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(); 25665db863eSWilliam A. Kennington III } 25765db863eSWilliam A. Kennington III }; 25865db863eSWilliam A. Kennington III 25965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionSuccess) 26065db863eSWilliam A. Kennington III { 26165db863eSWilliam A. Kennington III const char* expected = "test_desc"; 26265db863eSWilliam A. Kennington III EXPECT_CALL(mock, 26365db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 26465db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(expected), Return(0))); 26565db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 26665db863eSWilliam A. Kennington III EXPECT_EQ(expected, base->get_description()); 26765db863eSWilliam A. Kennington III } 26865db863eSWilliam A. Kennington III 26965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionError) 27065db863eSWilliam A. Kennington III { 27165db863eSWilliam A. Kennington III EXPECT_CALL(mock, 27265db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 27365db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 27465db863eSWilliam A. Kennington III EXPECT_THROW(base->get_description(), SdEventError); 27565db863eSWilliam A. Kennington III } 27665db863eSWilliam A. Kennington III 27765db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionSuccess) 27865db863eSWilliam A. Kennington III { 27965db863eSWilliam A. Kennington III const char* expected = "test desc"; 28065db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 28165db863eSWilliam A. Kennington III EXPECT_CALL(mock, 28265db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 28365db863eSWilliam A. Kennington III .WillOnce(Return(0)); 28465db863eSWilliam A. Kennington III base->set_description(expected); 28565db863eSWilliam A. Kennington III } 28665db863eSWilliam A. Kennington III 28765db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionError) 28865db863eSWilliam A. Kennington III { 28965db863eSWilliam A. Kennington III const char* expected = "test desc"; 29065db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 29165db863eSWilliam A. Kennington III EXPECT_CALL(mock, 29265db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 29365db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 29465db863eSWilliam A. Kennington III EXPECT_THROW(base->set_description(expected), SdEventError); 29565db863eSWilliam A. Kennington III } 29665db863eSWilliam A. Kennington III 29748c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallback) 29848c42751SWilliam A. Kennington III { 29948c42751SWilliam A. Kennington III bool completed = false; 30048c42751SWilliam A. Kennington III Base::Callback callback = [&completed](Base&) { completed = true; }; 30148c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 30248c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 30348c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 30448c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 305f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 30648c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 30748c42751SWilliam A. Kennington III EXPECT_FALSE(completed); 30848c42751SWilliam A. Kennington III 30948c42751SWilliam A. Kennington III EXPECT_EQ(0, event_handler(nullptr, base.get())); 31048c42751SWilliam A. Kennington III EXPECT_TRUE(completed); 31148c42751SWilliam A. Kennington III } 31248c42751SWilliam A. Kennington III 31348c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareCallbackNoUserdata) 31448c42751SWilliam A. Kennington III { 31548c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 31648c42751SWilliam A. Kennington III sd_event_handler_t event_handler; 31748c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 31848c42751SWilliam A. Kennington III .WillOnce(DoAll(SaveArg<1>(&event_handler), Return(0))); 31948c42751SWilliam A. Kennington III base->set_prepare(std::move(callback)); 320f5285c73SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 32148c42751SWilliam A. Kennington III EXPECT_FALSE(callback); 32248c42751SWilliam A. Kennington III 32348c42751SWilliam A. Kennington III EXPECT_EQ(-EINVAL, event_handler(nullptr, nullptr)); 32448c42751SWilliam A. Kennington III } 32548c42751SWilliam A. Kennington III 32648c42751SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareError) 32748c42751SWilliam A. Kennington III { 328feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 329feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 330feef68f7SWilliam A. Kennington III base->set_prepare(std::move([](Base&) {})); 331feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 332feef68f7SWilliam A. Kennington III 33348c42751SWilliam A. Kennington III Base::Callback callback = [](Base&) {}; 33448c42751SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 33548c42751SWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 33648c42751SWilliam A. Kennington III EXPECT_THROW(base->set_prepare(std::move(callback)), SdEventError); 337f5285c73SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 33848c42751SWilliam A. Kennington III EXPECT_TRUE(callback); 339feef68f7SWilliam A. Kennington III } 340feef68f7SWilliam A. Kennington III 341feef68f7SWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrepareNull) 342feef68f7SWilliam A. Kennington III { 343feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_)) 344feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 345feef68f7SWilliam A. Kennington III base->set_prepare(std::move([](Base&) {})); 346feef68f7SWilliam A. Kennington III EXPECT_TRUE(base->get_prepare()); 347feef68f7SWilliam A. Kennington III 348feef68f7SWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, nullptr)) 349feef68f7SWilliam A. Kennington III .WillOnce(Return(0)); 350feef68f7SWilliam A. Kennington III base->set_prepare(nullptr); 351feef68f7SWilliam A. Kennington III EXPECT_FALSE(base->get_prepare()); 35248c42751SWilliam A. Kennington III } 35348c42751SWilliam A. Kennington III 35465db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingSuccess) 35565db863eSWilliam A. Kennington III { 35665db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 35765db863eSWilliam A. Kennington III .WillOnce(Return(0)); 358*8fd0cd4cSWilliam A. Kennington III EXPECT_FALSE(base->get_pending()); 35965db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36065db863eSWilliam A. Kennington III .WillOnce(Return(4)); 361*8fd0cd4cSWilliam A. Kennington III EXPECT_TRUE(base->get_pending()); 36265db863eSWilliam A. Kennington III } 36365db863eSWilliam A. Kennington III 36465db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingError) 36565db863eSWilliam A. Kennington III { 36665db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 36765db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 36865db863eSWilliam A. Kennington III EXPECT_THROW(base->get_pending(), SdEventError); 36965db863eSWilliam A. Kennington III } 37065db863eSWilliam A. Kennington III 37165db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPrioritySuccess) 37265db863eSWilliam A. Kennington III { 37365db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 37465db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(1024), Return(0))); 37565db863eSWilliam A. Kennington III EXPECT_EQ(1024, base->get_priority()); 37665db863eSWilliam A. Kennington III } 37765db863eSWilliam A. Kennington III 37865db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPriorityError) 37965db863eSWilliam A. Kennington III { 38065db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 38165db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 38265db863eSWilliam A. Kennington III EXPECT_THROW(base->get_priority(), SdEventError); 38365db863eSWilliam A. Kennington III } 38465db863eSWilliam A. Kennington III 38565db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrioritySuccess) 38665db863eSWilliam A. Kennington III { 38765db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 38865db863eSWilliam A. Kennington III .WillOnce(Return(0)); 38965db863eSWilliam A. Kennington III base->set_priority(1024); 39065db863eSWilliam A. Kennington III } 39165db863eSWilliam A. Kennington III 39265db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPriorityError) 39365db863eSWilliam A. Kennington III { 39465db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 39565db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 39665db863eSWilliam A. Kennington III EXPECT_THROW(base->set_priority(1024), SdEventError); 39765db863eSWilliam A. Kennington III } 39865db863eSWilliam A. Kennington III 39965db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledSuccess) 40065db863eSWilliam A. Kennington III { 40165db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 40265db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(SD_EVENT_ON), Return(0))); 403*8fd0cd4cSWilliam A. Kennington III EXPECT_EQ(Enabled::On, base->get_enabled()); 40465db863eSWilliam A. Kennington III } 40565db863eSWilliam A. Kennington III 40665db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledError) 40765db863eSWilliam A. Kennington III { 40865db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 40965db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 41065db863eSWilliam A. Kennington III EXPECT_THROW(base->get_enabled(), SdEventError); 41165db863eSWilliam A. Kennington III } 41265db863eSWilliam A. Kennington III 41365db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledSuccess) 41465db863eSWilliam A. Kennington III { 41565db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, SD_EVENT_ON)) 41665db863eSWilliam A. Kennington III .WillOnce(Return(0)); 417*8fd0cd4cSWilliam A. Kennington III base->set_enabled(Enabled::On); 41865db863eSWilliam A. Kennington III } 41965db863eSWilliam A. Kennington III 42065db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledError) 42165db863eSWilliam A. Kennington III { 422*8fd0cd4cSWilliam A. Kennington III EXPECT_CALL(mock, 423*8fd0cd4cSWilliam A. Kennington III sd_event_source_set_enabled(expected_source, SD_EVENT_ONESHOT)) 42465db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 425*8fd0cd4cSWilliam A. Kennington III EXPECT_THROW(base->set_enabled(Enabled::OneShot), SdEventError); 42665db863eSWilliam A. Kennington III } 4270a816c5dSWilliam A. Kennington III 4280a816c5dSWilliam A. Kennington III } // namespace 4290a816c5dSWilliam A. Kennington III } // namespace source 4300a816c5dSWilliam A. Kennington III } // namespace sdeventplus 431