source/base: Support automatically configuring userdata
This makes callbacks work correctly as the systemd callback functions
need to know where to look for the object storing the real callback.
diff --git a/test/source/base.cpp b/test/source/base.cpp
index 0ca093b..69ae8e2 100644
--- a/test/source/base.cpp
+++ b/test/source/base.cpp
@@ -65,7 +65,11 @@
{
EXPECT_CALL(mock, sd_event_ref(event.get()))
.WillOnce(Return(event.get()));
+ void* userdata;
+ EXPECT_CALL(mock, sd_event_source_set_userdata(source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
auto ret = std::make_unique<BaseImpl>(event, source, std::false_type());
+ EXPECT_EQ(ret.get(), userdata);
EXPECT_EQ(source, ret->get());
EXPECT_NE(&event, &ret->get_event());
EXPECT_EQ(event.get(), ret->get_event().get());
@@ -83,7 +87,11 @@
void empty_base(BaseImpl&& other)
{
+ void* userdata;
+ EXPECT_CALL(mock, sd_event_source_set_userdata(other.get(), testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
BaseImpl mover(std::move(other));
+ EXPECT_EQ(&mover, userdata);
EXPECT_EQ(nullptr, other.get());
EXPECT_EQ(nullptr, other.get_event().get());
EXPECT_FALSE(other.get_prepare());
@@ -111,7 +119,11 @@
.WillOnce(Return(expected_event));
EXPECT_CALL(mock, sd_event_source_ref(expected_source))
.WillOnce(Return(expected_source));
+ void* userdata;
+ EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
BaseImpl source(*event, expected_source);
+ EXPECT_EQ(&source, userdata);
EXPECT_EQ(expected_source, source.get());
EXPECT_NE(event.get(), &source.get_event());
EXPECT_EQ(expected_event, source.get_event().get());
@@ -124,7 +136,11 @@
{
EXPECT_CALL(mock, sd_event_ref(expected_event))
.WillOnce(Return(expected_event));
+ void* userdata;
+ EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
BaseImpl source(*event, expected_source, std::false_type());
+ EXPECT_EQ(&source, userdata);
EXPECT_EQ(expected_source, source.get());
EXPECT_NE(event.get(), &source.get_event());
EXPECT_EQ(expected_event, source.get_event().get());
@@ -138,7 +154,11 @@
std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
set_prepare_placeholder(*source1);
+ void* userdata;
+ EXPECT_CALL(mock, sd_event_source_set_userdata(expected_source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
BaseImpl source2(std::move(*source1));
+ EXPECT_EQ(&source2, userdata);
EXPECT_EQ(nullptr, source1->get());
EXPECT_EQ(nullptr, source1->get_event().get());
EXPECT_FALSE(source1->get_prepare());
@@ -171,8 +191,12 @@
empty_base(std::move(*source2));
{
- testing::InSequence seq;
+ void* userdata;
+ EXPECT_CALL(mock,
+ sd_event_source_set_userdata(expected_source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
*source2 = std::move(*source1);
+ EXPECT_EQ(source2.get(), userdata);
}
EXPECT_EQ(nullptr, source1->get());
EXPECT_EQ(nullptr, source1->get_event().get());
@@ -200,7 +224,12 @@
{
expect_base_destruct(*event2, expected_source2);
+ void* userdata;
+ EXPECT_CALL(mock,
+ sd_event_source_set_userdata(expected_source, testing::_))
+ .WillOnce(DoAll(SaveArg<1>(&userdata), Return(nullptr)));
*source2 = std::move(*source1);
+ EXPECT_EQ(source2.get(), userdata);
}
EXPECT_EQ(nullptr, source1->get());
EXPECT_EQ(nullptr, source1->get_event().get());