summaryrefslogtreecommitdiffstats
path: root/test/source/base.cpp
diff options
context:
space:
mode:
authorWilliam A. Kennington III <wak@google.com>2018-07-17 14:40:14 -0700
committerWilliam A. Kennington III <wak@google.com>2018-07-17 14:40:14 -0700
commite3e1df0b549facf175b9201c4e945188eecaa700 (patch)
treed0e69634b85f7b6fc5e36c63c47005da1193c3f8 /test/source/base.cpp
parentcc6b12be33b7992ecb0adca0053bb9b01834d1d7 (diff)
downloadsdeventplus-e3e1df0b549facf175b9201c4e945188eecaa700.tar.gz
sdeventplus-e3e1df0b549facf175b9201c4e945188eecaa700.zip
test/source/base: Clean up duplicated code
Diffstat (limited to 'test/source/base.cpp')
-rw-r--r--test/source/base.cpp302
1 files changed, 110 insertions, 192 deletions
diff --git a/test/source/base.cpp b/test/source/base.cpp
index a649166..0ca093b 100644
--- a/test/source/base.cpp
+++ b/test/source/base.cpp
@@ -25,6 +25,8 @@ using testing::Return;
using testing::SaveArg;
using testing::SetArgPointee;
+using UniqueEvent = std::unique_ptr<Event, std::function<void(Event*)>>;
+
class BaseImpl : public Base
{
public:
@@ -41,20 +43,65 @@ class BaseTest : public testing::Test
{
protected:
testing::StrictMock<test::SdEventMock> mock;
- sd_event_source* expected_source = reinterpret_cast<sd_event_source*>(1234);
- sd_event* expected_event = reinterpret_cast<sd_event*>(2345);
- std::unique_ptr<Event> event;
+ sd_event_source* const expected_source =
+ reinterpret_cast<sd_event_source*>(1234);
+ sd_event* const expected_event = reinterpret_cast<sd_event*>(2345);
+ UniqueEvent event = make_event(expected_event);
+
+ UniqueEvent make_event(sd_event* event)
+ {
+ auto deleter = [this, event](Event* e) {
+ EXPECT_CALL(this->mock, sd_event_unref(event))
+ .WillOnce(Return(nullptr));
+ delete e;
+ };
+ return UniqueEvent(new Event(event, std::false_type(), &mock), deleter);
+ }
+
+ // Using a unique_ptr to make sure we don't get any superfluous moves or
+ // copies.
+ std::unique_ptr<BaseImpl> make_base(const Event& event,
+ sd_event_source* source)
+ {
+ EXPECT_CALL(mock, sd_event_ref(event.get()))
+ .WillOnce(Return(event.get()));
+ auto ret = std::make_unique<BaseImpl>(event, source, std::false_type());
+ EXPECT_EQ(source, ret->get());
+ EXPECT_NE(&event, &ret->get_event());
+ EXPECT_EQ(event.get(), ret->get_event().get());
+ EXPECT_FALSE(ret->get_prepare());
+ return ret;
+ }
- virtual void SetUp()
+ void set_prepare_placeholder(Base& base)
{
- event =
- std::make_unique<Event>(expected_event, std::false_type(), &mock);
+ EXPECT_CALL(mock, sd_event_source_set_prepare(base.get(), testing::_))
+ .WillOnce(Return(0));
+ base.set_prepare([](Base&) {});
+ EXPECT_TRUE(base.get_prepare());
}
- virtual void TearDown()
+
+ void empty_base(BaseImpl&& other)
+ {
+ BaseImpl mover(std::move(other));
+ EXPECT_EQ(nullptr, other.get());
+ EXPECT_EQ(nullptr, other.get_event().get());
+ EXPECT_FALSE(other.get_prepare());
+
+ expect_base_destruct(mover.get_event(), mover.get());
+ }
+
+ void expect_base_destruct(const Event& event, sd_event_source* source)
{
- EXPECT_CALL(mock, sd_event_unref(expected_event))
+ {
+ testing::InSequence seq;
+ EXPECT_CALL(mock, sd_event_source_set_enabled(source, SD_EVENT_OFF))
+ .WillOnce(Return(0));
+ EXPECT_CALL(mock, sd_event_source_unref(source))
+ .WillOnce(Return(nullptr));
+ }
+ EXPECT_CALL(mock, sd_event_unref(event.get()))
.WillOnce(Return(nullptr));
- event.reset();
}
};
@@ -70,15 +117,7 @@ TEST_F(BaseTest, NewBaseRef)
EXPECT_EQ(expected_event, source.get_event().get());
EXPECT_FALSE(source.get_prepare());
- {
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+ expect_base_destruct(*event, expected_source);
}
TEST_F(BaseTest, NewBaseNoRef)
@@ -91,220 +130,99 @@ TEST_F(BaseTest, NewBaseNoRef)
EXPECT_EQ(expected_event, source.get_event().get());
EXPECT_FALSE(source.get_prepare());
- {
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
-}
-
-TEST_F(BaseTest, NoSource)
-{
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- BaseImpl source(*event, nullptr, std::false_type());
- EXPECT_EQ(nullptr, source.get());
- EXPECT_NE(event.get(), &source.get_event());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_FALSE(source.get_prepare());
-
- EXPECT_CALL(mock, sd_event_source_unref(nullptr)).WillOnce(Return(nullptr));
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+ expect_base_destruct(*event, expected_source);
}
TEST_F(BaseTest, MoveConstruct)
{
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- BaseImpl source(*event, expected_source, std::false_type());
- EXPECT_EQ(expected_source, source.get());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
- .WillOnce(Return(0));
- source.set_prepare([](Base&) {});
- EXPECT_TRUE(source.get_prepare());
+ std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
+ set_prepare_placeholder(*source1);
- BaseImpl source2(std::move(source));
- EXPECT_EQ(nullptr, source.get());
- EXPECT_EQ(nullptr, source.get_event().get());
- EXPECT_FALSE(source.get_prepare());
+ BaseImpl source2(std::move(*source1));
+ EXPECT_EQ(nullptr, source1->get());
+ EXPECT_EQ(nullptr, source1->get_event().get());
+ EXPECT_FALSE(source1->get_prepare());
EXPECT_EQ(expected_source, source2.get());
EXPECT_EQ(expected_event, source2.get_event().get());
EXPECT_TRUE(source2.get_prepare());
- {
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+ expect_base_destruct(*event, expected_source);
}
TEST_F(BaseTest, MoveAssignSelf)
{
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- BaseImpl source(*event, expected_source, std::false_type());
- EXPECT_EQ(expected_source, source.get());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
- .WillOnce(Return(0));
- source.set_prepare([](Base&) {});
- EXPECT_TRUE(source.get_prepare());
+ std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
+ set_prepare_placeholder(*source1);
- source = std::move(source);
- EXPECT_EQ(expected_source, source.get());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_TRUE(source.get_prepare());
+ *source1 = std::move(*source1);
+ EXPECT_EQ(expected_source, source1->get());
+ EXPECT_EQ(expected_event, source1->get_event().get());
+ EXPECT_TRUE(source1->get_prepare());
- {
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+ expect_base_destruct(*event, expected_source);
}
TEST_F(BaseTest, MoveAssignEmpty)
{
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- BaseImpl source(*event, expected_source, std::false_type());
- EXPECT_EQ(expected_source, source.get());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
- .WillOnce(Return(0));
- source.set_prepare([](Base&) {});
- EXPECT_TRUE(source.get_prepare());
-
- sd_event* const expected_event2 = reinterpret_cast<sd_event*>(1);
- Event event2(expected_event2, std::false_type(), &mock);
- EXPECT_CALL(mock, sd_event_ref(expected_event2))
- .WillOnce(Return(expected_event2));
- BaseImpl source2(event2, nullptr, std::false_type());
- EXPECT_EQ(nullptr, source2.get());
- EXPECT_EQ(expected_event2, source2.get_event().get());
- EXPECT_FALSE(source2.get_prepare());
-
- EXPECT_CALL(mock, sd_event_unref(expected_event2))
- .WillOnce(Return(nullptr));
- EXPECT_CALL(mock, sd_event_source_unref(nullptr)).WillOnce(Return(nullptr));
- source2 = std::move(source);
- EXPECT_EQ(nullptr, source.get());
- EXPECT_EQ(nullptr, source.get_event().get());
- EXPECT_FALSE(source.get_prepare());
- EXPECT_EQ(expected_source, source2.get());
- EXPECT_EQ(expected_event, source2.get_event().get());
- EXPECT_TRUE(source2.get_prepare());
+ std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
+ set_prepare_placeholder(*source1);
+
+ std::unique_ptr<BaseImpl> source2 = make_base(*event, expected_source);
+ empty_base(std::move(*source2));
{
testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
+ *source2 = std::move(*source1);
}
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
- EXPECT_CALL(mock, sd_event_unref(expected_event2))
- .WillOnce(Return(nullptr));
+ EXPECT_EQ(nullptr, source1->get());
+ EXPECT_EQ(nullptr, source1->get_event().get());
+ EXPECT_FALSE(source1->get_prepare());
+ EXPECT_EQ(expected_source, source2->get());
+ EXPECT_EQ(expected_event, source2->get_event().get());
+ EXPECT_TRUE(source2->get_prepare());
+
+ // Make sure source1 is deleted to ensure it isn't holding a reference
+ source1.reset();
+ expect_base_destruct(*event, expected_source);
}
TEST_F(BaseTest, MoveAssignExisting)
{
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- BaseImpl source(*event, expected_source, std::false_type());
- EXPECT_EQ(expected_source, source.get());
- EXPECT_EQ(expected_event, source.get_event().get());
- EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
- .WillOnce(Return(0));
- source.set_prepare([](Base&) {});
- EXPECT_TRUE(source.get_prepare());
-
- sd_event* const expected_event2 = reinterpret_cast<sd_event*>(1);
sd_event_source* const expected_source2 =
- reinterpret_cast<sd_event_source*>(2);
- Event event2(expected_event2, std::false_type(), &mock);
- EXPECT_CALL(mock, sd_event_ref(expected_event2))
- .WillOnce(Return(expected_event2));
- BaseImpl source2(event2, expected_source2, std::false_type());
- EXPECT_EQ(expected_source2, source2.get());
- EXPECT_EQ(expected_event2, source2.get_event().get());
- EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source2, testing::_))
- .WillOnce(Return(0));
- source2.set_prepare([](Base&) {});
- EXPECT_TRUE(source2.get_prepare());
+ reinterpret_cast<sd_event_source*>(3456);
+ sd_event* const expected_event2 = reinterpret_cast<sd_event*>(4567);
- {
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source2, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source2))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event2))
- .WillOnce(Return(nullptr));
- source2 = std::move(source);
- EXPECT_EQ(nullptr, source.get());
- EXPECT_EQ(nullptr, source.get_event().get());
- EXPECT_FALSE(source.get_prepare());
- EXPECT_EQ(expected_source, source2.get());
- EXPECT_EQ(expected_event, source2.get_event().get());
- EXPECT_TRUE(source2.get_prepare());
+ std::unique_ptr<BaseImpl> source1 = make_base(*event, expected_source);
+ set_prepare_placeholder(*source1);
+
+ UniqueEvent event2 = make_event(expected_event2);
+ std::unique_ptr<BaseImpl> source2 = make_base(*event2, expected_source2);
{
- testing::InSequence seq;
- EXPECT_CALL(mock,
- sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
+ expect_base_destruct(*event2, expected_source2);
+ *source2 = std::move(*source1);
}
- EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
- EXPECT_CALL(mock, sd_event_unref(expected_event2))
- .WillOnce(Return(nullptr));
+ EXPECT_EQ(nullptr, source1->get());
+ EXPECT_EQ(nullptr, source1->get_event().get());
+ EXPECT_FALSE(source1->get_prepare());
+ EXPECT_EQ(expected_source, source2->get());
+ EXPECT_EQ(expected_event, source2->get_event().get());
+ EXPECT_TRUE(source2->get_prepare());
+
+ // Make sure source1 is deleted to ensure it isn't holding a reference
+ source1.reset();
+ expect_base_destruct(*event, expected_source);
}
class BaseMethodTest : public BaseTest
{
protected:
- std::unique_ptr<BaseImpl> base;
-
- void SetUp() override
- {
- BaseTest::SetUp();
- EXPECT_CALL(mock, sd_event_ref(expected_event))
- .WillOnce(Return(expected_event));
- base = std::make_unique<BaseImpl>(*event, expected_source,
- std::false_type());
- }
+ std::unique_ptr<BaseImpl> base = make_base(*event, expected_source);
- void TearDown() override
+ void TearDown()
{
- {
- testing::InSequence seq;
- EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source,
- SD_EVENT_OFF))
- .WillOnce(Return(0));
- EXPECT_CALL(mock, sd_event_source_unref(expected_source))
- .WillOnce(Return(nullptr));
- }
- EXPECT_CALL(mock, sd_event_unref(expected_event))
- .WillOnce(Return(nullptr));
+ expect_base_destruct(base->get_event(), base->get());
base.reset();
- BaseTest::TearDown();
}
};
OpenPOWER on IntegriCloud