Coverage Report

Created: 2024-09-19 09:45

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