diff options
| author | William A. Kennington III <wak@google.com> | 2018-07-22 00:22:08 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2018-07-22 14:55:39 -0700 |
| commit | 5a7365c6e51fe4554b6a24455080974f3eeab4dc (patch) | |
| tree | e8d95a0d95dfeecbd8b79ed04e470113260a0a80 /test/source/event.cpp | |
| parent | 425691a2a9104d25a7b381b00af136a1465891ad (diff) | |
| download | sdeventplus-5a7365c6e51fe4554b6a24455080974f3eeab4dc.tar.gz sdeventplus-5a7365c6e51fe4554b6a24455080974f3eeab4dc.zip | |
source/event: Implement event_handler style sources
Diffstat (limited to 'test/source/event.cpp')
| -rw-r--r-- | test/source/event.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/test/source/event.cpp b/test/source/event.cpp new file mode 100644 index 0000000..5f19e81 --- /dev/null +++ b/test/source/event.cpp @@ -0,0 +1,152 @@ +#include <cerrno> +#include <functional> +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <memory> +#include <sdeventplus/event.hpp> +#include <sdeventplus/exception.hpp> +#include <sdeventplus/source/event.hpp> +#include <sdeventplus/test/sdevent.hpp> +#include <systemd/sd-event.h> +#include <utility> + +namespace sdeventplus +{ +namespace source +{ +namespace +{ + +using testing::DoAll; +using testing::Return; +using testing::SaveArg; +using testing::SetArgPointee; + +using UniqueEvent = std::unique_ptr<sdeventplus::Event, + std::function<void(sdeventplus::Event*)>>; + +class EventTest : public testing::Test +{ + protected: + testing::StrictMock<test::SdEventMock> mock; + 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](sdeventplus::Event* e) { + EXPECT_CALL(this->mock, sd_event_unref(event)) + .WillOnce(Return(nullptr)); + delete e; + }; + return UniqueEvent( + new sdeventplus::Event(event, std::false_type(), &mock), deleter); + } + + void expect_destruct() + { + { + testing::InSequence sequence; + 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(EventTest, DeferConstruct) +{ + 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))); + sd_event_handler_t handler; + EXPECT_CALL(mock, sd_event_add_defer(expected_event, testing::_, testing::_, + nullptr)) + .WillOnce(DoAll(SetArgPointee<1>(expected_source), SaveArg<2>(&handler), + Return(0))); + int completions = 0; + Event::Callback callback = [&completions](Event&) { completions++; }; + Defer defer(*event, std::move(callback)); + EXPECT_EQ(&defer, userdata); + EXPECT_FALSE(callback); + EXPECT_EQ(0, completions); + + EXPECT_EQ(0, handler(nullptr, &defer)); + EXPECT_EQ(1, completions); + + expect_destruct(); +} + +TEST_F(EventTest, PostConstruct) +{ + 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))); + sd_event_handler_t handler; + EXPECT_CALL(mock, sd_event_add_post(expected_event, testing::_, testing::_, + nullptr)) + .WillOnce(DoAll(SetArgPointee<1>(expected_source), SaveArg<2>(&handler), + Return(0))); + int completions = 0; + Event::Callback callback = [&completions](Event&) { completions++; }; + Post post(*event, std::move(callback)); + EXPECT_EQ(&post, userdata); + EXPECT_FALSE(callback); + EXPECT_EQ(0, completions); + + EXPECT_EQ(0, handler(nullptr, &post)); + EXPECT_EQ(1, completions); + + expect_destruct(); +} + +TEST_F(EventTest, ExitConstruct) +{ + 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))); + sd_event_handler_t handler; + EXPECT_CALL(mock, sd_event_add_exit(expected_event, testing::_, testing::_, + nullptr)) + .WillOnce(DoAll(SetArgPointee<1>(expected_source), SaveArg<2>(&handler), + Return(0))); + int completions = 0; + Event::Callback callback = [&completions](Event&) { completions++; }; + Exit exit(*event, std::move(callback)); + EXPECT_EQ(&exit, userdata); + EXPECT_FALSE(callback); + EXPECT_EQ(0, completions); + + EXPECT_EQ(0, handler(nullptr, &exit)); + EXPECT_EQ(1, completions); + + expect_destruct(); +} + +TEST_F(EventTest, ConstructFailure) +{ + EXPECT_CALL(mock, sd_event_add_defer(expected_event, testing::_, testing::_, + nullptr)) + .WillOnce(Return(-EINVAL)); + int completions = 0; + Event::Callback callback = [&completions](Event&) { completions++; }; + EXPECT_THROW(Defer(*event, std::move(callback)), SdEventError); + EXPECT_TRUE(callback); + EXPECT_EQ(0, completions); +} + +} // namespace +} // namespace source +} // namespace sdeventplus |

