xref: /openbmc/sdeventplus/test/source/base.cpp (revision a8c11e3c)
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 
BaseImpl(const BaseImpl & other,sdeventplus::internal::NoOwn)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:
BaseImplData(const BaseImpl & base)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 
BaseImpl(const Event & event,sd_event_source * source,std::false_type)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 
make_event(sd_event * event)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()>>
make_base(const Event & event,sd_event_source * source)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 
set_prepare_placeholder(BaseImpl & base)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 
empty_base(BaseImpl && other)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 
expect_base_destruct(const Event & event,sd_event_source * source)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 
TEST_F(BaseTest,NewBaseFail)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 
TEST_F(BaseTest,NewBaseNoRef)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 
TEST_F(BaseTest,UserdataOutlives)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 
TEST_F(BaseTest,CopyCorrectness)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 
SetUp()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 
TearDown()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 
TEST_F(BaseMethodTest,GetDescriptionSuccess)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 
TEST_F(BaseMethodTest,GetDescriptionError)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 
TEST_F(BaseMethodTest,SetDescriptionSuccess)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 
TEST_F(BaseMethodTest,SetDescriptionError)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 
TEST_F(BaseMethodTest,SetPrepareCallback)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 
TEST_F(BaseMethodTest,SetPrepareCallbackNoUserdata)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 
TEST_F(BaseMethodTest,SetPrepareError)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 
TEST_F(BaseMethodTest,SetPrepareNull)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 
TEST_F(BaseMethodTest,GetPendingSuccess)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 
TEST_F(BaseMethodTest,GetPendingError)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 
TEST_F(BaseMethodTest,GetPrioritySuccess)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 
TEST_F(BaseMethodTest,GetPriorityError)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 
TEST_F(BaseMethodTest,SetPrioritySuccess)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 
TEST_F(BaseMethodTest,SetPriorityError)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 
TEST_F(BaseMethodTest,GetEnabledSuccess)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 
TEST_F(BaseMethodTest,GetEnabledError)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 
TEST_F(BaseMethodTest,SetEnabledSuccess)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 
TEST_F(BaseMethodTest,SetEnabledError)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 
TEST_F(BaseMethodTest,GetFloatingSuccess)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 
TEST_F(BaseMethodTest,GetFloatingError)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 
TEST_F(BaseMethodTest,SetFloatingSuccess)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 
TEST_F(BaseMethodTest,SetFloatingError)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