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.
17 #include <type_traits>
19 #include <sys/epoll.h>
21 #include <gtest/gtest.h>
22 #include "private/redis/hiredisepolladapter.hpp"
23 #include "private/tst/enginemock.hpp"
24 #include "private/tst/hiredissystemmock.hpp"
26 using namespace shareddatalayer;
27 using namespace shareddatalayer::redis;
28 using namespace shareddatalayer::tst;
29 using namespace testing;
33 class HiredisEpollAdapterTest: public testing::Test
36 StrictMock<EngineMock> engineMock;
37 StrictMock<HiredisSystemMock> hiredisSystemMock;
40 std::unique_ptr<HiredisEpollAdapter> adapter;
41 Engine::EventHandler savedEventHandler;
43 HiredisEpollAdapterTest():
48 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));
51 void expectAddMonitoredFD(int fd, unsigned int events)
53 EXPECT_CALL(engineMock, addMonitoredFD(fd,events,_))
55 .WillOnce(SaveArg<2>(&savedEventHandler));
58 void expectModifyMonitoredFD(int fd, unsigned int events)
60 EXPECT_CALL(engineMock, modifyMonitoredFD(fd,events))
64 void expectDeleteMonitoredFD(int fd)
66 EXPECT_CALL(engineMock, deleteMonitoredFD(fd))
71 class HiredisEpollAdapterAttachedTest: public HiredisEpollAdapterTest
74 HiredisEpollAdapterAttachedTest()
76 expectAddMonitoredFD(ac.c.fd, 0);
80 ~HiredisEpollAdapterAttachedTest()
82 expectDeleteMonitoredFD(ac.c.fd);
87 TEST_F(HiredisEpollAdapterTest, IsNotCopyable)
89 EXPECT_FALSE(std::is_copy_constructible<HiredisEpollAdapter>::value);
90 EXPECT_FALSE(std::is_copy_assignable<HiredisEpollAdapter>::value);
93 TEST_F(HiredisEpollAdapterAttachedTest, CanHandleInputEvents)
96 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
97 ac.ev.addRead(ac.ev.data);
98 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleRead(&ac))
100 savedEventHandler(EngineMock::EVENT_IN);
103 TEST_F(HiredisEpollAdapterAttachedTest, DoesNotHandleInputEventIfNotReading)
106 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleRead(&ac))
108 savedEventHandler(EngineMock::EVENT_IN);
111 TEST_F(HiredisEpollAdapterAttachedTest, CanHandleOutputEvents)
114 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
115 ac.ev.addWrite(ac.ev.data);
116 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleWrite(&ac))
118 savedEventHandler(EngineMock::EVENT_OUT);
121 TEST_F(HiredisEpollAdapterAttachedTest, DoesNotHandleOutputEventIfNotWriting)
124 EXPECT_CALL(hiredisSystemMock, redisAsyncHandleWrite(&ac))
126 savedEventHandler(EngineMock::EVENT_OUT);
129 TEST_F(HiredisEpollAdapterAttachedTest, CanBeAttachedAndEventStateChangedIdempotently)
132 EXPECT_EQ(adapter.get(), ac.ev.data);
133 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
134 ac.ev.addRead(ac.ev.data);
135 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
136 ac.ev.addWrite(ac.ev.data);
137 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
138 ac.ev.delRead(ac.ev.data);
139 expectModifyMonitoredFD(ac.c.fd, 0);
140 ac.ev.delWrite(ac.ev.data);
141 expectModifyMonitoredFD(ac.c.fd,EngineMock::EVENT_IN);
142 ac.ev.addRead(ac.ev.data);
143 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
144 ac.ev.addWrite(ac.ev.data);
145 expectDeleteMonitoredFD(ac.c.fd);
146 ac.ev.cleanup(ac.ev.data);
147 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
148 ac.ev.addWrite(ac.ev.data);
149 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN | EngineMock::EVENT_OUT);
150 ac.ev.addRead(ac.ev.data);
151 expectAddMonitoredFD(ac.c.fd, 0);
152 adapter->attach(&ac);
155 TEST_F(HiredisEpollAdapterAttachedTest, FurtherAttachementsResetEventState)
158 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
159 ac.ev.addRead(ac.ev.data);
160 expectAddMonitoredFD(ac.c.fd, 0);
161 adapter->attach(&ac);
162 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
163 ac.ev.addWrite(ac.ev.data);
166 TEST_F(HiredisEpollAdapterAttachedTest, InputEventIsSetOnce)
169 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_IN);
170 ac.ev.addRead(ac.ev.data);
171 ac.ev.addRead(ac.ev.data);
174 TEST_F(HiredisEpollAdapterAttachedTest, OutputEventIsSetOnce)
177 expectModifyMonitoredFD(ac.c.fd, EngineMock::EVENT_OUT);
178 ac.ev.addWrite(ac.ev.data);
179 ac.ev.addWrite(ac.ev.data);
182 TEST_F(HiredisEpollAdapterAttachedTest, MakesCleanupIfDestructedWhileAttahced)
185 expectDeleteMonitoredFD(ac.c.fd);
186 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));
187 expectAddMonitoredFD(ac.c.fd, 0);
188 adapter->attach(&ac);
191 TEST_F(HiredisEpollAdapterTest, DoesNotMakeCleanupIfDestructedWhileNotAttahced)
194 adapter.reset(new HiredisEpollAdapter(engineMock, hiredisSystemMock));