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