xref: /openbmc/sdeventplus/test/source/base.cpp (revision 56dc78ba)
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