10a816c5dSWilliam A. Kennington III #include <gmock/gmock.h> 20a816c5dSWilliam A. Kennington III #include <gtest/gtest.h> 3*65db863eSWilliam A. Kennington III #include <sdeventplus/exception.hpp> 40a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp> 50a816c5dSWilliam A. Kennington III #include <sdeventplus/source/base.hpp> 60a816c5dSWilliam A. Kennington III #include <sdeventplus/test/sdevent.hpp> 7*65db863eSWilliam A. Kennington III #include <string> 80a816c5dSWilliam A. Kennington III #include <type_traits> 90a816c5dSWilliam A. Kennington III 100a816c5dSWilliam A. Kennington III namespace sdeventplus 110a816c5dSWilliam A. Kennington III { 120a816c5dSWilliam A. Kennington III namespace source 130a816c5dSWilliam A. Kennington III { 140a816c5dSWilliam A. Kennington III namespace 150a816c5dSWilliam A. Kennington III { 160a816c5dSWilliam A. Kennington III 17*65db863eSWilliam A. Kennington III using testing::DoAll; 180a816c5dSWilliam A. Kennington III using testing::Return; 19*65db863eSWilliam A. Kennington III using testing::SetArgPointee; 200a816c5dSWilliam A. Kennington III 210a816c5dSWilliam A. Kennington III class BaseImpl : public Base 220a816c5dSWilliam A. Kennington III { 230a816c5dSWilliam A. Kennington III public: 240a816c5dSWilliam A. Kennington III BaseImpl(sd_event_source* source, internal::SdEvent* sdevent) : 250a816c5dSWilliam A. Kennington III Base(source, sdevent) 260a816c5dSWilliam A. Kennington III { 270a816c5dSWilliam A. Kennington III } 280a816c5dSWilliam A. Kennington III BaseImpl(sd_event_source* source, std::false_type, 290a816c5dSWilliam A. Kennington III internal::SdEvent* sdevent) : 300a816c5dSWilliam A. Kennington III Base(source, std::false_type(), sdevent) 310a816c5dSWilliam A. Kennington III { 320a816c5dSWilliam A. Kennington III } 330a816c5dSWilliam A. Kennington III }; 340a816c5dSWilliam A. Kennington III 350a816c5dSWilliam A. Kennington III class BaseTest : public testing::Test 360a816c5dSWilliam A. Kennington III { 370a816c5dSWilliam A. Kennington III protected: 380a816c5dSWilliam A. Kennington III testing::StrictMock<test::SdEventMock> mock; 390a816c5dSWilliam A. Kennington III sd_event_source* const expected_source = 400a816c5dSWilliam A. Kennington III reinterpret_cast<sd_event_source*>(1234); 410a816c5dSWilliam A. Kennington III }; 420a816c5dSWilliam A. Kennington III 430a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseRef) 440a816c5dSWilliam A. Kennington III { 450a816c5dSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_ref(expected_source)) 460a816c5dSWilliam A. Kennington III .WillOnce(Return(expected_source)); 470a816c5dSWilliam A. Kennington III BaseImpl source(expected_source, &mock); 480a816c5dSWilliam A. Kennington III 49*65db863eSWilliam A. Kennington III { 50*65db863eSWilliam A. Kennington III testing::InSequence seq; 51*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 52*65db863eSWilliam A. Kennington III sd_event_source_set_enabled(expected_source, SD_EVENT_OFF)) 53*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 540a816c5dSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(expected_source)) 550a816c5dSWilliam A. Kennington III .WillOnce(Return(nullptr)); 560a816c5dSWilliam A. Kennington III } 57*65db863eSWilliam A. Kennington III } 580a816c5dSWilliam A. Kennington III 590a816c5dSWilliam A. Kennington III TEST_F(BaseTest, NewBaseNoRef) 600a816c5dSWilliam A. Kennington III { 610a816c5dSWilliam A. Kennington III BaseImpl source(expected_source, std::false_type(), &mock); 620a816c5dSWilliam A. Kennington III 63*65db863eSWilliam A. Kennington III { 64*65db863eSWilliam A. Kennington III testing::InSequence seq; 65*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 66*65db863eSWilliam A. Kennington III sd_event_source_set_enabled(expected_source, SD_EVENT_OFF)) 67*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 680a816c5dSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(expected_source)) 690a816c5dSWilliam A. Kennington III .WillOnce(Return(nullptr)); 700a816c5dSWilliam A. Kennington III } 71*65db863eSWilliam A. Kennington III } 72*65db863eSWilliam A. Kennington III 73*65db863eSWilliam A. Kennington III class BaseMethodTest : public BaseTest 74*65db863eSWilliam A. Kennington III { 75*65db863eSWilliam A. Kennington III protected: 76*65db863eSWilliam A. Kennington III std::unique_ptr<BaseImpl> base; 77*65db863eSWilliam A. Kennington III 78*65db863eSWilliam A. Kennington III void SetUp() 79*65db863eSWilliam A. Kennington III { 80*65db863eSWilliam A. Kennington III base = std::make_unique<BaseImpl>(expected_source, std::false_type(), 81*65db863eSWilliam A. Kennington III &mock); 82*65db863eSWilliam A. Kennington III } 83*65db863eSWilliam A. Kennington III 84*65db863eSWilliam A. Kennington III void TearDown() 85*65db863eSWilliam A. Kennington III { 86*65db863eSWilliam A. Kennington III { 87*65db863eSWilliam A. Kennington III testing::InSequence seq; 88*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, 89*65db863eSWilliam A. Kennington III SD_EVENT_OFF)) 90*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 91*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_unref(expected_source)) 92*65db863eSWilliam A. Kennington III .WillOnce(Return(nullptr)); 93*65db863eSWilliam A. Kennington III } 94*65db863eSWilliam A. Kennington III } 95*65db863eSWilliam A. Kennington III }; 96*65db863eSWilliam A. Kennington III 97*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionSuccess) 98*65db863eSWilliam A. Kennington III { 99*65db863eSWilliam A. Kennington III const char* expected = "test_desc"; 100*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 101*65db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 102*65db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(expected), Return(0))); 103*65db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 104*65db863eSWilliam A. Kennington III EXPECT_EQ(expected, base->get_description()); 105*65db863eSWilliam A. Kennington III } 106*65db863eSWilliam A. Kennington III 107*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetDescriptionError) 108*65db863eSWilliam A. Kennington III { 109*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 110*65db863eSWilliam A. Kennington III sd_event_source_get_description(expected_source, testing::_)) 111*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 112*65db863eSWilliam A. Kennington III EXPECT_THROW(base->get_description(), SdEventError); 113*65db863eSWilliam A. Kennington III } 114*65db863eSWilliam A. Kennington III 115*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionSuccess) 116*65db863eSWilliam A. Kennington III { 117*65db863eSWilliam A. Kennington III const char* expected = "test desc"; 118*65db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 119*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 120*65db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 121*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 122*65db863eSWilliam A. Kennington III base->set_description(expected); 123*65db863eSWilliam A. Kennington III } 124*65db863eSWilliam A. Kennington III 125*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetDescriptionError) 126*65db863eSWilliam A. Kennington III { 127*65db863eSWilliam A. Kennington III const char* expected = "test desc"; 128*65db863eSWilliam A. Kennington III // Intentionally comparing pointers to make sure no copying is happening 129*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, 130*65db863eSWilliam A. Kennington III sd_event_source_set_description(expected_source, expected)) 131*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 132*65db863eSWilliam A. Kennington III EXPECT_THROW(base->set_description(expected), SdEventError); 133*65db863eSWilliam A. Kennington III } 134*65db863eSWilliam A. Kennington III 135*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingSuccess) 136*65db863eSWilliam A. Kennington III { 137*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 138*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 139*65db863eSWilliam A. Kennington III EXPECT_EQ(0, base->get_pending()); 140*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 141*65db863eSWilliam A. Kennington III .WillOnce(Return(4)); 142*65db863eSWilliam A. Kennington III EXPECT_EQ(4, base->get_pending()); 143*65db863eSWilliam A. Kennington III } 144*65db863eSWilliam A. Kennington III 145*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPendingError) 146*65db863eSWilliam A. Kennington III { 147*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_pending(expected_source)) 148*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 149*65db863eSWilliam A. Kennington III EXPECT_THROW(base->get_pending(), SdEventError); 150*65db863eSWilliam A. Kennington III } 151*65db863eSWilliam A. Kennington III 152*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPrioritySuccess) 153*65db863eSWilliam A. Kennington III { 154*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 155*65db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(1024), Return(0))); 156*65db863eSWilliam A. Kennington III EXPECT_EQ(1024, base->get_priority()); 157*65db863eSWilliam A. Kennington III } 158*65db863eSWilliam A. Kennington III 159*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetPriorityError) 160*65db863eSWilliam A. Kennington III { 161*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_priority(expected_source, testing::_)) 162*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 163*65db863eSWilliam A. Kennington III EXPECT_THROW(base->get_priority(), SdEventError); 164*65db863eSWilliam A. Kennington III } 165*65db863eSWilliam A. Kennington III 166*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPrioritySuccess) 167*65db863eSWilliam A. Kennington III { 168*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 169*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 170*65db863eSWilliam A. Kennington III base->set_priority(1024); 171*65db863eSWilliam A. Kennington III } 172*65db863eSWilliam A. Kennington III 173*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetPriorityError) 174*65db863eSWilliam A. Kennington III { 175*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_priority(expected_source, 1024)) 176*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 177*65db863eSWilliam A. Kennington III EXPECT_THROW(base->set_priority(1024), SdEventError); 178*65db863eSWilliam A. Kennington III } 179*65db863eSWilliam A. Kennington III 180*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledSuccess) 181*65db863eSWilliam A. Kennington III { 182*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 183*65db863eSWilliam A. Kennington III .WillOnce(DoAll(SetArgPointee<1>(SD_EVENT_ON), Return(0))); 184*65db863eSWilliam A. Kennington III EXPECT_EQ(SD_EVENT_ON, base->get_enabled()); 185*65db863eSWilliam A. Kennington III } 186*65db863eSWilliam A. Kennington III 187*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, GetEnabledError) 188*65db863eSWilliam A. Kennington III { 189*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_get_enabled(expected_source, testing::_)) 190*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 191*65db863eSWilliam A. Kennington III EXPECT_THROW(base->get_enabled(), SdEventError); 192*65db863eSWilliam A. Kennington III } 193*65db863eSWilliam A. Kennington III 194*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledSuccess) 195*65db863eSWilliam A. Kennington III { 196*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, SD_EVENT_ON)) 197*65db863eSWilliam A. Kennington III .WillOnce(Return(0)); 198*65db863eSWilliam A. Kennington III base->set_enabled(SD_EVENT_ON); 199*65db863eSWilliam A. Kennington III } 200*65db863eSWilliam A. Kennington III 201*65db863eSWilliam A. Kennington III TEST_F(BaseMethodTest, SetEnabledError) 202*65db863eSWilliam A. Kennington III { 203*65db863eSWilliam A. Kennington III EXPECT_CALL(mock, sd_event_source_set_enabled(expected_source, SD_EVENT_ON)) 204*65db863eSWilliam A. Kennington III .WillOnce(Return(-EINVAL)); 205*65db863eSWilliam A. Kennington III EXPECT_THROW(base->set_enabled(SD_EVENT_ON), SdEventError); 206*65db863eSWilliam A. Kennington III } 2070a816c5dSWilliam A. Kennington III 2080a816c5dSWilliam A. Kennington III } // namespace 2090a816c5dSWilliam A. Kennington III } // namespace source 2100a816c5dSWilliam A. Kennington III } // namespace sdeventplus 211