xref: /openbmc/sdeventplus/test/source/base.cpp (revision e04cb03b)
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>
5*e04cb03bSWilliam A. Kennington III #include <optional>
6715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp>
765db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp>
80a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp>
90a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp>
100a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp>
1165db863eSWilliam A. Kennington III #include <string>
12715c72f8SWilliam A. Kennington III #include <systemd/sd-event.h>
130a816c5dSWilliam A. Kennington III #include <type_traits>
14cc6b12beSWilliam A. Kennington III #include <utility>
150a816c5dSWilliam A. Kennington III 
160a816c5dSWilliam A. Kennington III namespace sdeventplus
170a816c5dSWilliam A. Kennington III {
180a816c5dSWilliam A. Kennington III namespace source
190a816c5dSWilliam A. Kennington III {
200a816c5dSWilliam A. Kennington III namespace
210a816c5dSWilliam A. Kennington III {
220a816c5dSWilliam A. Kennington III 
2365db863eSWilliam A. Kennington III using testing::DoAll;
240a816c5dSWilliam A. Kennington III using testing::Return;
2548c42751SWilliam A. Kennington III using testing::SaveArg;
2665db863eSWilliam A. Kennington III using testing::SetArgPointee;
270a816c5dSWilliam A. Kennington III 
28e3e1df0bSWilliam A. Kennington III using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>;
29e3e1df0bSWilliam A. Kennington III 
300a816c5dSWilliam A. Kennington III class BaseImpl : public Base
310a816c5dSWilliam A. Kennington III {
320a816c5dSWilliam A. Kennington III   public:
33715c72f8SWilliam A. Kennington III     BaseImpl(const Event& event, sd_event_source* source) : Base(event, source)
340a816c5dSWilliam A. Kennington III     {
350a816c5dSWilliam A. Kennington III     }
36715c72f8SWilliam A. Kennington III     BaseImpl(const Event& event, sd_event_source* source, std::false_type) :
37715c72f8SWilliam A. Kennington III         Base(event, source, std::false_type())
380a816c5dSWilliam A. Kennington III     {
390a816c5dSWilliam A. Kennington III     }
40e0f1d199SWilliam A. Kennington III 
41e0f1d199SWilliam A. Kennington III     using Base::get_prepare;
420a816c5dSWilliam A. Kennington III };
430a816c5dSWilliam A. Kennington III 
440a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test
450a816c5dSWilliam A. Kennington III {
460a816c5dSWilliam A. Kennington III   protected:
470a816c5dSWilliam A. Kennington III     testing::StrictMock<test::SdEventMock> mock;
48e3e1df0bSWilliam A. Kennington III     sd_event_source* const expected_source =
49e3e1df0bSWilliam A. Kennington III         reinterpret_cast<sd_event_source*>(1234);
50e3e1df0bSWilliam A. Kennington III     sd_event* const expected_event = reinterpret_cast<sd_event*>(2345);
51e3e1df0bSWilliam A. Kennington III     UniqueEvent event = make_event(expected_event);
52715c72f8SWilliam A. Kennington III 
53e3e1df0bSWilliam A. Kennington III     UniqueEvent make_event(sd_event* event)
54715c72f8SWilliam A. Kennington III     {
55e3e1df0bSWilliam A. Kennington III         auto deleter = [this, event](Event* e) {
56e3e1df0bSWilliam A. Kennington III             EXPECT_CALL(this->mock, sd_event_unref(event))
57715c72f8SWilliam A. Kennington III                 .WillOnce(Return(nullptr));
58e3e1df0bSWilliam A. Kennington III             delete e;
59e3e1df0bSWilliam A. Kennington III         };
60e3e1df0bSWilliam A. Kennington III         return UniqueEvent(new Event(event, std::false_type(), &mock), deleter);
61e3e1df0bSWilliam A. Kennington III     }
62e3e1df0bSWilliam A. Kennington III 
63e3e1df0bSWilliam A. Kennington III     // Using a unique_ptr to make sure we don't get any superfluous moves or
64e3e1df0bSWilliam A. Kennington III     // copies.
65e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> make_base(const Event& event,
66e3e1df0bSWilliam A. Kennington III                                         sd_event_source* source)
67e3e1df0bSWilliam A. Kennington III     {
68e3e1df0bSWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_ref(event.get()))
69e3e1df0bSWilliam A. Kennington III             .WillOnce(Return(event.get()));
702d943eadSWilliam A. Kennington III         void* userdata;
712d943eadSWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_))
722d943eadSWilliam A. Kennington III             .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
73e3e1df0bSWilliam A. Kennington III         auto ret = std::make_unique<BaseImpl>(event, source, std::false_type());
742d943eadSWilliam A. Kennington III         EXPECT_EQ(ret.get(), userdata);
75e3e1df0bSWilliam A. Kennington III         EXPECT_EQ(source, ret->get());
76e3e1df0bSWilliam A. Kennington III         EXPECT_NE(&event, &ret->get_event());
77e3e1df0bSWilliam A. Kennington III         EXPECT_EQ(event.get(), ret->get_event().get());
78e3e1df0bSWilliam A. Kennington III         EXPECT_FALSE(ret->get_prepare());
79e3e1df0bSWilliam A. Kennington III         return ret;
80e3e1df0bSWilliam A. Kennington III     }
81e3e1df0bSWilliam A. Kennington III 
82e0f1d199SWilliam A. Kennington III     void set_prepare_placeholder(BaseImpl& base)
83e3e1df0bSWilliam A. Kennington III     {
84e3e1df0bSWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_))
85e3e1df0bSWilliam A. Kennington III             .WillOnce(Return(0));
86e3e1df0bSWilliam A. Kennington III         base.set_prepare([](Base&) {});
87e3e1df0bSWilliam A. Kennington III         EXPECT_TRUE(base.get_prepare());
88e3e1df0bSWilliam A. Kennington III     }
89e3e1df0bSWilliam A. Kennington III 
90e3e1df0bSWilliam A. Kennington III     void empty_base(BaseImpl&& other)
91e3e1df0bSWilliam A. Kennington III     {
922d943eadSWilliam A. Kennington III         void* userdata;
932d943eadSWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_source_set_userdata(other.get(), testing::_))
942d943eadSWilliam A. Kennington III             .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
95e3e1df0bSWilliam A. Kennington III         BaseImpl mover(std::move(other));
962d943eadSWilliam A. Kennington III         EXPECT_EQ(&mover, userdata);
97*e04cb03bSWilliam A. Kennington III         EXPECT_THROW(other.get(), std::bad_optional_access);
98*e04cb03bSWilliam A. Kennington III         EXPECT_THROW(other.get_event().get(), std::bad_optional_access);
99e3e1df0bSWilliam A. Kennington III         EXPECT_FALSE(other.get_prepare());
100e3e1df0bSWilliam A. Kennington III 
101e3e1df0bSWilliam A. Kennington III         expect_base_destruct(mover.get_event(), mover.get());
102e3e1df0bSWilliam A. Kennington III     }
103e3e1df0bSWilliam A. Kennington III 
104e3e1df0bSWilliam A. Kennington III     void expect_base_destruct(const Event& event, sd_event_source* source)
105e3e1df0bSWilliam A. Kennington III     {
106e3e1df0bSWilliam A. Kennington III         {
107e3e1df0bSWilliam A. Kennington III             testing::InSequence seq;
108e3e1df0bSWilliam A. Kennington III             EXPECT_CALL(mock, sd_event_source_set_enabled(source, SD_EVENT_OFF))
109e3e1df0bSWilliam A. Kennington III                 .WillOnce(Return(0));
110e3e1df0bSWilliam A. Kennington III             EXPECT_CALL(mock, sd_event_source_unref(source))
111e3e1df0bSWilliam A. Kennington III                 .WillOnce(Return(nullptr));
112e3e1df0bSWilliam A. Kennington III         }
113e3e1df0bSWilliam A. Kennington III         EXPECT_CALL(mock, sd_event_unref(event.get()))
114e3e1df0bSWilliam A. Kennington III             .WillOnce(Return(nullptr));
115715c72f8SWilliam A. Kennington III     }
1160a816c5dSWilliam A. Kennington III };
1170a816c5dSWilliam A. Kennington III 
1180a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseRef)
1190a816c5dSWilliam A. Kennington III {
120715c72f8SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_ref(expected_event))
121715c72f8SWilliam A. Kennington III         .WillOnce(Return(expected_event));
1220a816c5dSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_source_ref(expected_source))
1230a816c5dSWilliam A. Kennington III         .WillOnce(Return(expected_source));
1242d943eadSWilliam A. Kennington III     void* userdata;
1252d943eadSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
1262d943eadSWilliam A. Kennington III         .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
127715c72f8SWilliam A. Kennington III     BaseImpl source(*event, expected_source);
1282d943eadSWilliam A. Kennington III     EXPECT_EQ(&source, userdata);
1294863b96bSWilliam A. Kennington III     EXPECT_EQ(expected_source, source.get());
1304863b96bSWilliam A. Kennington III     EXPECT_NE(event.get(), &source.get_event());
1314863b96bSWilliam A. Kennington III     EXPECT_EQ(expected_event, source.get_event().get());
132f5285c73SWilliam A. Kennington III     EXPECT_FALSE(source.get_prepare());
1330a816c5dSWilliam A. Kennington III 
134e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
13565db863eSWilliam A. Kennington III }
1360a816c5dSWilliam A. Kennington III 
1370a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef)
1380a816c5dSWilliam A. Kennington III {
139715c72f8SWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_ref(expected_event))
140715c72f8SWilliam A. Kennington III         .WillOnce(Return(expected_event));
1412d943eadSWilliam A. Kennington III     void* userdata;
1422d943eadSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
1432d943eadSWilliam A. Kennington III         .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
144715c72f8SWilliam A. Kennington III     BaseImpl source(*event, expected_source, std::false_type());
1452d943eadSWilliam A. Kennington III     EXPECT_EQ(&source, userdata);
1464863b96bSWilliam A. Kennington III     EXPECT_EQ(expected_source, source.get());
1474863b96bSWilliam A. Kennington III     EXPECT_NE(event.get(), &source.get_event());
1484863b96bSWilliam A. Kennington III     EXPECT_EQ(expected_event, source.get_event().get());
149f5285c73SWilliam A. Kennington III     EXPECT_FALSE(source.get_prepare());
1500a816c5dSWilliam A. Kennington III 
151e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
1527c24e057SWilliam A. Kennington III }
1537c24e057SWilliam A. Kennington III 
154cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveConstruct)
155cc6b12beSWilliam A. Kennington III {
156e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
157e3e1df0bSWilliam A. Kennington III     set_prepare_placeholder(*source1);
158cc6b12beSWilliam A. Kennington III 
1592d943eadSWilliam A. Kennington III     void* userdata;
1602d943eadSWilliam A. Kennington III     EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
1612d943eadSWilliam A. Kennington III         .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
162e3e1df0bSWilliam A. Kennington III     BaseImpl source2(std::move(*source1));
1632d943eadSWilliam A. Kennington III     EXPECT_EQ(&source2, userdata);
164*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get(), std::bad_optional_access);
165*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get_event().get(), std::bad_optional_access);
166e3e1df0bSWilliam A. Kennington III     EXPECT_FALSE(source1->get_prepare());
167cc6b12beSWilliam A. Kennington III     EXPECT_EQ(expected_source, source2.get());
168cc6b12beSWilliam A. Kennington III     EXPECT_EQ(expected_event, source2.get_event().get());
169cc6b12beSWilliam A. Kennington III     EXPECT_TRUE(source2.get_prepare());
170cc6b12beSWilliam A. Kennington III 
171e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
172cc6b12beSWilliam A. Kennington III }
173cc6b12beSWilliam A. Kennington III 
174cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignSelf)
175cc6b12beSWilliam A. Kennington III {
176e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
177e3e1df0bSWilliam A. Kennington III     set_prepare_placeholder(*source1);
178cc6b12beSWilliam A. Kennington III 
179e3e1df0bSWilliam A. Kennington III     *source1 = std::move(*source1);
180e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_source, source1->get());
181e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_event, source1->get_event().get());
182e3e1df0bSWilliam A. Kennington III     EXPECT_TRUE(source1->get_prepare());
183cc6b12beSWilliam A. Kennington III 
184e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
185cc6b12beSWilliam A. Kennington III }
186cc6b12beSWilliam A. Kennington III 
187cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignEmpty)
188cc6b12beSWilliam A. Kennington III {
189e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
190e3e1df0bSWilliam A. Kennington III     set_prepare_placeholder(*source1);
191cc6b12beSWilliam A. Kennington III 
192e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source2 = make_base(*event, expected_source);
193e3e1df0bSWilliam A. Kennington III     empty_base(std::move(*source2));
194cc6b12beSWilliam A. Kennington III 
195cc6b12beSWilliam A. Kennington III     {
1962d943eadSWilliam A. Kennington III         void* userdata;
1972d943eadSWilliam A. Kennington III         EXPECT_CALL(mock,
1982d943eadSWilliam A. Kennington III                     sd_event_source_set_userdata(expected_source, testing::_))
1992d943eadSWilliam A. Kennington III             .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
200e3e1df0bSWilliam A. Kennington III         *source2 = std::move(*source1);
2012d943eadSWilliam A. Kennington III         EXPECT_EQ(source2.get(), userdata);
202cc6b12beSWilliam A. Kennington III     }
203*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get(), std::bad_optional_access);
204*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get_event().get(), std::bad_optional_access);
205e3e1df0bSWilliam A. Kennington III     EXPECT_FALSE(source1->get_prepare());
206e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_source, source2->get());
207e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_event, source2->get_event().get());
208e3e1df0bSWilliam A. Kennington III     EXPECT_TRUE(source2->get_prepare());
209e3e1df0bSWilliam A. Kennington III 
210e3e1df0bSWilliam A. Kennington III     // Make sure source1 is deleted to ensure it isn't holding a reference
211e3e1df0bSWilliam A. Kennington III     source1.reset();
212e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
213cc6b12beSWilliam A. Kennington III }
214cc6b12beSWilliam A. Kennington III 
215cc6b12beSWilliam A. Kennington III TEST_F(BaseTest, MoveAssignExisting)
216cc6b12beSWilliam A. Kennington III {
217cc6b12beSWilliam A. Kennington III     sd_event_source* const expected_source2 =
218e3e1df0bSWilliam A. Kennington III         reinterpret_cast<sd_event_source*>(3456);
219e3e1df0bSWilliam A. Kennington III     sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567);
220e3e1df0bSWilliam A. Kennington III 
221e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
222e3e1df0bSWilliam A. Kennington III     set_prepare_placeholder(*source1);
223e3e1df0bSWilliam A. Kennington III 
224e3e1df0bSWilliam A. Kennington III     UniqueEvent event2 = make_event(expected_event2);
225e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> source2 = make_base(*event2, expected_source2);
226cc6b12beSWilliam A. Kennington III 
227cc6b12beSWilliam A. Kennington III     {
228e3e1df0bSWilliam A. Kennington III         expect_base_destruct(*event2, expected_source2);
2292d943eadSWilliam A. Kennington III         void* userdata;
2302d943eadSWilliam A. Kennington III         EXPECT_CALL(mock,
2312d943eadSWilliam A. Kennington III                     sd_event_source_set_userdata(expected_source, testing::_))
2322d943eadSWilliam A. Kennington III             .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
233e3e1df0bSWilliam A. Kennington III         *source2 = std::move(*source1);
2342d943eadSWilliam A. Kennington III         EXPECT_EQ(source2.get(), userdata);
235cc6b12beSWilliam A. Kennington III     }
236*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get(), std::bad_optional_access);
237*e04cb03bSWilliam A. Kennington III     EXPECT_THROW(source1->get_event().get(), std::bad_optional_access);
238e3e1df0bSWilliam A. Kennington III     EXPECT_FALSE(source1->get_prepare());
239e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_source, source2->get());
240e3e1df0bSWilliam A. Kennington III     EXPECT_EQ(expected_event, source2->get_event().get());
241e3e1df0bSWilliam A. Kennington III     EXPECT_TRUE(source2->get_prepare());
242cc6b12beSWilliam A. Kennington III 
243e3e1df0bSWilliam A. Kennington III     // Make sure source1 is deleted to ensure it isn't holding a reference
244e3e1df0bSWilliam A. Kennington III     source1.reset();
245e3e1df0bSWilliam A. Kennington III     expect_base_destruct(*event, expected_source);
246cc6b12beSWilliam A. Kennington III }
247cc6b12beSWilliam A. Kennington III 
24865db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest
24965db863eSWilliam A. Kennington III {
25065db863eSWilliam A. Kennington III   protected:
251e3e1df0bSWilliam A. Kennington III     std::unique_ptr<BaseImpl> base = make_base(*event, expected_source);
25265db863eSWilliam A. Kennington III 
253e3e1df0bSWilliam A. Kennington III     void TearDown()
25465db863eSWilliam A. Kennington III     {
255e3e1df0bSWilliam A. Kennington III         expect_base_destruct(base->get_event(), base->get());
256715c72f8SWilliam A. Kennington III         base.reset();
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