2 Copyright (c) 2018-2019 Nokia.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
18 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 * platform project (RICP).
22 #include <type_traits>
24 #include <sys/epoll.h>
26 #include <gtest/gtest.h>
27 #include "private/redis/hiredisepolladapter.hpp"
28 #include "private/tst/enginemock.hpp"
29 #include "private/tst/hiredissystemmock.hpp"
31 using namespace shareddatalayer;
32 using namespace shareddatalayer::redis;
33 using namespace shareddatalayer::tst;
34 using namespace testing;
38 class HiredisEpollAdapterTest: public testing::Test
41 StrictMock<EngineMock> engineMock;
42 StrictMock<HiredisSystemMock> hiredisSystemMock;
45 std::unique_ptr<HiredisEpollAdapter> adapter;
46 Engine::EventHandler savedEventHandler;
48 HiredisEpollAdapterTest():
53 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));
56 void expectAddMonitoredFD(int fd, unsigned int events)
58 EXPECT_CALL(engineMock, addMonitoredFD(fd,events,_))
60 .WillOnce(SaveArg<2>(&savedEventHandler));
63 void expectModifyMonitoredFD(int fd, unsigned int events)
65 EXPECT_CALL(engineMock, modifyMonitoredFD(fd,events))
69 void expectDeleteMonitoredFD(int fd)
71 EXPECT_CALL(engineMock, deleteMonitoredFD(fd))
76 class HiredisEpollAdapterAttachedTest: public HiredisEpollAdapterTest
79 HiredisEpollAdapterAttachedTest()
81 expectAddMonitoredFD(ac.c.fd, 0);
85 ~HiredisEpollAdapterAttachedTest()
87 expectDeleteMonitoredFD(ac.c.fd);
92 TEST_F(HiredisEpollAdapterTest, IsNotCopyable)
94 EXPECT_FALSE(std::is_copy_constructible<HiredisEpollAdapter>::value);
95 EXPECT_FALSE(std::is_copy_assignable<HiredisEpollAdapter>::value);
98 TEST_F(HiredisEpollAdapterAttachedTest, CanHandleInputEvents)
101 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
102 ac.ev.addRead(ac.ev.data);
103 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleRead(&ac))
105 savedEventHandler(EngineMock::EVENT_IN);
108 TEST_F(HiredisEpollAdapterAttachedTest, DoesNotHandleInputEventIfNotReading)
111 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleRead(&ac))
113 savedEventHandler(EngineMock::EVENT_IN);
116 TEST_F(HiredisEpollAdapterAttachedTest, CanHandleOutputEvents)
119 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
120 ac.ev.addWrite(ac.ev.data);
121 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleWrite(&ac))
123 savedEventHandler(EngineMock::EVENT_OUT);
126 TEST_F(HiredisEpollAdapterAttachedTest, DoesNotHandleOutputEventIfNotWriting)
129 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleWrite(&ac))
131 savedEventHandler(EngineMock::EVENT_OUT);
134 TEST_F(HiredisEpollAdapterAttachedTest, CanBeAttachedAndEventStateChangedIdempotently)
137 EXPECT_EQ(adapter.get(), ac.ev.data);
138 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
139 ac.ev.addRead(ac.ev.data);
140 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
141 ac.ev.addWrite(ac.ev.data);
142 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
143 ac.ev.delRead(ac.ev.data);
144 expectModifyMonitoredFD(ac.c.fd, 0);
145 ac.ev.delWrite(ac.ev.data);
146 expectModifyMonitoredFD(ac.c.fd,EngineMock::EVENT_IN);
147 ac.ev.addRead(ac.ev.data);
148 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
149 ac.ev.addWrite(ac.ev.data);
150 expectDeleteMonitoredFD(ac.c.fd);
151 ac.ev.cleanup(ac.ev.data);
152 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
153 ac.ev.addWrite(ac.ev.data);
154 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
155 ac.ev.addRead(ac.ev.data);
156 expectAddMonitoredFD(ac.c.fd, 0);
157 adapter->attach(&ac);
160 TEST_F(HiredisEpollAdapterAttachedTest, FurtherAttachementsResetEventState)
163 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
164 ac.ev.addRead(ac.ev.data);
165 expectAddMonitoredFD(ac.c.fd, 0);
166 adapter->attach(&ac);
167 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
168 ac.ev.addWrite(ac.ev.data);
171 TEST_F(HiredisEpollAdapterAttachedTest, InputEventIsSetOnce)
174 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
175 ac.ev.addRead(ac.ev.data);
176 ac.ev.addRead(ac.ev.data);
179 TEST_F(HiredisEpollAdapterAttachedTest, OutputEventIsSetOnce)
182 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
183 ac.ev.addWrite(ac.ev.data);
184 ac.ev.addWrite(ac.ev.data);
187 TEST_F(HiredisEpollAdapterAttachedTest, MakesCleanupIfDestructedWhileAttahced)
190 expectDeleteMonitoredFD(ac.c.fd);
191 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));
192 expectAddMonitoredFD(ac.c.fd, 0);
193 adapter->attach(&ac);
196 TEST_F(HiredisEpollAdapterTest, DoesNotMakeCleanupIfDestructedWhileNotAttahced)
199 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));