Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/test/mocks/upstream/cluster_info.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <chrono>
4
#include <cstdint>
5
#include <memory>
6
#include <string>
7
8
#include "envoy/config/cluster/v3/cluster.pb.h"
9
#include "envoy/config/core/v3/base.pb.h"
10
#include "envoy/config/core/v3/protocol.pb.h"
11
#include "envoy/config/typed_metadata.h"
12
#include "envoy/stats/scope.h"
13
#include "envoy/upstream/cluster_manager.h"
14
#include "envoy/upstream/upstream.h"
15
16
#include "source/common/common/thread.h"
17
#include "source/common/http/http1/codec_stats.h"
18
#include "source/common/http/http2/codec_stats.h"
19
#include "source/common/http/http3/codec_stats.h"
20
#include "source/common/upstream/upstream_impl.h"
21
22
#include "test/mocks/runtime/mocks.h"
23
#include "test/mocks/stats/mocks.h"
24
#include "test/mocks/upstream/transport_socket_match.h"
25
26
#include "gmock/gmock.h"
27
#include "gtest/gtest.h"
28
29
using testing::NiceMock;
30
31
namespace Envoy {
32
namespace Http {
33
class FilterChainManager;
34
}
35
36
namespace Upstream {
37
38
class MockLoadBalancerSubsetInfo : public LoadBalancerSubsetInfo {
39
public:
40
  MockLoadBalancerSubsetInfo();
41
  ~MockLoadBalancerSubsetInfo() override;
42
43
  // Upstream::LoadBalancerSubsetInfo
44
  MOCK_METHOD(bool, isEnabled, (), (const));
45
  MOCK_METHOD(envoy::config::cluster::v3::Cluster::LbSubsetConfig::LbSubsetFallbackPolicy,
46
              fallbackPolicy, (), (const));
47
  MOCK_METHOD(envoy::config::cluster::v3::Cluster::LbSubsetConfig::LbSubsetMetadataFallbackPolicy,
48
              metadataFallbackPolicy, (), (const));
49
  MOCK_METHOD(const ProtobufWkt::Struct&, defaultSubset, (), (const));
50
  MOCK_METHOD(const std::vector<SubsetSelectorPtr>&, subsetSelectors, (), (const));
51
  MOCK_METHOD(bool, localityWeightAware, (), (const));
52
  MOCK_METHOD(bool, scaleLocalityWeight, (), (const));
53
  MOCK_METHOD(bool, panicModeAny, (), (const));
54
  MOCK_METHOD(bool, listAsAny, (), (const));
55
  MOCK_METHOD(bool, allowRedundantKeys, (), (const));
56
57
  std::vector<SubsetSelectorPtr> subset_selectors_;
58
};
59
60
// While this mock class doesn't have any direct use in public Envoy tests, it's
61
// useful for constructing tests of downstream private filters that use
62
// ClusterTypedMetadata.
63
class MockClusterTypedMetadata : public Config::TypedMetadataImpl<ClusterTypedMetadataFactory> {
64
public:
65
  using Config::TypedMetadataImpl<ClusterTypedMetadataFactory>::TypedMetadataImpl;
66
67
0
  void inject(const std::string& key, std::unique_ptr<const TypedMetadata::Object> value) {
68
0
    data_[key] = std::move(value);
69
0
  }
70
71
0
  absl::node_hash_map<std::string, std::unique_ptr<const TypedMetadata::Object>>& data() {
72
0
    return data_;
73
0
  }
74
};
75
76
class MockUpstreamLocalAddressSelector : public UpstreamLocalAddressSelector {
77
public:
78
  MockUpstreamLocalAddressSelector(Network::Address::InstanceConstSharedPtr& address);
79
80
  MOCK_METHOD(UpstreamLocalAddress, getUpstreamLocalAddressImpl,
81
              (const Network::Address::InstanceConstSharedPtr& address), (const));
82
83
  Network::Address::InstanceConstSharedPtr& address_;
84
};
85
86
class MockUpstreamLocalAddressSelectorFactory : public UpstreamLocalAddressSelectorFactory {
87
public:
88
  MOCK_METHOD(UpstreamLocalAddressSelectorConstSharedPtr, createLocalAddressSelector,
89
              (std::vector<::Envoy::Upstream::UpstreamLocalAddress> upstream_local_addresses,
90
               absl::optional<std::string> cluster_name),
91
              (const));
92
93
0
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
94
0
    return std::make_unique<ProtobufWkt::Empty>();
95
0
  }
96
97
0
  std::string name() const override { return "mock.upstream.local.address.selector"; }
98
};
99
100
class MockClusterInfo : public ClusterInfo {
101
public:
102
  MockClusterInfo();
103
  ~MockClusterInfo() override;
104
105
  void resetResourceManager(uint64_t cx, uint64_t rq_pending, uint64_t rq, uint64_t rq_retry,
106
0
                            uint64_t conn_pool, uint64_t conn_per_host = 100) {
107
0
    resource_manager_ = std::make_unique<ResourceManagerImpl>(
108
0
        runtime_, name_, cx, rq_pending, rq, rq_retry, conn_pool, conn_per_host,
109
0
        circuit_breakers_stats_, absl::nullopt, absl::nullopt);
110
0
  }
111
112
  void resetResourceManagerWithRetryBudget(uint64_t cx, uint64_t rq_pending, uint64_t rq,
113
                                           uint64_t rq_retry, uint64_t conn_pool,
114
                                           double budget_percent, uint32_t min_retry_concurrency,
115
0
                                           uint64_t conn_per_host = 100) {
116
0
    resource_manager_ = std::make_unique<ResourceManagerImpl>(
117
0
        runtime_, name_, cx, rq_pending, rq, rq_retry, conn_pool, conn_per_host,
118
0
        circuit_breakers_stats_, budget_percent, min_retry_concurrency);
119
0
  }
120
121
  // Upstream::ClusterInfo
122
  MOCK_METHOD(bool, addedViaApi, (), (const));
123
  MOCK_METHOD(std::chrono::milliseconds, connectTimeout, (), (const));
124
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, idleTimeout, (), (const));
125
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, tcpPoolIdleTimeout, (), (const));
126
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, maxConnectionDuration, (), (const));
127
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, maxStreamDuration, (), (const));
128
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, grpcTimeoutHeaderMax, (), (const));
129
  MOCK_METHOD(const absl::optional<std::chrono::milliseconds>, grpcTimeoutHeaderOffset, (),
130
              (const));
