/proc/self/cwd/test/mocks/event/mocks.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <chrono> |
4 | | #include <cstdint> |
5 | | #include <functional> |
6 | | #include <list> |
7 | | |
8 | | #include "envoy/common/scope_tracker.h" |
9 | | #include "envoy/common/time.h" |
10 | | #include "envoy/event/deferred_deletable.h" |
11 | | #include "envoy/event/dispatcher.h" |
12 | | #include "envoy/event/file_event.h" |
13 | | #include "envoy/event/scaled_range_timer_manager.h" |
14 | | #include "envoy/event/signal.h" |
15 | | #include "envoy/network/connection.h" |
16 | | #include "envoy/network/connection_handler.h" |
17 | | #include "envoy/network/dns.h" |
18 | | #include "envoy/network/listener.h" |
19 | | #include "envoy/network/transport_socket.h" |
20 | | #include "envoy/ssl/context.h" |
21 | | |
22 | | #include "source/common/common/scope_tracker.h" |
23 | | |
24 | | #include "test/mocks/buffer/mocks.h" |
25 | | #include "test/test_common/test_time.h" |
26 | | |
27 | | #include "gmock/gmock.h" |
28 | | |
29 | | namespace Envoy { |
30 | | namespace Event { |
31 | | |
32 | | class MockDispatcher : public Dispatcher { |
33 | | public: |
34 | | MockDispatcher(); |
35 | | MockDispatcher(const std::string& name); |
36 | | ~MockDispatcher() override; |
37 | | |
38 | | // Dispatcher |
39 | 0 | const std::string& name() override { return name_; } |
40 | 1.98M | TimeSource& timeSource() override { return *time_system_; } |
41 | 0 | GlobalTimeSystem& globalTimeSystem() { |
42 | 0 | return *(dynamic_cast<GlobalTimeSystem*>(time_system_.get())); |
43 | 0 | } |
44 | | Network::ServerConnectionPtr |
45 | | createServerConnection(Network::ConnectionSocketPtr&& socket, |
46 | | Network::TransportSocketPtr&& transport_socket, |
47 | 0 | StreamInfo::StreamInfo&) override { |
48 | | // The caller expects both the socket and the transport socket to be moved. |
49 | 0 | socket.reset(); |
50 | 0 | transport_socket.reset(); |
51 | 0 | return Network::ServerConnectionPtr{createServerConnection_()}; |
52 | 0 | } |
53 | | |
54 | | Network::ClientConnectionPtr |
55 | | createClientConnection(Network::Address::InstanceConstSharedPtr address, |
56 | | Network::Address::InstanceConstSharedPtr source_address, |
57 | | Network::TransportSocketPtr&& transport_socket, |
58 | | const Network::ConnectionSocket::OptionsSharedPtr& options, |
59 | 22.3k | const Network::TransportSocketOptionsConstSharedPtr&) override { |
60 | 22.3k | return Network::ClientConnectionPtr{ |
61 | 22.3k | createClientConnection_(address, source_address, transport_socket, options)}; |
62 | 22.3k | } |
63 | | |
64 | | FileEventPtr createFileEvent(os_fd_t fd, FileReadyCb cb, FileTriggerType trigger, |
65 | 0 | uint32_t events) override { |
66 | 0 | return FileEventPtr{createFileEvent_(fd, cb, trigger, events)}; |
67 | 0 | } |
68 | | |
69 | 0 | Filesystem::WatcherPtr createFilesystemWatcher() override { |
70 | 0 | return Filesystem::WatcherPtr{createFilesystemWatcher_()}; |
71 | 0 | } |
72 | | |
73 | | Network::ListenerPtr |
74 | | createListener(Network::SocketSharedPtr&& socket, Network::TcpListenerCallbacks& cb, |
75 | | Runtime::Loader& runtime, const Network::ListenerConfig& listener_config, |
76 | 0 | Server::ThreadLocalOverloadStateOptRef overload_state) override { |
77 | 0 | return Network::ListenerPtr{ |
78 | 0 | createListener_(std::move(socket), cb, runtime, listener_config, overload_state)}; |
79 | 0 | } |
80 | | |
81 | 14.5k | Event::TimerPtr createTimer(Event::TimerCb cb) override { |
82 | 14.5k | auto timer = Event::TimerPtr{createTimer_(cb)}; |
83 | | // Assert that the timer is not null to avoid confusing test failures down the line. |
84 | 14.5k | ASSERT(timer != nullptr); |
85 | 14.5k | return timer; |
86 | 14.5k | } |
87 | | |
88 | 0 | Event::TimerPtr createScaledTimer(ScaledTimerMinimum minimum, Event::TimerCb cb) override { |
89 | 0 | auto timer = Event::TimerPtr{createScaledTimer_(minimum, cb)}; |
90 | | // Assert that the timer is not null to avoid confusing test failures down the line. |
91 | 0 | ASSERT(timer != nullptr); |
92 | 0 | return timer; |
93 | 0 | } |
94 | | |
95 | 2.19k | Event::TimerPtr createScaledTimer(ScaledTimerType timer_type, Event::TimerCb cb) override { |
96 | 2.19k | auto timer = Event::TimerPtr{createScaledTypedTimer_(timer_type, cb)}; |
97 | | // Assert that the timer is not null to avoid confusing test failures down the line. |
98 | 2.19k | ASSERT(timer != nullptr); |
99 | 2.19k | return timer; |
100 | 2.19k | } |
101 | | |
102 | 25 | Event::SchedulableCallbackPtr createSchedulableCallback(std::function<void()> cb) override { |
103 | 25 | auto schedulable_cb = Event::SchedulableCallbackPtr{createSchedulableCallback_(cb)}; |
104 | 25 | if (!allow_null_callback_) { |
105 | | // Assert that schedulable_cb is not null to avoid confusing test failures down the line. |
106 | 25 | ASSERT(schedulable_cb != nullptr); |
107 | 25 | } |
108 | 25 | return schedulable_cb; |
109 | 25 | } |
110 | | |
111 | 254k | void deferredDelete(DeferredDeletablePtr&& to_delete) override { |
112 | 254k | if (to_delete) { |
113 | 254k | to_delete->deleteIsPending(); |
114 | 254k | } |
115 | 254k | deferredDelete_(to_delete.get()); |
116 | 254k | if (to_delete) { |
117 | 254k | to_delete_.push_back(std::move(to_delete)); |
118 | 254k | } |
119 | 254k | } |
120 | | |
121 | 0 | SignalEventPtr listenForSignal(signal_t signal_num, SignalCb cb) override { |
122 | 0 | return SignalEventPtr{listenForSignal_(signal_num, cb)}; |
123 | 0 | } |
124 | | |
125 | | // Event::Dispatcher |
126 | | MOCK_METHOD(void, registerWatchdog, |
127 | | (const Server::WatchDogSharedPtr&, std::chrono::milliseconds)); |
128 | | MOCK_METHOD(void, initializeStats, (Stats::Scope&, const absl::optional<std::string>&)); |
129 | | MOCK_METHOD(void, clearDeferredDeleteList, ()); |
130 | | MOCK_METHOD(Network::ServerConnection*, createServerConnection_, ()); |
131 | | MOCK_METHOD(Network::ClientConnection*, createClientConnection_, |
132 | | (Network::Address::InstanceConstSharedPtr address, |
133 | | Network::Address::InstanceConstSharedPtr source_address, |
134 | | Network::TransportSocketPtr& transport_socket, |
135 | | const Network::ConnectionSocket::OptionsSharedPtr& options)); |
136 | | MOCK_METHOD(FileEvent*, createFileEvent_, |
137 | | (os_fd_t fd, FileReadyCb cb, FileTriggerType trigger, uint32_t events)); |
138 | | MOCK_METHOD(Filesystem::Watcher*, createFilesystemWatcher_, ()); |
139 | | MOCK_METHOD(Network::Listener*, createListener_, |
140 | | (Network::SocketSharedPtr && socket, Network::TcpListenerCallbacks& cb, |
141 | | Runtime::Loader& runtime, const Network::ListenerConfig& listener_config, |
142 | | Server::ThreadLocalOverloadStateOptRef overload_state)); |
143 | | MOCK_METHOD(Timer*, createTimer_, (Event::TimerCb cb)); |
144 | | MOCK_METHOD(Timer*, createScaledTimer_, (ScaledTimerMinimum minimum, Event::TimerCb cb)); |
145 | | MOCK_METHOD(Timer*, createScaledTypedTimer_, (ScaledTimerType timer_type, Event::TimerCb cb)); |
146 | | MOCK_METHOD(SchedulableCallback*, createSchedulableCallback_, (std::function<void()> cb)); |
147 | | MOCK_METHOD(void, deferredDelete_, (DeferredDeletable * to_delete)); |
148 | | MOCK_METHOD(void, exit, ()); |
149 | | MOCK_METHOD(SignalEvent*, listenForSignal_, (signal_t signal_num, SignalCb cb)); |
150 | | MOCK_METHOD(void, post, (PostCb callback)); |
151 | | MOCK_METHOD(void, deleteInDispatcherThread, (DispatcherThreadDeletableConstPtr deletable)); |
152 | | MOCK_METHOD(void, run, (RunType type)); |
153 | | MOCK_METHOD(void, pushTrackedObject, (const ScopeTrackedObject* object)); |
154 | | MOCK_METHOD(void, popTrackedObject, (const ScopeTrackedObject* expected_object)); |
155 | | MOCK_METHOD(bool, trackedObjectStackIsEmpty, (), (const)); |
156 | | MOCK_METHOD(bool, isThreadSafe, (), (const)); |
157 | 547k | Buffer::WatermarkFactory& getWatermarkFactory() override { return buffer_factory_; } |
158 | | MOCK_METHOD(Thread::ThreadId, getCurrentThreadId, ()); |
159 | | MOCK_METHOD(MonotonicTime, approximateMonotonicTime, (), (const)); |
160 | | MOCK_METHOD(void, updateApproximateMonotonicTime, ()); |
161 | | MOCK_METHOD(void, shutdown, ()); |
162 | | |
163 | | std::unique_ptr<TimeSource> time_system_; |
164 | | std::list<DeferredDeletablePtr> to_delete_; |
165 | | testing::NiceMock<MockBufferFactory> buffer_factory_; |
166 | | bool allow_null_callback_{}; |
167 | | |
168 | | private: |
169 | | const std::string name_; |
170 | | }; |
171 | | |
172 | | class MockTimer : public Timer { |
173 | | public: |
174 | | MockTimer(); |
175 | | |
176 | | // Ownership of each MockTimer instance is transferred to the (caller of) dispatcher's |
177 | | // createTimer_(), so to avoid destructing it twice, the MockTimer must have been dynamically |
178 | | // allocated and must not be deleted by it's creator. |
179 | | MockTimer(MockDispatcher* dispatcher); |
180 | | ~MockTimer() override; |
181 | | |
182 | 22.1k | void invokeCallback() { |
183 | 22.1k | EXPECT_TRUE(enabled_); |
184 | 22.1k | enabled_ = false; |
185 | 22.1k | if (scope_ == nullptr) { |
186 | 22.1k | callback_(); |
187 | 22.1k | return; |
188 | 22.1k | } |
189 | 0 | ScopeTrackerScopeState scope(scope_, *dispatcher_); |
190 | 0 | scope_ = nullptr; |
191 | 0 | callback_(); |
192 | 0 | } |
193 | | |
194 | | // Timer |
195 | | MOCK_METHOD(void, disableTimer, ()); |
196 | | MOCK_METHOD(void, enableTimer, (std::chrono::milliseconds, const ScopeTrackedObject* scope)); |
197 | | MOCK_METHOD(void, enableHRTimer, (std::chrono::microseconds, const ScopeTrackedObject* scope)); |
198 | | MOCK_METHOD(bool, enabled, ()); |
199 | | |
200 | | MockDispatcher* dispatcher_{}; |
201 | | const ScopeTrackedObject* scope_{}; |
202 | | bool enabled_{}; |
203 | | |
204 | | Event::TimerCb callback_; |
205 | | |
206 | | // If not nullptr, will be set on dtor. This can help to verify that the timer was destroyed. |
207 | | bool* timer_destroyed_{}; |
208 | | }; |
209 | | |
210 | | class MockScaledRangeTimerManager : public ScaledRangeTimerManager { |
211 | | public: |
212 | 0 | TimerPtr createTimer(ScaledTimerMinimum minimum, TimerCb callback) override { |
213 | 0 | return TimerPtr{createTimer_(minimum, std::move(callback))}; |
214 | 0 | } |
215 | 0 | TimerPtr createTimer(ScaledTimerType timer_type, TimerCb callback) override { |
216 | 0 | return TimerPtr{createTypedTimer_(timer_type, std::move(callback))}; |
217 | 0 | } |
218 | | MOCK_METHOD(Timer*, createTimer_, (ScaledTimerMinimum, TimerCb)); |
219 | | MOCK_METHOD(Timer*, createTypedTimer_, (ScaledTimerType, TimerCb)); |
220 | | MOCK_METHOD(void, setScaleFactor, (UnitFloat), (override)); |
221 | | }; |
222 | | |
223 | | class MockSchedulableCallback : public SchedulableCallback { |
224 | | public: |
225 | | MockSchedulableCallback(MockDispatcher* dispatcher, |
226 | | testing::MockFunction<void()>* destroy_cb = nullptr); |
227 | | MockSchedulableCallback(MockDispatcher* dispatcher, std::function<void()> callback, |
228 | | testing::MockFunction<void()>* destroy_cb = nullptr); |
229 | | ~MockSchedulableCallback() override; |
230 | | |
231 | 0 | void invokeCallback() { |
232 | 0 | EXPECT_TRUE(enabled_); |
233 | 0 | enabled_ = false; |
234 | 0 | callback_(); |
235 | 0 | } |
236 | | |
237 | | // SchedulableCallback |
238 | | MOCK_METHOD(void, scheduleCallbackCurrentIteration, ()); |
239 | | MOCK_METHOD(void, scheduleCallbackNextIteration, ()); |
240 | | MOCK_METHOD(void, cancel, ()); |
241 | | MOCK_METHOD(bool, enabled, ()); |
242 | | |
243 | | MockDispatcher* dispatcher_{}; |
244 | | bool enabled_{}; |
245 | | |
246 | | private: |
247 | | std::function<void()> callback_; |
248 | | testing::MockFunction<void()>* destroy_cb_{nullptr}; |
249 | | }; |
250 | | |
251 | | class MockSignalEvent : public SignalEvent { |
252 | | public: |
253 | | MockSignalEvent(MockDispatcher* dispatcher); |
254 | | ~MockSignalEvent() override; |
255 | | |
256 | | SignalCb callback_; |
257 | | }; |
258 | | |
259 | | class MockFileEvent : public FileEvent { |
260 | | public: |
261 | | MockFileEvent(); |
262 | | ~MockFileEvent() override; |
263 | | |
264 | | MOCK_METHOD(void, activate, (uint32_t events)); |
265 | | MOCK_METHOD(void, setEnabled, (uint32_t events)); |
266 | | MOCK_METHOD(void, registerEventIfEmulatedEdge, (uint32_t event)); |
267 | | MOCK_METHOD(void, unregisterEventIfEmulatedEdge, (uint32_t event)); |
268 | | }; |
269 | | |
270 | | } // namespace Event |
271 | | } // namespace Envoy |