Coverage Report

Created: 2023-11-12 09:30

/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