1 #include <gmock/gmock.h> 2 #include <gtest/gtest.h> 3 #include <memory> 4 #include <sdeventplus/event.hpp> 5 #include <sdeventplus/exception.hpp> 6 #include <sdeventplus/test/sdevent.hpp> 7 #include <type_traits> 8 9 namespace sdeventplus 10 { 11 namespace 12 { 13 14 using testing::DoAll; 15 using testing::Return; 16 using testing::SetArgPointee; 17 18 class EventTest : public testing::Test 19 { 20 protected: 21 testing::StrictMock<test::SdEventMock> mock; 22 sd_event* const expected_event = reinterpret_cast<sd_event*>(1234); 23 }; 24 25 TEST_F(EventTest, NewEventRef) 26 { 27 EXPECT_CALL(mock, sd_event_ref(expected_event)) 28 .WillOnce(Return(expected_event)); 29 Event event(expected_event, &mock); 30 31 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 32 } 33 34 TEST_F(EventTest, NewEventNoRef) 35 { 36 Event event(expected_event, std::false_type(), &mock); 37 38 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 39 } 40 41 TEST_F(EventTest, GetNewEvent) 42 { 43 EXPECT_CALL(mock, sd_event_new(testing::_)) 44 .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0))); 45 Event event = Event::get_new(&mock); 46 47 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 48 } 49 50 TEST_F(EventTest, GetNewEventFail) 51 { 52 EXPECT_CALL(mock, sd_event_new(testing::_)).WillOnce(Return(-EINVAL)); 53 EXPECT_THROW(Event::get_new(&mock), SdEventError); 54 } 55 56 TEST_F(EventTest, GetDefaultEvent) 57 { 58 EXPECT_CALL(mock, sd_event_default(testing::_)) 59 .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0))); 60 Event event = Event::get_default(&mock); 61 62 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 63 } 64 65 TEST_F(EventTest, GetDefaultEventFail) 66 { 67 EXPECT_CALL(mock, sd_event_default(testing::_)).WillOnce(Return(-EINVAL)); 68 EXPECT_THROW(Event::get_default(&mock), SdEventError); 69 } 70 71 class EventMethodTest : public EventTest 72 { 73 protected: 74 std::unique_ptr<Event> event; 75 76 void SetUp() 77 { 78 event = 79 std::make_unique<Event>(expected_event, std::false_type(), &mock); 80 } 81 82 void TearDown() 83 { 84 EXPECT_CALL(mock, sd_event_unref(expected_event)) 85 .WillOnce(Return(nullptr)); 86 } 87 }; 88 89 TEST_F(EventMethodTest, LoopSuccess) 90 { 91 EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(0)); 92 EXPECT_EQ(0, event->loop()); 93 } 94 95 TEST_F(EventMethodTest, LoopUserError) 96 { 97 const int user_error = 10; 98 EXPECT_CALL(mock, sd_event_loop(expected_event)) 99 .WillOnce(Return(user_error)); 100 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 101 EXPECT_EQ(user_error, 102 Event(expected_event, std::false_type(), &mock).loop()); 103 } 104 105 TEST_F(EventMethodTest, LoopInternalError) 106 { 107 EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(-EINVAL)); 108 EXPECT_THROW(event->loop(), SdEventError); 109 } 110 111 TEST_F(EventMethodTest, GetWatchdogSuccess) 112 { 113 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 114 .WillOnce(Return(0)); 115 EXPECT_EQ(0, event->get_watchdog()); 116 117 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 118 .WillOnce(Return(2)); 119 EXPECT_EQ(2, event->get_watchdog()); 120 } 121 122 TEST_F(EventMethodTest, GetWatchdogError) 123 { 124 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 125 .WillOnce(Return(-EINVAL)); 126 EXPECT_THROW(event->get_watchdog(), SdEventError); 127 } 128 129 TEST_F(EventMethodTest, SetWatchdogSuccess) 130 { 131 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 0)) 132 .WillOnce(Return(0)); 133 EXPECT_EQ(0, event->set_watchdog(0)); 134 135 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1)) 136 .WillOnce(Return(2)); 137 EXPECT_EQ(2, event->set_watchdog(1)); 138 } 139 140 TEST_F(EventMethodTest, SetWatchdogError) 141 { 142 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1)) 143 .WillOnce(Return(-EINVAL)); 144 EXPECT_THROW(event->set_watchdog(1), SdEventError); 145 } 146 147 } // namespace 148 } // namespace sdeventplus 149