131
  MOCK_METHOD(float, perUpstreamPreconnectRatio, (), (const));
132
  MOCK_METHOD(float, peekaheadRatio, (), (const));
133
  MOCK_METHOD(uint32_t, perConnectionBufferLimitBytes, (), (const));
134
  MOCK_METHOD(uint64_t, features, (), (const));
135
  MOCK_METHOD(const Http::Http1Settings&, http1Settings, (), (const));
136
  MOCK_METHOD(const envoy::config::core::v3::Http2ProtocolOptions&, http2Options, (), (const));
137
  MOCK_METHOD(const envoy::config::core::v3::Http3ProtocolOptions&, http3Options, (), (const));
138
  MOCK_METHOD(const envoy::config::core::v3::HttpProtocolOptions&, commonHttpProtocolOptions, (),
139
              (const));
140
  MOCK_METHOD(ProtocolOptionsConfigConstSharedPtr, extensionProtocolOptions, (const std::string&),
141
              (const));
142
  MOCK_METHOD(OptRef<const LoadBalancerConfig>, loadBalancerConfig, (), (const));
143
  MOCK_METHOD(TypedLoadBalancerFactory*, loadBalancerFactory, (), (const));
144
  MOCK_METHOD(const envoy::config::cluster::v3::Cluster::CommonLbConfig&, lbConfig, (), (const));
145
  MOCK_METHOD(LoadBalancerType, lbType, (), (const));
146
  MOCK_METHOD(envoy::config::cluster::v3::Cluster::DiscoveryType, type, (), (const));
147
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::CustomClusterType>, clusterType, (),
148
              (const));
149
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::RingHashLbConfig>, lbRingHashConfig,
150
              (), (const));
151
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::MaglevLbConfig>, lbMaglevConfig, (),
152
              (const));
153
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::RoundRobinLbConfig>,
154
              lbRoundRobinConfig, (), (const));
155
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::LeastRequestLbConfig>,
156
              lbLeastRequestConfig, (), (const));
157
  MOCK_METHOD(OptRef<const envoy::config::cluster::v3::Cluster::OriginalDstLbConfig>,
158
              lbOriginalDstConfig, (), (const));
159
  MOCK_METHOD(OptRef<const envoy::config::core::v3::TypedExtensionConfig>, upstreamConfig, (),
160
              (const));
