/proc/self/cwd/test/mocks/http/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 | | #include <memory> |
8 | | #include <string> |
9 | | |
10 | | #include "envoy/access_log/access_log.h" |
11 | | #include "envoy/http/async_client.h" |
12 | | #include "envoy/http/codec.h" |
13 | | #include "envoy/http/conn_pool.h" |
14 | | #include "envoy/http/filter.h" |
15 | | #include "envoy/matcher/matcher.h" |
16 | | #include "envoy/ssl/connection.h" |
17 | | |
18 | | #include "source/common/http/conn_manager_config.h" |
19 | | #include "source/common/http/filter_manager.h" |
20 | | #include "source/common/http/header_map_impl.h" |
21 | | #include "source/common/http/utility.h" |
22 | | |
23 | | #include "test/mocks/common.h" |
24 | | #include "test/mocks/event/mocks.h" |
25 | | #include "test/mocks/http/conn_pool.h" |
26 | | #include "test/mocks/http/stream.h" |
27 | | #include "test/mocks/http/stream_decoder.h" |
28 | | #include "test/mocks/http/stream_encoder.h" |
29 | | #include "test/mocks/router/mocks.h" |
30 | | #include "test/mocks/stream_info/mocks.h" |
31 | | #include "test/mocks/tracing/mocks.h" |
32 | | #include "test/mocks/upstream/cluster_info.h" |
33 | | #include "test/mocks/upstream/host.h" |
34 | | #include "test/test_common/printers.h" |
35 | | |
36 | | #include "absl/strings/ascii.h" |
37 | | #include "absl/strings/str_cat.h" |
38 | | #include "absl/strings/str_join.h" |
39 | | #include "gmock/gmock.h" |
40 | | |
41 | | namespace Envoy { |
42 | | namespace Http { |
43 | | |
44 | | class MockConnectionCallbacks : public virtual ConnectionCallbacks { |
45 | | public: |
46 | | MockConnectionCallbacks(); |
47 | | ~MockConnectionCallbacks() override; |
48 | | |
49 | | // Http::ConnectionCallbacks |
50 | | MOCK_METHOD(void, onGoAway, (GoAwayErrorCode error_code)); |
51 | | MOCK_METHOD(void, onSettings, (ReceivedSettings & settings)); |
52 | | }; |
53 | | |
54 | | class MockFilterManagerCallbacks : public FilterManagerCallbacks { |
55 | | public: |
56 | | MockFilterManagerCallbacks(); |
57 | | ~MockFilterManagerCallbacks() override; |
58 | | |
59 | | MOCK_METHOD(void, encodeHeaders, (ResponseHeaderMap&, bool)); |
60 | | MOCK_METHOD(void, encode1xxHeaders, (ResponseHeaderMap&)); |
61 | | MOCK_METHOD(void, encodeData, (Buffer::Instance&, bool)); |
62 | | MOCK_METHOD(void, encodeTrailers, (ResponseTrailerMap&)); |
63 | | MOCK_METHOD(void, encodeMetadata, (MetadataMapPtr &&)); |
64 | | MOCK_METHOD(void, chargeStats, (const ResponseHeaderMap&)); |
65 | | MOCK_METHOD(void, setRequestTrailers, (RequestTrailerMapPtr &&)); |
66 | | MOCK_METHOD(void, setInformationalHeaders_, (ResponseHeaderMap&)); |
67 | 0 | void setInformationalHeaders(ResponseHeaderMapPtr&& informational_headers) override { |
68 | 0 | informational_headers_ = std::move(informational_headers); |
69 | 0 | setInformationalHeaders_(*informational_headers_); |
70 | 0 | } |
71 | | MOCK_METHOD(void, setResponseHeaders_, (ResponseHeaderMap&)); |
72 | 0 | void setResponseHeaders(ResponseHeaderMapPtr&& response_headers) override { |
73 | 0 | response_headers_ = std::move(response_headers); |
74 | 0 | setResponseHeaders_(*response_headers_); |
75 | 0 | } |
76 | | MOCK_METHOD(void, setResponseTrailers_, (ResponseTrailerMap&)); |
77 | 0 | void setResponseTrailers(ResponseTrailerMapPtr&& response_trailers) override { |
78 | 0 | response_trailers_ = std::move(response_trailers); |
79 | 0 | setResponseTrailers_(*response_trailers_); |
80 | 0 | } |
81 | | MOCK_METHOD(RequestHeaderMapOptRef, requestHeaders, ()); |
82 | | MOCK_METHOD(RequestTrailerMapOptRef, requestTrailers, ()); |
83 | | MOCK_METHOD(ResponseHeaderMapOptRef, informationalHeaders, ()); |
84 | | MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, ()); |
85 | | MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, ()); |
86 | | MOCK_METHOD(void, endStream, ()); |
87 | | MOCK_METHOD(void, onDecoderFilterBelowWriteBufferLowWatermark, ()); |
88 | | MOCK_METHOD(void, onDecoderFilterAboveWriteBufferHighWatermark, ()); |
89 | | MOCK_METHOD(void, upgradeFilterChainCreated, ()); |
90 | | MOCK_METHOD(void, disarmRequestTimeout, ()); |
91 | | MOCK_METHOD(void, resetIdleTimer, ()); |
92 | | MOCK_METHOD(void, recreateStream, (StreamInfo::FilterStateSharedPtr filter_state)); |
93 | | MOCK_METHOD(void, resetStream, |
94 | | (Http::StreamResetReason reset_reason, absl::string_view transport_failure_reason)); |
95 | | MOCK_METHOD(const Router::RouteEntry::UpgradeMap*, upgradeMap, ()); |
96 | | MOCK_METHOD(Upstream::ClusterInfoConstSharedPtr, clusterInfo, ()); |
97 | | MOCK_METHOD(Router::RouteConstSharedPtr, route, (const Router::RouteCallback& cb)); |
98 | | MOCK_METHOD(void, setRoute, (Router::RouteConstSharedPtr)); |
99 | | MOCK_METHOD(void, clearRouteCache, ()); |
100 | | MOCK_METHOD(absl::optional<Router::ConfigConstSharedPtr>, routeConfig, ()); |
101 | | MOCK_METHOD(void, requestRouteConfigUpdate, (Http::RouteConfigUpdatedCallbackSharedPtr)); |
102 | | MOCK_METHOD(Tracing::Span&, activeSpan, ()); |
103 | | MOCK_METHOD(void, onResponseDataTooLarge, ()); |
104 | | MOCK_METHOD(void, onRequestDataTooLarge, ()); |
105 | | MOCK_METHOD(Http1StreamEncoderOptionsOptRef, http1StreamEncoderOptions, ()); |
106 | | MOCK_METHOD(OptRef<DownstreamStreamFilterCallbacks>, downstreamCallbacks, ()); |
107 | | MOCK_METHOD(OptRef<UpstreamStreamFilterCallbacks>, upstreamCallbacks, ()); |
108 | | MOCK_METHOD(void, onLocalReply, (Code code)); |
109 | | MOCK_METHOD(OptRef<const Tracing::Config>, tracingConfig, (), (const)); |
110 | | MOCK_METHOD(const ScopeTrackedObject&, scope, ()); |
111 | | MOCK_METHOD(void, restoreContextOnContinue, (ScopeTrackedObjectStack&)); |
112 | | MOCK_METHOD(bool, isHalfCloseEnabled, ()); |
113 | | |
114 | | ResponseHeaderMapPtr informational_headers_; |
115 | | ResponseHeaderMapPtr response_headers_; |
116 | | ResponseTrailerMapPtr response_trailers_; |
117 | | }; |
118 | | |
119 | | class MockServerConnectionCallbacks : public ServerConnectionCallbacks, |
120 | | public MockConnectionCallbacks { |
121 | | public: |
122 | | MockServerConnectionCallbacks(); |
123 | | ~MockServerConnectionCallbacks() override; |
124 | | |
125 | | // Http::ServerConnectionCallbacks |
126 | | MOCK_METHOD(RequestDecoder&, newStream, |
127 | | (ResponseEncoder & response_encoder, bool is_internally_created)); |
128 | | }; |
129 | | |
130 | | class MockStreamCallbacks : public StreamCallbacks { |
131 | | public: |
132 | | MockStreamCallbacks(); |
133 | | ~MockStreamCallbacks() override; |
134 | | |
135 | | // Http::StreamCallbacks |
136 | | MOCK_METHOD(void, onResetStream, (StreamResetReason reason, absl::string_view)); |
137 | | MOCK_METHOD(void, onAboveWriteBufferHighWatermark, ()); |
138 | | MOCK_METHOD(void, onBelowWriteBufferLowWatermark, ()); |
139 | | }; |
140 | | |
141 | | class MockServerConnection : public ServerConnection { |
142 | | public: |
143 | | MockServerConnection(); |
144 | | ~MockServerConnection() override; |
145 | | |
146 | | // Http::Connection |
147 | | MOCK_METHOD(Status, dispatch, (Buffer::Instance & data)); |
148 | | MOCK_METHOD(void, goAway, ()); |
149 | | MOCK_METHOD(Protocol, protocol, ()); |
150 | | MOCK_METHOD(void, shutdownNotice, ()); |
151 | | MOCK_METHOD(bool, wantsToWrite, ()); |
152 | | MOCK_METHOD(void, onUnderlyingConnectionAboveWriteBufferHighWatermark, ()); |
153 | | MOCK_METHOD(void, onUnderlyingConnectionBelowWriteBufferLowWatermark, ()); |
154 | | |
155 | | Protocol protocol_{Protocol::Http11}; |
156 | | }; |
157 | | |
158 | | class MockClientConnection : public ClientConnection { |
159 | | public: |
160 | | MockClientConnection(); |
161 | | ~MockClientConnection() override; |
162 | | |
163 | | // Http::Connection |
164 | | MOCK_METHOD(Status, dispatch, (Buffer::Instance & data)); |
165 | | MOCK_METHOD(void, goAway, ()); |
166 | | MOCK_METHOD(Protocol, protocol, ()); |
167 | | MOCK_METHOD(void, shutdownNotice, ()); |
168 | | MOCK_METHOD(bool, wantsToWrite, ()); |
169 | | MOCK_METHOD(void, onUnderlyingConnectionAboveWriteBufferHighWatermark, ()); |
170 | | MOCK_METHOD(void, onUnderlyingConnectionBelowWriteBufferLowWatermark, ()); |
171 | | |
172 | | // Http::ClientConnection |
173 | | MOCK_METHOD(RequestEncoder&, newStream, (ResponseDecoder & response_decoder)); |
174 | | }; |
175 | | |
176 | | class MockFilterChainFactoryCallbacks : public Http::FilterChainFactoryCallbacks { |
177 | | public: |
178 | | MockFilterChainFactoryCallbacks(); |
179 | | ~MockFilterChainFactoryCallbacks() override; |
180 | | |
181 | | MOCK_METHOD(void, addStreamDecoderFilter, (Http::StreamDecoderFilterSharedPtr filter)); |
182 | | MOCK_METHOD(void, addStreamEncoderFilter, (Http::StreamEncoderFilterSharedPtr filter)); |
183 | | MOCK_METHOD(void, addStreamFilter, (Http::StreamFilterSharedPtr filter)); |
184 | | MOCK_METHOD(void, addAccessLogHandler, (AccessLog::InstanceSharedPtr handler)); |
185 | | MOCK_METHOD(Event::Dispatcher&, dispatcher, ()); |
186 | | }; |
187 | | |
188 | | class MockFilterChainManager : public FilterChainManager { |
189 | | public: |
190 | | MockFilterChainManager(); |
191 | | ~MockFilterChainManager() override; |
192 | | |
193 | | // Http::FilterChainManager |
194 | | MOCK_METHOD(void, applyFilterFactoryCb, (FilterContext context, FilterFactoryCb& factory)); |
195 | | |
196 | | NiceMock<MockFilterChainFactoryCallbacks> callbacks_; |
197 | | }; |
198 | | |
199 | | class MockFilterChainFactory : public FilterChainFactory { |
200 | | public: |
201 | | MockFilterChainFactory(); |
202 | | ~MockFilterChainFactory() override; |
203 | | |
204 | | // Http::FilterChainFactory |
205 | | bool createFilterChain(FilterChainManager& manager, bool, |
206 | 179k | const FilterChainOptions&) const override { |
207 | 179k | return createFilterChain(manager); |
208 | 179k | } |
209 | | MOCK_METHOD(bool, createFilterChain, (FilterChainManager & manager), (const)); |
210 | | MOCK_METHOD(bool, createUpgradeFilterChain, |
211 | | (absl::string_view upgrade_type, const FilterChainFactory::UpgradeMap* upgrade_map, |
212 | | FilterChainManager& manager, const FilterChainOptions&), |
213 | | (const)); |
214 | | }; |
215 | | |
216 | | class MockStreamFilterCallbacksBase { |
217 | | public: |
218 | | NiceMock<Event::MockDispatcher> dispatcher_; |
219 | | testing::NiceMock<StreamInfo::MockStreamInfo> stream_info_; |
220 | | std::shared_ptr<Router::MockRoute> route_; |
221 | | std::shared_ptr<Upstream::MockClusterInfo> cluster_info_; |
222 | | }; |
223 | | |
224 | | class MockDownstreamStreamFilterCallbacks : public DownstreamStreamFilterCallbacks { |
225 | | public: |
226 | 8.77k | ~MockDownstreamStreamFilterCallbacks() override = default; |
227 | | |
228 | | MOCK_METHOD(Router::RouteConstSharedPtr, route, (const Router::RouteCallback&)); |
229 | | MOCK_METHOD(void, setRoute, (Router::RouteConstSharedPtr)); |
230 | | MOCK_METHOD(void, requestRouteConfigUpdate, (Http::RouteConfigUpdatedCallbackSharedPtr)); |
231 | | MOCK_METHOD(void, clearRouteCache, ()); |
232 | | |
233 | | std::shared_ptr<Router::MockRoute> route_; |
234 | | }; |
235 | | |
236 | | class MockSidestreamWatermarkCallbacks : public SidestreamWatermarkCallbacks { |
237 | | public: |
238 | | ~MockSidestreamWatermarkCallbacks() override = default; |
239 | | |
240 | | MOCK_METHOD(void, onSidestreamAboveHighWatermark, ()); |
241 | | MOCK_METHOD(void, onSidestreamBelowLowWatermark, ()); |
242 | | }; |
243 | | |
244 | | class MockStreamDecoderFilterCallbacks : public StreamDecoderFilterCallbacks, |
245 | | public MockStreamFilterCallbacksBase { |
246 | | public: |
247 | | MockStreamDecoderFilterCallbacks(); |
248 | | ~MockStreamDecoderFilterCallbacks() override; |
249 | | |
250 | | // Http::StreamFilterCallbacks |
251 | | MOCK_METHOD(OptRef<const Network::Connection>, connection, ()); |
252 | | MOCK_METHOD(Event::Dispatcher&, dispatcher, ()); |
253 | | MOCK_METHOD(void, resetStream, |
254 | | (Http::StreamResetReason reset_reason, absl::string_view transport_failure_reason)); |
255 | | MOCK_METHOD(void, resetIdleTimer, ()); |
256 | | MOCK_METHOD(Upstream::ClusterInfoConstSharedPtr, clusterInfo, ()); |
257 | | MOCK_METHOD(Router::RouteConstSharedPtr, route, ()); |
258 | | MOCK_METHOD(absl::optional<Router::ConfigConstSharedPtr>, routeConfig, ()); |
259 | | MOCK_METHOD(uint64_t, streamId, (), (const)); |
260 | | MOCK_METHOD(StreamInfo::StreamInfo&, streamInfo, ()); |
261 | | MOCK_METHOD(Tracing::Span&, activeSpan, ()); |
262 | | MOCK_METHOD(OptRef<const Tracing::Config>, tracingConfig, (), (const)); |
263 | | MOCK_METHOD(const ScopeTrackedObject&, scope, ()); |
264 | | MOCK_METHOD(void, restoreContextOnContinue, (ScopeTrackedObjectStack&)); |
265 | | MOCK_METHOD(void, onDecoderFilterAboveWriteBufferHighWatermark, ()); |
266 | | MOCK_METHOD(void, onDecoderFilterBelowWriteBufferLowWatermark, ()); |
267 | | MOCK_METHOD(void, addDownstreamWatermarkCallbacks, (DownstreamWatermarkCallbacks&)); |
268 | | MOCK_METHOD(void, removeDownstreamWatermarkCallbacks, (DownstreamWatermarkCallbacks&)); |
269 | | MOCK_METHOD(void, setDecoderBufferLimit, (uint32_t)); |
270 | | MOCK_METHOD(uint32_t, decoderBufferLimit, ()); |
271 | | MOCK_METHOD(bool, recreateStream, (const ResponseHeaderMap* headers)); |
272 | | MOCK_METHOD(void, addUpstreamSocketOptions, (const Network::Socket::OptionsSharedPtr& options)); |
273 | | MOCK_METHOD(Network::Socket::OptionsSharedPtr, getUpstreamSocketOptions, (), (const)); |
274 | | MOCK_METHOD(const Router::RouteSpecificFilterConfig*, mostSpecificPerFilterConfig, (), (const)); |
275 | | MOCK_METHOD(Router::RouteSpecificFilterConfigs, perFilterConfigs, (), (const)); |
276 | | MOCK_METHOD(Http1StreamEncoderOptionsOptRef, http1StreamEncoderOptions, ()); |
277 | | MOCK_METHOD(OptRef<DownstreamStreamFilterCallbacks>, downstreamCallbacks, ()); |
278 | | MOCK_METHOD(OptRef<UpstreamStreamFilterCallbacks>, upstreamCallbacks, ()); |
279 | | MOCK_METHOD(absl::string_view, filterConfigName, (), (const override)); |
280 | | MOCK_METHOD(RequestHeaderMapOptRef, requestHeaders, ()); |
281 | | MOCK_METHOD(RequestTrailerMapOptRef, requestTrailers, ()); |
282 | | MOCK_METHOD(ResponseHeaderMapOptRef, informationalHeaders, ()); |
283 | | MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, ()); |
284 | | MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, ()); |
285 | | |
286 | | // Http::StreamDecoderFilterCallbacks |
287 | | // NOLINTNEXTLINE(readability-identifier-naming) |
288 | | void sendLocalReply_(Code code, absl::string_view body, |
289 | | std::function<void(ResponseHeaderMap& headers)> modify_headers, |
290 | | const absl::optional<Grpc::Status::GrpcStatus> grpc_status, |
291 | | absl::string_view details); |
292 | | |
293 | 0 | void encode1xxHeaders(ResponseHeaderMapPtr&& headers) override { encode1xxHeaders_(*headers); } |
294 | | void encodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream, |
295 | 15.6k | absl::string_view details) override { |
296 | 15.6k | stream_info_.setResponseCodeDetails(details); |
297 | 15.6k | encodeHeaders_(*headers, end_stream); |
298 | 15.6k | } |
299 | 0 | void encodeTrailers(ResponseTrailerMapPtr&& trailers) override { encodeTrailers_(*trailers); } |
300 | 0 | void encodeMetadata(MetadataMapPtr&& metadata_map) override { |
301 | 0 | encodeMetadata_(std::move(metadata_map)); |
302 | 0 | } |
303 | 0 | absl::string_view details() { |
304 | 0 | if (stream_info_.responseCodeDetails()) { |
305 | 0 | return stream_info_.responseCodeDetails().value(); |
306 | 0 | } |
307 | 0 | return ""; |
308 | 0 | } |
309 | | |
310 | | MOCK_METHOD(void, continueDecoding, ()); |
311 | | MOCK_METHOD(void, addDecodedData, (Buffer::Instance & data, bool streaming)); |
312 | | MOCK_METHOD(void, injectDecodedDataToFilterChain, (Buffer::Instance & data, bool end_stream)); |
313 | | MOCK_METHOD(RequestTrailerMap&, addDecodedTrailers, ()); |
314 | | MOCK_METHOD(MetadataMapVector&, addDecodedMetadata, ()); |
315 | | MOCK_METHOD(const Buffer::Instance*, decodingBuffer, ()); |
316 | | MOCK_METHOD(void, modifyDecodingBuffer, (std::function<void(Buffer::Instance&)>)); |
317 | | MOCK_METHOD(void, encode1xxHeaders_, (HeaderMap & headers)); |
318 | | MOCK_METHOD(void, encodeHeaders_, (ResponseHeaderMap & headers, bool end_stream)); |
319 | | MOCK_METHOD(void, encodeData, (Buffer::Instance & data, bool end_stream)); |
320 | | MOCK_METHOD(void, encodeTrailers_, (ResponseTrailerMap & trailers)); |
321 | | MOCK_METHOD(void, encodeMetadata_, (MetadataMapPtr metadata_map)); |
322 | | MOCK_METHOD(void, sendLocalReply, |
323 | | (Code code, absl::string_view body, |
324 | | std::function<void(ResponseHeaderMap& headers)> modify_headers, |
325 | | const absl::optional<Grpc::Status::GrpcStatus> grpc_status, |
326 | | absl::string_view details)); |
327 | | MOCK_METHOD(Buffer::BufferMemoryAccountSharedPtr, account, (), (const)); |
328 | | MOCK_METHOD(void, setUpstreamOverrideHost, (Upstream::LoadBalancerContext::OverrideHost)); |
329 | | MOCK_METHOD(absl::optional<Upstream::LoadBalancerContext::OverrideHost>, upstreamOverrideHost, (), |
330 | | (const)); |
331 | | MOCK_METHOD(bool, shouldLoadShed, (), (const)); |
332 | | |
333 | | Buffer::InstancePtr buffer_; |
334 | | std::list<DownstreamWatermarkCallbacks*> callbacks_{}; |
335 | | testing::NiceMock<MockDownstreamStreamFilterCallbacks> downstream_callbacks_; |
336 | | testing::NiceMock<Tracing::MockSpan> active_span_; |
337 | | testing::NiceMock<Tracing::MockConfig> tracing_config_; |
338 | | testing::NiceMock<MockScopeTrackedObject> scope_; |
339 | | bool is_grpc_request_{}; |
340 | | bool is_head_request_{false}; |
341 | | bool stream_destroyed_{}; |
342 | | NiceMock<Event::MockDispatcher> dispatcher_; |
343 | | }; |
344 | | |
345 | | class MockStreamEncoderFilterCallbacks : public StreamEncoderFilterCallbacks, |
346 | | public MockStreamFilterCallbacksBase { |
347 | | public: |
348 | | MockStreamEncoderFilterCallbacks(); |
349 | | ~MockStreamEncoderFilterCallbacks() override; |
350 | | |
351 | | // Http::StreamFilterCallbacks |
352 | | MOCK_METHOD(OptRef<const Network::Connection>, connection, ()); |
353 | | MOCK_METHOD(Event::Dispatcher&, dispatcher, ()); |
354 | | MOCK_METHOD(void, resetStream, |
355 | | (Http::StreamResetReason reset_reason, absl::string_view transport_failure_reason)); |
356 | | MOCK_METHOD(void, resetIdleTimer, ()); |
357 | | MOCK_METHOD(Upstream::ClusterInfoConstSharedPtr, clusterInfo, ()); |
358 | | MOCK_METHOD(Router::RouteConstSharedPtr, route, ()); |
359 | | MOCK_METHOD(bool, canRequestRouteConfigUpdate, ()); |
360 | | MOCK_METHOD(uint64_t, streamId, (), (const)); |
361 | | MOCK_METHOD(StreamInfo::StreamInfo&, streamInfo, ()); |
362 | | MOCK_METHOD(Tracing::Span&, activeSpan, ()); |
363 | | MOCK_METHOD(OptRef<const Tracing::Config>, tracingConfig, (), (const)); |
364 | | MOCK_METHOD(const ScopeTrackedObject&, scope, ()); |
365 | | MOCK_METHOD(void, onEncoderFilterAboveWriteBufferHighWatermark, ()); |
366 | | MOCK_METHOD(void, onEncoderFilterBelowWriteBufferLowWatermark, ()); |
367 | | MOCK_METHOD(void, setEncoderBufferLimit, (uint32_t)); |
368 | | MOCK_METHOD(uint32_t, encoderBufferLimit, ()); |
369 | | MOCK_METHOD(void, restoreContextOnContinue, (ScopeTrackedObjectStack&)); |
370 | | MOCK_METHOD(const Router::RouteSpecificFilterConfig*, mostSpecificPerFilterConfig, (), (const)); |
371 | | MOCK_METHOD(Router::RouteSpecificFilterConfigs, perFilterConfigs, (), (const)); |
372 | | MOCK_METHOD(Http1StreamEncoderOptionsOptRef, http1StreamEncoderOptions, ()); |
373 | | MOCK_METHOD(OptRef<DownstreamStreamFilterCallbacks>, downstreamCallbacks, ()); |
374 | | MOCK_METHOD(OptRef<UpstreamStreamFilterCallbacks>, upstreamCallbacks, ()); |
375 | | MOCK_METHOD(absl::string_view, filterConfigName, (), (const override)); |
376 | | MOCK_METHOD(RequestHeaderMapOptRef, requestHeaders, ()); |
377 | | MOCK_METHOD(RequestTrailerMapOptRef, requestTrailers, ()); |
378 | | MOCK_METHOD(ResponseHeaderMapOptRef, informationalHeaders, ()); |
379 | | MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, ()); |
380 | | MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, ()); |
381 | | |
382 | | // Http::StreamEncoderFilterCallbacks |
383 | | MOCK_METHOD(void, addEncodedData, (Buffer::Instance & data, bool streaming)); |
384 | | MOCK_METHOD(void, injectEncodedDataToFilterChain, (Buffer::Instance & data, bool end_stream)); |
385 | | MOCK_METHOD(ResponseTrailerMap&, addEncodedTrailers, ()); |
386 | | MOCK_METHOD(void, addEncodedMetadata, (Http::MetadataMapPtr &&)); |
387 | | MOCK_METHOD(void, continueEncoding, ()); |
388 | | MOCK_METHOD(const Buffer::Instance*, encodingBuffer, ()); |
389 | | MOCK_METHOD(void, modifyEncodingBuffer, (std::function<void(Buffer::Instance&)>)); |
390 | | MOCK_METHOD(void, sendLocalReply, |
391 | | (Code code, absl::string_view body, |
392 | | std::function<void(ResponseHeaderMap& headers)> modify_headers, |
393 | | const absl::optional<Grpc::Status::GrpcStatus> grpc_status, |
394 | | absl::string_view details)); |
395 | | |
396 | | Buffer::InstancePtr buffer_; |
397 | | testing::NiceMock<MockDownstreamStreamFilterCallbacks> downstream_callbacks_; |
398 | | testing::NiceMock<Tracing::MockSpan> active_span_; |
399 | | testing::NiceMock<Tracing::MockConfig> tracing_config_; |
400 | | testing::NiceMock<MockScopeTrackedObject> scope_; |
401 | | }; |
402 | | |
403 | | class MockStreamDecoderFilter : public StreamDecoderFilter { |
404 | | public: |
405 | | MockStreamDecoderFilter(); |
406 | | ~MockStreamDecoderFilter() override; |
407 | | |
408 | | // Http::StreamFilterBase |
409 | | MOCK_METHOD(void, onStreamComplete, ()); |
410 | | MOCK_METHOD(void, onDestroy, ()); |
411 | | MOCK_METHOD(void, onMatchCallback, (const Matcher::Action&)); |
412 | | MOCK_METHOD(LocalErrorStatus, onLocalReply, (const LocalReplyData&)); |
413 | | |
414 | | // Http::StreamDecoderFilter |
415 | | MOCK_METHOD(FilterHeadersStatus, decodeHeaders, (RequestHeaderMap & headers, bool end_stream)); |
416 | | MOCK_METHOD(FilterDataStatus, decodeData, (Buffer::Instance & data, bool end_stream)); |
417 | | MOCK_METHOD(FilterTrailersStatus, decodeTrailers, (RequestTrailerMap & trailers)); |
418 | | MOCK_METHOD(FilterMetadataStatus, decodeMetadata, (Http::MetadataMap & metadata_map)); |
419 | | MOCK_METHOD(void, setDecoderFilterCallbacks, (StreamDecoderFilterCallbacks & callbacks)); |
420 | | MOCK_METHOD(void, decodeComplete, ()); |
421 | | MOCK_METHOD(void, sendLocalReply, |
422 | | (Code code, absl::string_view body, |
423 | | const std::function<void(ResponseHeaderMap& headers)>& modify_headers, |
424 | | bool is_head_request, const absl::optional<Grpc::Status::GrpcStatus> grpc_status, |
425 | | absl::string_view details)); |
426 | | |
427 | | Http::StreamDecoderFilterCallbacks* callbacks_{}; |
428 | | }; |
429 | | |
430 | | class MockStreamEncoderFilter : public StreamEncoderFilter { |
431 | | public: |
432 | | MockStreamEncoderFilter(); |
433 | | ~MockStreamEncoderFilter() override; |
434 | | |
435 | | // Http::StreamFilterBase |
436 | | MOCK_METHOD(void, onStreamComplete, ()); |
437 | | MOCK_METHOD(void, onDestroy, ()); |
438 | | MOCK_METHOD(void, onMatchCallback, (const Matcher::Action&)); |
439 | | MOCK_METHOD(LocalErrorStatus, onLocalReply, (const LocalReplyData&)); |
440 | | |
441 | | // Http::MockStreamEncoderFilter |
442 | | MOCK_METHOD(Filter1xxHeadersStatus, encode1xxHeaders, (ResponseHeaderMap & headers)); |
443 | | MOCK_METHOD(FilterHeadersStatus, encodeHeaders, (ResponseHeaderMap & headers, bool end_stream)); |
444 | | MOCK_METHOD(FilterDataStatus, encodeData, (Buffer::Instance & data, bool end_stream)); |
445 | | MOCK_METHOD(FilterTrailersStatus, encodeTrailers, (ResponseTrailerMap & trailers)); |
446 | | MOCK_METHOD(FilterMetadataStatus, encodeMetadata, (MetadataMap & metadata_map)); |
447 | | MOCK_METHOD(void, setEncoderFilterCallbacks, (StreamEncoderFilterCallbacks & callbacks)); |
448 | | MOCK_METHOD(void, encodeComplete, ()); |
449 | | |
450 | | Http::StreamEncoderFilterCallbacks* callbacks_{}; |
451 | | }; |
452 | | |
453 | | class MockStreamFilter : public StreamFilter { |
454 | | public: |
455 | | MockStreamFilter(); |
456 | | ~MockStreamFilter() override; |
457 | | |
458 | | // Http::StreamFilterBase |
459 | | MOCK_METHOD(void, onStreamComplete, ()); |
460 | | MOCK_METHOD(void, onDestroy, ()); |
461 | | MOCK_METHOD(void, onMatchCallback, (const Matcher::Action&)); |
462 | | MOCK_METHOD(LocalErrorStatus, onLocalReply, (const LocalReplyData&)); |
463 | | |
464 | | // Http::StreamDecoderFilter |
465 | | MOCK_METHOD(FilterHeadersStatus, decodeHeaders, (RequestHeaderMap & headers, bool end_stream)); |
466 | | MOCK_METHOD(FilterDataStatus, decodeData, (Buffer::Instance & data, bool end_stream)); |
467 | | MOCK_METHOD(FilterTrailersStatus, decodeTrailers, (RequestTrailerMap & trailers)); |
468 | | MOCK_METHOD(FilterMetadataStatus, decodeMetadata, (Http::MetadataMap & metadata_map)); |
469 | | MOCK_METHOD(void, setDecoderFilterCallbacks, (StreamDecoderFilterCallbacks & callbacks)); |
470 | | MOCK_METHOD(void, decodeComplete, ()); |
471 | | |
472 | | // Http::MockStreamEncoderFilter |
473 | | MOCK_METHOD(Filter1xxHeadersStatus, encode1xxHeaders, (ResponseHeaderMap & headers)); |
474 | | MOCK_METHOD(ResponseHeaderMapOptRef, informationalHeaders, (), (const)); |
475 | | MOCK_METHOD(FilterHeadersStatus, encodeHeaders, (ResponseHeaderMap & headers, bool end_stream)); |
476 | | MOCK_METHOD(ResponseHeaderMapOptRef, responseHeaders, (), (const)); |
477 | | MOCK_METHOD(FilterDataStatus, encodeData, (Buffer::Instance & data, bool end_stream)); |
478 | | MOCK_METHOD(FilterTrailersStatus, encodeTrailers, (ResponseTrailerMap & trailers)); |
479 | | MOCK_METHOD(ResponseTrailerMapOptRef, responseTrailers, (), (const)); |
480 | | MOCK_METHOD(FilterMetadataStatus, encodeMetadata, (MetadataMap & metadata_map)); |
481 | | MOCK_METHOD(void, setEncoderFilterCallbacks, (StreamEncoderFilterCallbacks & callbacks)); |
482 | | MOCK_METHOD(void, encodeComplete, ()); |
483 | | |
484 | | Http::StreamDecoderFilterCallbacks* decoder_callbacks_{}; |
485 | | Http::StreamEncoderFilterCallbacks* encoder_callbacks_{}; |
486 | | }; |
487 | | |
488 | | class MockAsyncClient : public AsyncClient { |
489 | | public: |
490 | | MockAsyncClient(); |
491 | | ~MockAsyncClient() override; |
492 | | |
493 | | MOCK_METHOD(void, onRequestDestroy, ()); |
494 | | |
495 | | // Http::AsyncClient |
496 | | Request* send(RequestMessagePtr&& request, Callbacks& callbacks, |
497 | 8.02k | const RequestOptions& args) override { |
498 | 8.02k | return send_(request, callbacks, args); |
499 | 8.02k | } |
500 | | OngoingRequest* startRequest(RequestHeaderMapPtr&& headers, Callbacks& callbacks, |
501 | 0 | const RequestOptions& args) override { |
502 | 0 | return startRequest_(headers, callbacks, args); |
503 | 0 | } |
504 | | MOCK_METHOD(Request*, send_, |
505 | | (RequestMessagePtr & request, Callbacks& callbacks, const RequestOptions& args)); |
506 | | MOCK_METHOD(OngoingRequest*, startRequest_, |
507 | | (RequestHeaderMapPtr & request, Callbacks& callbacks, const RequestOptions& args)); |
508 | | MOCK_METHOD(Stream*, start, (StreamCallbacks & callbacks, const StreamOptions& args)); |
509 | | |
510 | | MOCK_METHOD(Event::Dispatcher&, dispatcher, ()); |
511 | | |
512 | | NiceMock<Event::MockDispatcher> dispatcher_; |
513 | | }; |
514 | | |
515 | | class MockAsyncClientCallbacks : public AsyncClient::Callbacks { |
516 | | public: |
517 | | MockAsyncClientCallbacks(); |
518 | | ~MockAsyncClientCallbacks() override; |
519 | | |
520 | | void onSuccess(const Http::AsyncClient::Request& request, |
521 | 0 | ResponseMessagePtr&& response) override { |
522 | 0 | onSuccess_(request, response.get()); |
523 | 0 | } |
524 | | |
525 | | // Http::AsyncClient::Callbacks |
526 | | MOCK_METHOD(void, onSuccess_, (const Http::AsyncClient::Request&, ResponseMessage*)); |
527 | | MOCK_METHOD(void, onFailure, |
528 | | (const Http::AsyncClient::Request&, Http::AsyncClient::FailureReason)); |
529 | | MOCK_METHOD(void, onBeforeFinalizeUpstreamSpan, |
530 | | (Envoy::Tracing::Span&, const Http::ResponseHeaderMap*)); |
531 | | }; |
532 | | |
533 | | class MockAsyncClientStreamCallbacks : public AsyncClient::StreamCallbacks { |
534 | | public: |
535 | | MockAsyncClientStreamCallbacks(); |
536 | | ~MockAsyncClientStreamCallbacks() override; |
537 | | |
538 | 0 | void onHeaders(ResponseHeaderMapPtr&& headers, bool end_stream) override { |
539 | 0 | onHeaders_(*headers, end_stream); |
540 | 0 | } |
541 | 0 | void onTrailers(ResponseTrailerMapPtr&& trailers) override { onTrailers_(*trailers); } |
542 | | |
543 | | MOCK_METHOD(void, onHeaders_, (ResponseHeaderMap & headers, bool end_stream)); |
544 | | MOCK_METHOD(void, onData, (Buffer::Instance & data, bool end_stream)); |
545 | | MOCK_METHOD(void, onTrailers_, (ResponseTrailerMap & headers)); |
546 | | MOCK_METHOD(void, onComplete, ()); |
547 | | MOCK_METHOD(void, onReset, ()); |
548 | | }; |
549 | | |
550 | | class MockAsyncClientRequest : public virtual AsyncClient::Request { |
551 | | public: |
552 | | MockAsyncClientRequest(MockAsyncClient* client); |
553 | | ~MockAsyncClientRequest() override; |
554 | | |
555 | | MOCK_METHOD(void, cancel, ()); |
556 | | |
557 | | MockAsyncClient* client_; |
558 | | }; |
559 | | |
560 | | class MockAsyncClientStream : public virtual AsyncClient::Stream { |
561 | | public: |
562 | | MockAsyncClientStream(); |
563 | | ~MockAsyncClientStream() override; |
564 | | |
565 | | MOCK_METHOD(void, sendHeaders, (RequestHeaderMap & headers, bool end_stream)); |
566 | | MOCK_METHOD(void, sendData, (Buffer::Instance & data, bool end_stream)); |
567 | | MOCK_METHOD(void, sendTrailers, (RequestTrailerMap & trailers)); |
568 | | MOCK_METHOD(void, reset, ()); |
569 | | MOCK_METHOD(bool, isAboveWriteBufferHighWatermark, (), (const)); |
570 | 0 | void setDestructorCallback(AsyncClient::StreamDestructorCallbacks callback) override { |
571 | 0 | destructor_callback_ = callback; |
572 | 0 | } |
573 | 0 | void removeDestructorCallback() override { destructor_callback_.reset(); } |
574 | | MOCK_METHOD(void, setWatermarkCallbacks, (Http::SidestreamWatermarkCallbacks & callback), |
575 | | (override)); |
576 | | MOCK_METHOD(void, removeWatermarkCallbacks, (), (override)); |
577 | | MOCK_METHOD(const StreamInfo::StreamInfo&, streamInfo, (), (const override)); |
578 | | MOCK_METHOD(StreamInfo::StreamInfo&, streamInfo, (), (override)); |
579 | | |
580 | | private: |
581 | | absl::optional<AsyncClient::StreamDestructorCallbacks> destructor_callback_; |
582 | | }; |
583 | | |
584 | | class MockAsyncClientOngoingRequest : public virtual AsyncClient::OngoingRequest, |
585 | | public MockAsyncClientStream, |
586 | | public MockAsyncClientRequest { |
587 | | public: |
588 | 0 | MockAsyncClientOngoingRequest(MockAsyncClient* client) : MockAsyncClientRequest(client) {} |
589 | 0 | void captureAndSendTrailers(RequestTrailerMapPtr&& trailers) override { |
590 | 0 | return captureAndSendTrailers_(*trailers); |
591 | 0 | } |
592 | | MOCK_METHOD(void, captureAndSendTrailers_, (RequestTrailerMap & trailers), ()); |
593 | | }; |
594 | | |
595 | | class MockDownstreamWatermarkCallbacks : public DownstreamWatermarkCallbacks { |
596 | | public: |
597 | | MOCK_METHOD(void, onAboveWriteBufferHighWatermark, ()); |
598 | | MOCK_METHOD(void, onBelowWriteBufferLowWatermark, ()); |
599 | | }; |
600 | | |
601 | | class MockConnectionManagerConfig : public ConnectionManagerConfig { |
602 | | public: |
603 | 26.0k | MockConnectionManagerConfig() { |
604 | 26.0k | ON_CALL(*this, generateRequestId()).WillByDefault(testing::Return(true)); |
605 | 26.0k | ON_CALL(*this, isRoutable()).WillByDefault(testing::Return(true)); |
606 | 26.0k | ON_CALL(*this, preserveExternalRequestId()).WillByDefault(testing::Return(false)); |
607 | 26.0k | ON_CALL(*this, alwaysSetRequestIdInResponse()).WillByDefault(testing::Return(false)); |
608 | 26.0k | ON_CALL(*this, schemeToSet()).WillByDefault(testing::ReturnRef(scheme_)); |
609 | 26.0k | ON_CALL(*this, shouldSchemeMatchUpstream()) |
610 | 26.0k | .WillByDefault(testing::ReturnPointee(&scheme_match_upstream_)); |
611 | 26.0k | ON_CALL(*this, addProxyProtocolConnectionState()).WillByDefault(testing::Return(true)); |
612 | 26.0k | } |
613 | | |
614 | | // Http::ConnectionManagerConfig |
615 | | ServerConnectionPtr createCodec(Network::Connection& connection, const Buffer::Instance& instance, |
616 | | ServerConnectionCallbacks& callbacks, |
617 | 0 | Server::OverloadManager& overload_manager) override { |
618 | 0 | return ServerConnectionPtr{createCodec_(connection, instance, callbacks, overload_manager)}; |
619 | 0 | } |
620 | | |
621 | | MOCK_METHOD(const RequestIDExtensionSharedPtr&, requestIDExtension, ()); |
622 | | MOCK_METHOD(const std::list<AccessLog::InstanceSharedPtr>&, accessLogs, ()); |
623 | | MOCK_METHOD(bool, flushAccessLogOnNewRequest, ()); |
624 | | MOCK_METHOD(bool, flushAccessLogOnTunnelSuccessfullyEstablished, (), (const)); |
625 | | MOCK_METHOD(const absl::optional<std::chrono::milliseconds>&, accessLogFlushInterval, ()); |
626 | | MOCK_METHOD(ServerConnection*, createCodec_, |
627 | | (Network::Connection&, const Buffer::Instance&, ServerConnectionCallbacks&, |
628 | | Server::OverloadManager&)); |
629 | | MOCK_METHOD(DateProvider&, dateProvider, ()); |
630 | | MOCK_METHOD(std::chrono::milliseconds, drainTimeout, (), (const)); |
631 | | MOCK_METHOD(FilterChainFactory&, filterFactory, ()); |
632 | | MOCK_METHOD(bool, generateRequestId, (), (const)); |
633 | | MOCK_METHOD(bool, preserveExternalRequestId, (), (const)); |
634 | | MOCK_METHOD(bool, alwaysSetRequestIdInResponse, (), (const)); |
635 | | MOCK_METHOD(uint32_t, maxRequestHeadersKb, (), (const)); |
636 | | MOCK_METHOD(uint32_t, maxRequestHeadersCount, (), (const)); |
637 | | MOCK_METHOD(absl::optional<std::chrono::milliseconds>, idleTimeout, (), (const)); |
638 | | MOCK_METHOD(bool, isRoutable, (), (const)); |
639 | | MOCK_METHOD(absl::optional<std::chrono::milliseconds>, maxConnectionDuration, (), (const)); |
640 | | MOCK_METHOD(bool, http1SafeMaxConnectionDuration, (), (const)); |
641 | | MOCK_METHOD(absl::optional<std::chrono::milliseconds>, maxStreamDuration, (), (const)); |
642 | | MOCK_METHOD(std::chrono::milliseconds, streamIdleTimeout, (), (const)); |
643 | | MOCK_METHOD(std::chrono::milliseconds, requestTimeout, (), (const)); |
644 | | MOCK_METHOD(std::chrono::milliseconds, requestHeadersTimeout, (), (const)); |
645 | | MOCK_METHOD(std::chrono::milliseconds, delayedCloseTimeout, (), (const)); |
646 | | MOCK_METHOD(Router::RouteConfigProvider*, routeConfigProvider, ()); |
647 | | MOCK_METHOD(Config::ConfigProvider*, scopedRouteConfigProvider, ()); |
648 | | MOCK_METHOD(OptRef<const Router::ScopeKeyBuilder>, scopeKeyBuilder, ()); |
649 | | MOCK_METHOD(const std::string&, serverName, (), (const)); |
650 | | MOCK_METHOD(HttpConnectionManagerProto::ServerHeaderTransformation, serverHeaderTransformation, |
651 | | (), (const)); |
652 | | MOCK_METHOD(const absl::optional<std::string>&, schemeToSet, (), (const)); |
653 | | MOCK_METHOD(bool, shouldSchemeMatchUpstream, (), (const)); |
654 | | MOCK_METHOD(ConnectionManagerStats&, stats, ()); |
655 | | MOCK_METHOD(ConnectionManagerTracingStats&, tracingStats, ()); |
656 | | MOCK_METHOD(bool, useRemoteAddress, (), (const)); |
657 | 0 | const Http::InternalAddressConfig& internalAddressConfig() const override { |
658 | 0 | return *internal_address_config_; |
659 | 0 | } |
660 | | |
661 | | MOCK_METHOD(bool, unixSocketInternal, ()); |
662 | | MOCK_METHOD(uint32_t, xffNumTrustedHops, (), (const)); |
663 | | MOCK_METHOD(bool, skipXffAppend, (), (const)); |
664 | | MOCK_METHOD(const std::string&, via, (), (const)); |
665 | | MOCK_METHOD(Http::ForwardClientCertType, forwardClientCert, (), (const)); |
666 | | MOCK_METHOD(const std::vector<Http::ClientCertDetailsType>&, setCurrentClientCertDetails, (), |
667 | | (const)); |
668 | | MOCK_METHOD(const Network::Address::Instance&, localAddress, ()); |
669 | | MOCK_METHOD(const absl::optional<std::string>&, userAgent, ()); |
670 | | MOCK_METHOD(const Http::TracingConnectionManagerConfig*, tracingConfig, ()); |
671 | | MOCK_METHOD(Tracing::TracerSharedPtr, tracer, ()); |
672 | | MOCK_METHOD(ConnectionManagerListenerStats&, listenerStats, ()); |
673 | | MOCK_METHOD(bool, proxy100Continue, (), (const)); |
674 | | MOCK_METHOD(bool, streamErrorOnInvalidHttpMessaging, (), (const)); |
675 | | MOCK_METHOD(const Http::Http1Settings&, http1Settings, (), (const)); |
676 | | MOCK_METHOD(bool, shouldNormalizePath, (), (const)); |
677 | | MOCK_METHOD(bool, shouldMergeSlashes, (), (const)); |
678 | | MOCK_METHOD(bool, shouldStripTrailingHostDot, (), (const)); |
679 | | MOCK_METHOD(Http::StripPortType, stripPortType, (), (const)); |
680 | | MOCK_METHOD(envoy::config::core::v3::HttpProtocolOptions::HeadersWithUnderscoresAction, |
681 | | headersWithUnderscoresAction, (), (const)); |
682 | | MOCK_METHOD(const LocalReply::LocalReply&, localReply, (), (const)); |
683 | | MOCK_METHOD(envoy::extensions::filters::network::http_connection_manager::v3:: |
684 | | HttpConnectionManager::PathWithEscapedSlashesAction, |
685 | | pathWithEscapedSlashesAction, (), (const)); |
686 | | MOCK_METHOD(const std::vector<Http::OriginalIPDetectionSharedPtr>&, originalIpDetectionExtensions, |
687 | | (), (const)); |
688 | 0 | const std::vector<Http::EarlyHeaderMutationPtr>& earlyHeaderMutationExtensions() const override { |
689 | 0 | return early_header_mutation_extensions_; |
690 | 0 | } |
691 | | MOCK_METHOD(uint64_t, maxRequestsPerConnection, (), (const)); |
692 | | MOCK_METHOD(const HttpConnectionManagerProto::ProxyStatusConfig*, proxyStatusConfig, (), (const)); |
693 | | MOCK_METHOD(ServerHeaderValidatorPtr, makeHeaderValidator, (Protocol protocol)); |
694 | | MOCK_METHOD(bool, appendLocalOverload, (), (const)); |
695 | | MOCK_METHOD(bool, appendXForwardedPort, (), (const)); |
696 | | MOCK_METHOD(bool, addProxyProtocolConnectionState, (), (const)); |
697 | | |
698 | | std::unique_ptr<Http::InternalAddressConfig> internal_address_config_ = |
699 | | std::make_unique<DefaultInternalAddressConfig>(); |
700 | | std::vector<Http::EarlyHeaderMutationPtr> early_header_mutation_extensions_; |
701 | | absl::optional<std::string> scheme_; |
702 | | bool scheme_match_upstream_; |
703 | | }; |
704 | | |
705 | | class MockReceivedSettings : public ReceivedSettings { |
706 | | public: |
707 | | MockReceivedSettings(); |
708 | 0 | ~MockReceivedSettings() override = default; |
709 | | |
710 | | MOCK_METHOD(const absl::optional<uint32_t>&, maxConcurrentStreams, (), (const)); |
711 | | |
712 | | absl::optional<uint32_t> max_concurrent_streams_{}; |
713 | | }; |
714 | | |
715 | | } // namespace Http |
716 | | |
717 | | namespace Http { |
718 | | |
719 | | template <typename HeaderMapT> |
720 | | class HeaderValueOfMatcherImpl : public testing::MatcherInterface<HeaderMapT> { |
721 | | public: |
722 | | explicit HeaderValueOfMatcherImpl(LowerCaseString key, |
723 | | testing::Matcher<absl::string_view> matcher) |
724 | | : key_(std::move(key)), matcher_(std::move(matcher)) {} |
725 | | |
726 | | // NOLINTNEXTLINE(readability-identifier-naming) |
727 | | bool MatchAndExplain(HeaderMapT headers, testing::MatchResultListener* listener) const override { |
728 | | // Get all headers with matching keys. |
729 | | std::vector<absl::string_view> values; |
730 | | Envoy::Http::HeaderMap::ConstIterateCb get_headers_cb = |
731 | | [key = key_.get(), &values](const Envoy::Http::HeaderEntry& header) { |
732 | | if (header.key().getStringView() == key) { |
733 | | values.push_back(header.value().getStringView()); |
734 | | } |
735 | | return Envoy::Http::HeaderMap::Iterate::Continue; |
736 | | }; |
737 | | headers.iterate(get_headers_cb); |
738 | | |
739 | | if (values.empty()) { |
740 | | *listener << "which has no '" << key_.get() << "' header"; |
741 | | return false; |
742 | | } else if (values.size() > 1) { |
743 | | *listener << "which has " << values.size() << " '" << key_.get() |
744 | | << "' headers, with values: " << absl::StrJoin(values, ", "); |
745 | | return false; |
746 | | } |
747 | | absl::string_view value = values[0]; |
748 | | *listener << "which has a '" << key_.get() << "' header with value " << value << " "; |
749 | | return testing::ExplainMatchResult(matcher_, value, listener); |
750 | | } |
751 | | |
752 | | void DescribeTo(std::ostream* os) const override { |
753 | | *os << "has a '" << key_.get() << "' header with value that " |
754 | | << testing::DescribeMatcher<absl::string_view>(matcher_); |
755 | | } |
756 | | |
757 | | void DescribeNegationTo(std::ostream* os) const override { |
758 | | *os << "doesn't have a '" << key_.get() << "' header with value that " |
759 | | << testing::DescribeMatcher<absl::string_view>(matcher_); |
760 | | } |
761 | | |
762 | | private: |
763 | | const LowerCaseString key_; |
764 | | const testing::Matcher<absl::string_view> matcher_; |
765 | | }; |
766 | | |
767 | | class HeaderValueOfMatcher { |
768 | | public: |
769 | | explicit HeaderValueOfMatcher(LowerCaseString key, testing::Matcher<absl::string_view> matcher) |
770 | 0 | : key_(std::move(key)), matcher_(std::move(matcher)) {} |
771 | | |
772 | | // Produces a testing::Matcher that is parameterized by HeaderMap& or const |
773 | | // HeaderMap& as requested. This is required since testing::Matcher<const T&> |
774 | | // is not implicitly convertible to testing::Matcher<T&>. |
775 | | template <typename HeaderMapT> operator testing::Matcher<HeaderMapT>() const { |
776 | | return testing::Matcher<HeaderMapT>(new HeaderValueOfMatcherImpl<HeaderMapT>(key_, matcher_)); |
777 | | } |
778 | | |
779 | | private: |
780 | | const LowerCaseString key_; |
781 | | const testing::Matcher<absl::string_view> matcher_; |
782 | | }; |
783 | | |
784 | | // Test that a HeaderMap argument contains exactly one header with the given |
785 | | // key, whose value satisfies the given expectation. The expectation can be a |
786 | | // matcher, or a string that the value should equal. |
787 | | template <typename T, typename K> HeaderValueOfMatcher HeaderValueOf(K key, const T& matcher) { |
788 | | return HeaderValueOfMatcher(LowerCaseString(key), |
789 | | testing::SafeMatcherCast<absl::string_view>(matcher)); |
790 | | } |
791 | | |
792 | | // Tests the provided Envoy HeaderMap for the provided HTTP status code. |
793 | 0 | MATCHER_P(HttpStatusIs, expected_code, "") { |
794 | 0 | const HeaderEntry* status = arg.Status(); |
795 | 0 | if (status == nullptr) { |
796 | 0 | *result_listener << "which has no status code"; |
797 | 0 | return false; |
798 | 0 | } |
799 | 0 | const absl::string_view code = status->value().getStringView(); |
800 | 0 | if (code != absl::StrCat(expected_code)) { |
801 | 0 | *result_listener << "which has status code " << code; |
802 | 0 | return false; |
803 | 0 | } |
804 | 0 | return true; |
805 | 0 | } |
806 | | |
807 | | inline HeaderMap::ConstIterateCb |
808 | 0 | saveHeaders(std::vector<std::pair<absl::string_view, absl::string_view>>* output) { |
809 | 0 | return [output](const HeaderEntry& header) { |
810 | 0 | output->push_back(std::make_pair(header.key().getStringView(), header.value().getStringView())); |
811 | 0 | return HeaderMap::Iterate::Continue; |
812 | 0 | }; |
813 | 0 | } |
814 | | |
815 | | template <typename HeaderMapT> |
816 | | class IsSubsetOfHeadersMatcherImpl : public testing::MatcherInterface<HeaderMapT> { |
817 | | public: |
818 | | explicit IsSubsetOfHeadersMatcherImpl(const HeaderMap& expected_headers) |
819 | | : expected_headers_(expected_headers) {} |
820 | | |
821 | | IsSubsetOfHeadersMatcherImpl(IsSubsetOfHeadersMatcherImpl&& other) noexcept |
822 | | : expected_headers_(other.expected_headers_) {} |
823 | | |
824 | | IsSubsetOfHeadersMatcherImpl(const IsSubsetOfHeadersMatcherImpl& other) |
825 | | : expected_headers_(other.expected_headers_) {} |
826 | | |
827 | | // NOLINTNEXTLINE(readability-identifier-naming) |
828 | | bool MatchAndExplain(HeaderMapT headers, testing::MatchResultListener* listener) const override { |
829 | | // Collect header maps into vectors, to use for IsSubsetOf. |
830 | | std::vector<std::pair<absl::string_view, absl::string_view>> arg_headers_vec; |
831 | | headers.iterate(saveHeaders(&arg_headers_vec)); |
832 | | |
833 | | std::vector<std::pair<absl::string_view, absl::string_view>> expected_headers_vec; |
834 | | expected_headers_.iterate(saveHeaders(&expected_headers_vec)); |
835 | | |
836 | | return ExplainMatchResult(testing::IsSubsetOf(expected_headers_vec), arg_headers_vec, listener); |
837 | | } |
838 | | |
839 | | void DescribeTo(std::ostream* os) const override { |
840 | | *os << "is a subset of headers:\n" << expected_headers_; |
841 | | } |
842 | | |
843 | | const TestRequestHeaderMapImpl expected_headers_; |
844 | | }; |
845 | | |
846 | | class IsSubsetOfHeadersMatcher { |
847 | | public: |
848 | | IsSubsetOfHeadersMatcher(const HeaderMap& expected_headers) |
849 | 0 | : expected_headers_(expected_headers) {} |
850 | | |
851 | | IsSubsetOfHeadersMatcher(IsSubsetOfHeadersMatcher&& other) noexcept |
852 | 0 | : expected_headers_(static_cast<const HeaderMap&>(other.expected_headers_)) {} |
853 | | |
854 | | IsSubsetOfHeadersMatcher(const IsSubsetOfHeadersMatcher& other) |
855 | 0 | : expected_headers_(static_cast<const HeaderMap&>(other.expected_headers_)) {} |
856 | | |
857 | | template <typename HeaderMapT> operator testing::Matcher<HeaderMapT>() const { |
858 | | return testing::MakeMatcher(new IsSubsetOfHeadersMatcherImpl<HeaderMapT>(expected_headers_)); |
859 | | } |
860 | | |
861 | | private: |
862 | | TestRequestHeaderMapImpl expected_headers_; |
863 | | }; |
864 | | |
865 | | IsSubsetOfHeadersMatcher IsSubsetOfHeaders(const HeaderMap& expected_headers); |
866 | | |
867 | | template <typename HeaderMapT> |
868 | | class IsSupersetOfHeadersMatcherImpl : public testing::MatcherInterface<HeaderMapT> { |
869 | | public: |
870 | | explicit IsSupersetOfHeadersMatcherImpl(const HeaderMap& expected_headers) |
871 | | : expected_headers_(expected_headers) {} |
872 | | |
873 | | IsSupersetOfHeadersMatcherImpl(IsSupersetOfHeadersMatcherImpl&& other) noexcept |
874 | | : expected_headers_(other.expected_headers_) {} |
875 | | |
876 | | IsSupersetOfHeadersMatcherImpl(const IsSupersetOfHeadersMatcherImpl& other) |
877 | | : expected_headers_(other.expected_headers_) {} |
878 | | |
879 | | // NOLINTNEXTLINE(readability-identifier-naming) |
880 | | bool MatchAndExplain(HeaderMapT headers, testing::MatchResultListener* listener) const override { |
881 | | // Collect header maps into vectors, to use for IsSupersetOf. |
882 | | std::vector<std::pair<absl::string_view, absl::string_view>> arg_headers_vec; |
883 | | headers.iterate(saveHeaders(&arg_headers_vec)); |
884 | | |
885 | | std::vector<std::pair<absl::string_view, absl::string_view>> expected_headers_vec; |
886 | | expected_headers_.iterate(saveHeaders(&expected_headers_vec)); |
887 | | |
888 | | if (!ExplainMatchResult(testing::IsSupersetOf(expected_headers_vec), arg_headers_vec, |
889 | | listener)) { |
890 | | *listener << "\nActual headers:\n" << headers; |
891 | | return false; |
892 | | } |
893 | | return true; |
894 | | } |
895 | | |
896 | | void DescribeTo(std::ostream* os) const override { |
897 | | *os << "is a superset of headers:\n" << expected_headers_; |
898 | | } |
899 | | |
900 | | const TestRequestHeaderMapImpl expected_headers_; |
901 | | }; |
902 | | |
903 | | class IsSupersetOfHeadersMatcher { |
904 | | public: |
905 | | IsSupersetOfHeadersMatcher(const HeaderMap& expected_headers) |
906 | 0 | : expected_headers_(expected_headers) {} |
907 | | |
908 | | IsSupersetOfHeadersMatcher(IsSupersetOfHeadersMatcher&& other) noexcept |
909 | 0 | : expected_headers_(static_cast<const HeaderMap&>(other.expected_headers_)) {} |
910 | | |
911 | | IsSupersetOfHeadersMatcher(const IsSupersetOfHeadersMatcher& other) |
912 | 0 | : expected_headers_(static_cast<const HeaderMap&>(other.expected_headers_)) {} |
913 | | |
914 | | template <typename HeaderMapT> operator testing::Matcher<HeaderMapT>() const { |
915 | | return testing::MakeMatcher(new IsSupersetOfHeadersMatcherImpl<HeaderMapT>(expected_headers_)); |
916 | | } |
917 | | |
918 | | private: |
919 | | TestRequestHeaderMapImpl expected_headers_; |
920 | | }; |
921 | | |
922 | | IsSupersetOfHeadersMatcher IsSupersetOfHeaders(const HeaderMap& expected_headers); |
923 | | |
924 | | } // namespace Http |
925 | | |
926 | | MATCHER_P(HeaderMapEqual, rhs, "") { |
927 | | const bool equal = (*arg == *rhs); |
928 | | if (!equal) { |
929 | | *result_listener << "\n" |
930 | | << TestUtility::addLeftAndRightPadding("header map:") << "\n" |
931 | | << *rhs << TestUtility::addLeftAndRightPadding("is not equal to:") << "\n" |
932 | | << *arg << TestUtility::addLeftAndRightPadding("") // line full of padding |
933 | | << "\n"; |
934 | | } |
935 | | return equal; |
936 | | } |
937 | | |
938 | | MATCHER_P(HeaderMapEqualWithMaxSize, rhs, "") { |
939 | | bool equal = (*arg == *rhs); |
940 | | |
941 | | // Check the max header count and size of the HeaderMap also equal. |
942 | | if (equal) { |
943 | | if (arg->maxHeadersCount() != rhs->maxHeadersCount() || |
944 | | arg->maxHeadersKb() != rhs->maxHeadersKb()) { |
945 | | equal = false; |
946 | | } |
947 | | } |
948 | | |
949 | | if (!equal) { |
950 | | *result_listener << "\n" |
951 | | << TestUtility::addLeftAndRightPadding("header map:") << "\n" |
952 | | << *rhs << TestUtility::addLeftAndRightPadding("is not equal to:") << "\n" |
953 | | << *arg << TestUtility::addLeftAndRightPadding("") // line full of padding |
954 | | << "\n"; |
955 | | } |
956 | | return equal; |
957 | | } |
958 | | |
959 | 0 | MATCHER_P(HeaderMapEqualRef, rhs, "") { |
960 | 0 | const bool equal = (arg == *rhs); |
961 | 0 | if (!equal) { |
962 | 0 | *result_listener << "\n" |
963 | 0 | << TestUtility::addLeftAndRightPadding("header map:") << "\n" |
964 | 0 | << *rhs << TestUtility::addLeftAndRightPadding("is not equal to:") << "\n" |
965 | 0 | << arg << TestUtility::addLeftAndRightPadding("") // line full of padding |
966 | 0 | << "\n"; |
967 | 0 | } |
968 | 0 | return equal; |
969 | 0 | } Unexecuted instantiation: Envoy::HeaderMapEqualRefMatcherP<Envoy::Http::TestResponseTrailerMapImpl*>::gmock_Impl<Envoy::Http::ResponseTrailerMap const&>::MatchAndExplain(Envoy::Http::ResponseTrailerMap const&, testing::MatchResultListener*) const Unexecuted instantiation: Envoy::HeaderMapEqualRefMatcherP<Envoy::Http::TestHeaderMapImplBase<Envoy::Http::RequestTrailerMap, Envoy::Http::RequestTrailerMapImpl>*>::gmock_Impl<Envoy::Http::RequestTrailerMap const&>::MatchAndExplain(Envoy::Http::RequestTrailerMap const&, testing::MatchResultListener*) const |
970 | | |
971 | | // Test that a HeaderMapPtr argument includes a given key-value pair, e.g., |
972 | | // HeaderHasValue("Upgrade", "WebSocket") |
973 | | template <typename K, typename V> |
974 | | testing::Matcher<const Http::HeaderMap*> HeaderHasValue(K key, V value) { |
975 | | return testing::Pointee(Http::HeaderValueOf(key, value)); |
976 | | } |
977 | | |
978 | | // Like HeaderHasValue, but matches against a HeaderMap& argument. |
979 | | template <typename K, typename V> Http::HeaderValueOfMatcher HeaderHasValueRef(K key, V value) { |
980 | | return Http::HeaderValueOf(key, value); |
981 | | } |
982 | | |
983 | | } // namespace Envoy |