diff options
| author | William A. Kennington III <wak@google.com> | 2018-07-17 14:40:14 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2018-07-17 14:40:14 -0700 |
| commit | e3e1df0b549facf175b9201c4e945188eecaa700 (patch) | |
| tree | d0e69634b85f7b6fc5e36c63c47005da1193c3f8 /test/source/base.cpp | |
| parent | cc6b12be33b7992ecb0adca0053bb9b01834d1d7 (diff) | |
| download | sdeventplus-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.cpp | 302 |
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(); } }; |