161
  MOCK_METHOD(bool, maintenanceMode, (), (const));
162
  MOCK_METHOD(uint32_t, maxResponseHeadersCount, (), (const));
163
  MOCK_METHOD(uint64_t, maxRequestsPerConnection, (), (const));
164
  MOCK_METHOD(const std::string&, name, (), (const));
165
  MOCK_METHOD(const std::string&, observabilityName, (), (const));
166
  MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const));
167
  MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const));
168
  MOCK_METHOD(DeferredCreationCompatibleClusterTrafficStats&, trafficStats, (), (const));
169
  MOCK_METHOD(ClusterLbStats&, lbStats, (), (const));
170
  MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const));
171
  MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const));
172
  MOCK_METHOD(Stats::Scope&, statsScope, (), (const));
173
  MOCK_METHOD(ClusterLoadReportStats&, loadReportStats, (), (const));
174
  MOCK_METHOD(ClusterRequestResponseSizeStatsOptRef, requestResponseSizeStats, (), (const));
175
  MOCK_METHOD(ClusterTimeoutBudgetStatsOptRef, timeoutBudgetStats, (), (const));
176
  MOCK_METHOD(bool, perEndpointStatsEnabled, (), (const));
177
  MOCK_METHOD(UpstreamLocalAddressSelectorConstSharedPtr, getUpstreamLocalAddressSelector, (),
178
              (const));
179
  MOCK_METHOD(const LoadBalancerSubsetInfo&, lbSubsetInfo, (), (const));
180
  MOCK_METHOD(const envoy::config::core::v3::Metadata&, metadata, (), (const));
181
  MOCK_METHOD(const Envoy::Config::TypedMetadata&, typedMetadata, (), (const));
182
  MOCK_METHOD(bool, drainConnectionsOnHostRemoval, (), (const));
183
  MOCK_METHOD(bool, connectionPoolPerDownstreamConnection, (), (const));
184
  MOCK_METHOD(bool, warmHosts, (), (const));
185
  MOCK_METHOD(bool, setLocalInterfaceNameOnUpstreamConnections, (), (const));
186
  MOCK_METHOD(const absl::optional<envoy::config::core::v3::UpstreamHttpProtocolOptions>&,
187
              upstreamHttpProtocolOptions, (), (const));
188
  MOCK_METHOD(const absl::optional<const envoy::config::core::v3::AlternateProtocolsCacheOptions>&,
189
              alternateProtocolsCacheOptions, (), (const));
190
  MOCK_METHOD(const std::string&, edsServiceName, (), (const));
191
  MOCK_METHOD(void, createNetworkFilterChain, (Network::Connection&), (const));
192
  MOCK_METHOD(std::vector<Http::Protocol>, upstreamHttpProtocol, (absl::optional<Http::Protocol>),
193
              (const));
194
195
  MOCK_METHOD(bool, createFilterChain,
196
              (Http::FilterChainManager & manager, bool only_create_if_configured,
197
               const Http::FilterChainOptions& options),
198
              (const, override));
199
  MOCK_METHOD(bool, createUpgradeFilterChain,
200
              (absl::string_view upgrade_type,
201
               const Http::FilterChainFactory::UpgradeMap* upgrade_map,
202
               Http::FilterChainManager& manager),
203
              (const));
204
  MOCK_METHOD(Http::ClientHeaderValidatorPtr, makeHeaderValidator, (Http::Protocol), (const));
205
206
  ::Envoy::Http::HeaderValidatorStats& codecStats(Http::Protocol protocol) const;
207
  Http::Http1::CodecStats& http1CodecStats() const override;
208
  Http::Http2::CodecStats& http2CodecStats() const override;
209
  Http::Http3::CodecStats& http3CodecStats() const override;
210
211
  std::string name_{"fake_cluster"};
212
  std::string observability_name_{"observability_name"};
213
  absl::optional<std::string> eds_service_name_;
214
  Http::Http1Settings http1_settings_;
215
  envoy::config::core::v3::Http2ProtocolOptions http2_options_;
216
  envoy::config::core::v3::Http3ProtocolOptions http3_options_;
217
  envoy::config::core::v3::HttpProtocolOptions common_http_protocol_options_;
218
  ProtocolOptionsConfigConstSharedPtr extension_protocol_options_;
219
  uint64_t max_requests_per_connection_{};
220
  uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT};
221
  NiceMock<Stats::MockIsolatedStatsStore> stats_store_;
