Coverage Report

Created: 2023-11-12 09:30

/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