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