222
  ClusterTrafficStatNames traffic_stat_names_;
223
  ClusterConfigUpdateStatNames config_update_stats_names_;
224
  ClusterLbStatNames lb_stat_names_;
225
  ClusterEndpointStatNames endpoint_stat_names_;
226
  ClusterLoadReportStatNames cluster_load_report_stat_names_;
227
  ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_;
228
  ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_;
229
  ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_;
230
  mutable DeferredCreationCompatibleClusterTrafficStats traffic_stats_;
231
  ClusterConfigUpdateStats config_update_stats_;
232
  ClusterLbStats lb_stats_;
233
  ClusterEndpointStats endpoint_stats_;
234
  Upstream::TransportSocketMatcherPtr transport_socket_matcher_;
235
  NiceMock<Stats::MockIsolatedStatsStore> load_report_stats_store_;
236
  ClusterLoadReportStats load_report_stats_;
237
  NiceMock<Stats::MockIsolatedStatsStore> request_response_size_stats_store_;
238
  ClusterRequestResponseSizeStatsPtr request_response_size_stats_;
239
  NiceMock<Stats::MockIsolatedStatsStore> timeout_budget_stats_store_;
240
  ClusterTimeoutBudgetStatsPtr timeout_budget_stats_;
241
  ClusterCircuitBreakersStats circuit_breakers_stats_;
242
  NiceMock<Runtime::MockLoader> runtime_;
243
  std::unique_ptr<Upstream::ResourceManager> resource_manager_;
244
  Network::Address::InstanceConstSharedPtr source_address_;
245
  std::shared_ptr<MockUpstreamLocalAddressSelector> upstream_local_address_selector_;
246
  LoadBalancerType lb_type_{LoadBalancerType::RoundRobin};
247
  envoy::config::cluster::v3::Cluster::DiscoveryType type_{
248
      envoy::config::cluster::v3::Cluster::STRICT_DNS};
249
  std::unique_ptr<const envoy::config::cluster::v3::Cluster::CustomClusterType> cluster_type_;
250
  NiceMock<MockLoadBalancerSubsetInfo> lb_subset_;
251
  absl::optional<envoy::config::core::v3::UpstreamHttpProtocolOptions>
252
      upstream_http_protocol_options_;
253
  absl::optional<const envoy::config::core::v3::AlternateProtocolsCacheOptions>
254
      alternate_protocols_cache_options_;
255
  std::unique_ptr<const envoy::config::cluster::v3::Cluster::RoundRobinLbConfig>
256
      lb_round_robin_config_;
257
  std::unique_ptr<const envoy::config::cluster::v3::Cluster::RingHashLbConfig> lb_ring_hash_config_;
258
  std::unique_ptr<const envoy::config::cluster::v3::Cluster::MaglevLbConfig> lb_maglev_config_;
259
  std::unique_ptr<const envoy::config::cluster::v3::Cluster::OriginalDstLbConfig>
260
      lb_original_dst_config_;
261
  std::unique_ptr<envoy::config::core::v3::TypedExtensionConfig> upstream_config_;
262
  Network::ConnectionSocket::OptionsSharedPtr cluster_socket_options_;
263
  envoy::config::cluster::v3::Cluster::CommonLbConfig lb_config_;
264
  envoy::config::core::v3::Metadata metadata_;
265
  std::unique_ptr<Envoy::Config::TypedMetadata> typed_metadata_;
266
  absl::optional<std::chrono::milliseconds> max_stream_duration_;
267
  Stats::ScopeSharedPtr stats_scope_;
268
  mutable Http::Http1::CodecStats::AtomicPtr http1_codec_stats_;
269
  mutable Http::Http2::CodecStats::AtomicPtr http2_codec_stats_;
270
  mutable Http::Http3::CodecStats::AtomicPtr http3_codec_stats_;
271
  Http::HeaderValidatorFactoryPtr header_validator_factory_;
272
};
273
274
class MockIdleTimeEnabledClusterInfo : public MockClusterInfo {
275
public:
276
  MockIdleTimeEnabledClusterInfo();
277
  ~MockIdleTimeEnabledClusterInfo() override;
278
};
279
280
class MockMaxConnectionDurationEnabledClusterInfo : public MockClusterInfo {
281
public:
282
  MockMaxConnectionDurationEnabledClusterInfo();
283
  ~MockMaxConnectionDurationEnabledClusterInfo() override;
284
};
285
286
} // namespace Upstream
287
} // namespace Envoy