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 EXPECT_EQ(&mock, event.getSdEvent()); 31 EXPECT_EQ(expected_event, event.get()); 32 33 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 34 } 35 36 TEST_F(EventTest, NewEventNoRef) 37 { 38 Event event(expected_event, std::false_type(), &mock); 39 EXPECT_EQ(&mock, event.getSdEvent()); 40 EXPECT_EQ(expected_event, event.get()); 41 42 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 43 } 44 45 TEST_F(EventTest, GetNewEvent) 46 { 47 EXPECT_CALL(mock, sd_event_new(testing::_)) 48 .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0))); 49 Event event = Event::get_new(&mock); 50 EXPECT_EQ(&mock, event.getSdEvent()); 51 EXPECT_EQ(expected_event, event.get()); 52 53 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 54 } 55 56 TEST_F(EventTest, GetNewEventFail) 57 { 58 EXPECT_CALL(mock, sd_event_new(testing::_)).WillOnce(Return(-EINVAL)); 59 EXPECT_THROW(Event::get_new(&mock), SdEventError); 60 } 61 62 TEST_F(EventTest, GetDefaultEvent) 63 { 64 EXPECT_CALL(mock, sd_event_default(testing::_)) 65 .WillOnce(DoAll(SetArgPointee<0>(expected_event), Return(0))); 66 Event event = Event::get_default(&mock); 67 EXPECT_EQ(&mock, event.getSdEvent()); 68 EXPECT_EQ(expected_event, event.get()); 69 70 EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr)); 71 } 72 73 TEST_F(EventTest, GetDefaultEventFail) 74 { 75 EXPECT_CALL(mock, sd_event_default(testing::_)).WillOnce(Return(-EINVAL)); 76 EXPECT_THROW(Event::get_default(&mock), SdEventError); 77 } 78 79 class EventMethodTest : public EventTest 80 { 81 protected: 82 std::unique_ptr<Event> event; 83 84 void SetUp() 85 { 86 event = 87 std::make_unique<Event>(expected_event, std::false_type(), &mock); 88 } 89 90 void TearDown() 91 { 92 EXPECT_CALL(mock, sd_event_unref(expected_event)) 93 .WillOnce(Return(nullptr)); 94 } 95 }; 96 97 TEST_F(EventMethodTest, LoopSuccess) 98 { 99 EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(0)); 100 EXPECT_EQ(0, event->loop()); 101 } 102 103 TEST_F(EventMethodTest, LoopUserError) 104 { 105 const int user_error = 10; 106 EXPECT_CALL(mock, sd_event_loop(expected_event)) 107 .WillOnce(Return(user_error)); 108 EXPECT_EQ(user_error, event->loop()); 109 } 110 111 TEST_F(EventMethodTest, LoopInternalError) 112 { 113 EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(-EINVAL)); 114 EXPECT_THROW(event->loop(), SdEventError); 115 } 116 117 TEST_F(EventMethodTest, GetWatchdogSuccess) 118 { 119 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 120 .WillOnce(Return(0)); 121 EXPECT_EQ(0, event->get_watchdog()); 122 123 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 124 .WillOnce(Return(2)); 125 EXPECT_EQ(2, event->get_watchdog()); 126 } 127 128 TEST_F(EventMethodTest, GetWatchdogError) 129 { 130 EXPECT_CALL(mock, sd_event_get_watchdog(expected_event)) 131 .WillOnce(Return(-EINVAL)); 132 EXPECT_THROW(event->get_watchdog(), SdEventError); 133 } 134 135 TEST_F(EventMethodTest, SetWatchdogSuccess) 136 { 137 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 0)) 138 .WillOnce(Return(0)); 139 EXPECT_EQ(0, event->set_watchdog(0)); 140 141 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1)) 142 .WillOnce(Return(2)); 143 EXPECT_EQ(2, event->set_watchdog(1)); 144 } 145 146 TEST_F(EventMethodTest, SetWatchdogError) 147 { 148 EXPECT_CALL(mock, sd_event_set_watchdog(expected_event, 1)) 149 .WillOnce(Return(-EINVAL)); 150 EXPECT_THROW(event->set_watchdog(1), SdEventError); 151 } 152 153 } // namespace 154 } // namespace sdeventplus 155