/proc/self/cwd/test/mocks/upstream/cluster_info.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include "test/mocks/upstream/cluster_info.h" |
2 | | |
3 | | #include <limits> |
4 | | |
5 | | #include "envoy/common/optref.h" |
6 | | #include "envoy/config/cluster/v3/cluster.pb.h" |
7 | | #include "envoy/upstream/host_description.h" |
8 | | #include "envoy/upstream/upstream.h" |
9 | | |
10 | | #include "source/common/config/metadata.h" |
11 | | #include "source/common/http/utility.h" |
12 | | #include "source/common/network/raw_buffer_socket.h" |
13 | | #include "source/common/router/upstream_codec_filter.h" |
14 | | #include "source/common/upstream/upstream_impl.h" |
15 | | |
16 | | using testing::_; |
17 | | using testing::Invoke; |
18 | | using testing::Return; |
19 | | using testing::ReturnPointee; |
20 | | using testing::ReturnRef; |
21 | | |
22 | | namespace Envoy { |
23 | | namespace Upstream { |
24 | | |
25 | 403k | MockLoadBalancerSubsetInfo::MockLoadBalancerSubsetInfo() { |
26 | 403k | ON_CALL(*this, isEnabled()).WillByDefault(Return(false)); |
27 | 403k | ON_CALL(*this, fallbackPolicy()) |
28 | 403k | .WillByDefault(Return(envoy::config::cluster::v3::Cluster::LbSubsetConfig::ANY_ENDPOINT)); |
29 | 403k | ON_CALL(*this, defaultSubset()).WillByDefault(ReturnRef(ProtobufWkt::Struct::default_instance())); |
30 | 403k | ON_CALL(*this, subsetSelectors()).WillByDefault(ReturnRef(subset_selectors_)); |
31 | 403k | } |
32 | | |
33 | 403k | MockLoadBalancerSubsetInfo::~MockLoadBalancerSubsetInfo() = default; |
34 | | |
35 | 0 | MockIdleTimeEnabledClusterInfo::MockIdleTimeEnabledClusterInfo() { |
36 | 0 | ON_CALL(*this, idleTimeout()).WillByDefault(Return(std::chrono::milliseconds(1000))); |
37 | 0 | } |
38 | | |
39 | 0 | MockIdleTimeEnabledClusterInfo::~MockIdleTimeEnabledClusterInfo() = default; |
40 | | |
41 | | MockUpstreamLocalAddressSelector::MockUpstreamLocalAddressSelector( |
42 | | Network::Address::InstanceConstSharedPtr& address) |
43 | 403k | : address_(address) { |
44 | 403k | ON_CALL(*this, getUpstreamLocalAddressImpl(_)) |
45 | 403k | .WillByDefault( |
46 | 403k | Invoke([&](const Network::Address::InstanceConstSharedPtr&) -> UpstreamLocalAddress { |
47 | 22.3k | UpstreamLocalAddress ret; |
48 | 22.3k | ret.address_ = address_; |
49 | 22.3k | ret.socket_options_ = nullptr; |
50 | 22.3k | return ret; |
51 | 22.3k | })); |
52 | 403k | } |
53 | | |
54 | | MockClusterInfo::MockClusterInfo() |
55 | | : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( |
56 | | envoy::config::core::v3::Http2ProtocolOptions())), |
57 | | traffic_stat_names_(stats_store_.symbolTable()), |
58 | | config_update_stats_names_(stats_store_.symbolTable()), |
59 | | lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), |
60 | | cluster_load_report_stat_names_(stats_store_.symbolTable()), |
61 | | cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), |
62 | | cluster_request_response_size_stat_names_(stats_store_.symbolTable()), |
63 | | cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), |
64 | | traffic_stats_( |
65 | | ClusterInfoImpl::generateStats(stats_store_.rootScope(), traffic_stat_names_, false)), |
66 | | config_update_stats_(config_update_stats_names_, *stats_store_.rootScope()), |
67 | | lb_stats_(lb_stat_names_, *stats_store_.rootScope()), |
68 | | endpoint_stats_(endpoint_stat_names_, *stats_store_.rootScope()), |
69 | | transport_socket_matcher_(new NiceMock<Upstream::MockTransportSocketMatcher>()), |
70 | | load_report_stats_(ClusterInfoImpl::generateLoadReportStats( |
71 | | *load_report_stats_store_.rootScope(), cluster_load_report_stat_names_)), |
72 | | request_response_size_stats_(std::make_unique<ClusterRequestResponseSizeStats>( |
73 | | ClusterInfoImpl::generateRequestResponseSizeStats( |
74 | | *request_response_size_stats_store_.rootScope(), |
75 | | cluster_request_response_size_stat_names_))), |
76 | | timeout_budget_stats_( |
77 | | std::make_unique<ClusterTimeoutBudgetStats>(ClusterInfoImpl::generateTimeoutBudgetStats( |
78 | | *timeout_budget_stats_store_.rootScope(), cluster_timeout_budget_stat_names_))), |
79 | | circuit_breakers_stats_(ClusterInfoImpl::generateCircuitBreakersStats( |
80 | | *stats_store_.rootScope(), cluster_circuit_breakers_stat_names_.default_, true, |
81 | | cluster_circuit_breakers_stat_names_)), |
82 | | resource_manager_(new Upstream::ResourceManagerImpl( |
83 | | runtime_, "fake_key", 1, 1024, 1024, 1, std::numeric_limits<uint64_t>::max(), |
84 | | std::numeric_limits<uint64_t>::max(), circuit_breakers_stats_, absl::nullopt, |
85 | | absl::nullopt)), |
86 | | upstream_local_address_selector_( |
87 | | std::make_shared<NiceMock<MockUpstreamLocalAddressSelector>>(source_address_)), |
88 | 403k | stats_scope_(stats_store_.createScope("test_scope")) { |
89 | 403k | ON_CALL(*this, connectTimeout()).WillByDefault(Return(std::chrono::milliseconds(5001))); |
90 | 403k | ON_CALL(*this, idleTimeout()).WillByDefault(Return(absl::optional<std::chrono::milliseconds>())); |
91 | 403k | ON_CALL(*this, perUpstreamPreconnectRatio()).WillByDefault(Return(1.0)); |
92 | 403k | ON_CALL(*this, name()).WillByDefault(ReturnRef(name_)); |
93 | 403k | ON_CALL(*this, observabilityName()).WillByDefault(ReturnRef(observability_name_)); |
94 | 403k | ON_CALL(*this, edsServiceName()).WillByDefault(Invoke([this]() -> const std::string& { |
95 | 0 | return eds_service_name_.has_value() ? eds_service_name_.value() : Envoy::EMPTY_STRING; |
96 | 0 | })); |
97 | 403k | ON_CALL(*this, http1Settings()).WillByDefault(ReturnRef(http1_settings_)); |
98 | 403k | ON_CALL(*this, http2Options()).WillByDefault(ReturnRef(http2_options_)); |
99 | 403k | ON_CALL(*this, http3Options()).WillByDefault(ReturnRef(http3_options_)); |
100 | 403k | ON_CALL(*this, commonHttpProtocolOptions()) |
101 | 403k | .WillByDefault(ReturnRef(common_http_protocol_options_)); |
102 | 403k | ON_CALL(*this, extensionProtocolOptions(_)).WillByDefault(Return(extension_protocol_options_)); |
103 | 403k | ON_CALL(*this, maxResponseHeadersCount()) |
104 | 403k | .WillByDefault(ReturnPointee(&max_response_headers_count_)); |
105 | 403k | ON_CALL(*this, maxRequestsPerConnection()) |
106 | 403k | .WillByDefault(ReturnPointee(&max_requests_per_connection_)); |
107 | 403k | ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(traffic_stats_)); |
108 | 403k | ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); |
109 | 403k | ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); |
110 | 403k | ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); |
111 | 403k | ON_CALL(*this, statsScope()).WillByDefault(ReturnRef(*stats_store_.rootScope())); |
112 | | // TODO(incfly): The following is a hack because it's not possible to directly embed |
113 | | // a mock transport socket factory matcher due to circular dependencies. Fix this up in a follow |
114 | | // up. |
115 | 403k | ON_CALL(*this, transportSocketMatcher()) |
116 | 403k | .WillByDefault( |
117 | 403k | Invoke([this]() -> TransportSocketMatcher& { return *transport_socket_matcher_; })); |
118 | 403k | ON_CALL(*this, loadReportStats()).WillByDefault(ReturnRef(load_report_stats_)); |
119 | 403k | ON_CALL(*this, requestResponseSizeStats()) |
120 | 403k | .WillByDefault(Return( |
121 | 403k | std::reference_wrapper<ClusterRequestResponseSizeStats>(*request_response_size_stats_))); |
122 | 403k | ON_CALL(*this, timeoutBudgetStats()) |
123 | 403k | .WillByDefault( |
124 | 403k | Return(std::reference_wrapper<ClusterTimeoutBudgetStats>(*timeout_budget_stats_))); |
125 | 403k | ON_CALL(*this, getUpstreamLocalAddressSelector()) |
126 | 403k | .WillByDefault(Return(upstream_local_address_selector_)); |
127 | 403k | ON_CALL(*this, resourceManager(_)) |
128 | 403k | .WillByDefault(Invoke( |
129 | 403k | [this](ResourcePriority) -> Upstream::ResourceManager& { return *resource_manager_; })); |
130 | 403k | ON_CALL(*this, lbType()).WillByDefault(ReturnPointee(&lb_type_)); |
131 | 403k | ON_CALL(*this, lbSubsetInfo()).WillByDefault(ReturnRef(lb_subset_)); |
132 | 403k | ON_CALL(*this, lbRoundRobinConfig()) |
133 | 403k | .WillByDefault( |
134 | 403k | Invoke([this]() -> OptRef<const envoy::config::cluster::v3::Cluster::RoundRobinLbConfig> { |
135 | 0 | return makeOptRefFromPtr<const envoy::config::cluster::v3::Cluster::RoundRobinLbConfig>( |
136 | 0 | lb_round_robin_config_.get()); |
137 | 0 | })); |
138 | 403k | ON_CALL(*this, lbRingHashConfig()) |
139 | 403k | .WillByDefault( |
140 | 403k | Invoke([this]() -> OptRef<const envoy::config::cluster::v3::Cluster::RingHashLbConfig> { |
141 | 0 | return makeOptRefFromPtr<const envoy::config::cluster::v3::Cluster::RingHashLbConfig>( |
142 | 0 | lb_ring_hash_config_.get()); |
143 | 0 | })); |
144 | 403k | ON_CALL(*this, lbMaglevConfig()) |
145 | 403k | .WillByDefault( |
146 | 403k | Invoke([this]() -> OptRef<const envoy::config::cluster::v3::Cluster::MaglevLbConfig> { |
147 | 0 | return makeOptRefFromPtr<const envoy::config::cluster::v3::Cluster::MaglevLbConfig>( |
148 | 0 | lb_maglev_config_.get()); |
149 | 0 | })); |
150 | 403k | ON_CALL(*this, lbOriginalDstConfig()) |
151 | 403k | .WillByDefault(Invoke( |
152 | 403k | [this]() -> OptRef<const envoy::config::cluster::v3::Cluster::OriginalDstLbConfig> { |
153 | 0 | return makeOptRefFromPtr< |
154 | 0 | const envoy::config::cluster::v3::Cluster::OriginalDstLbConfig>( |
155 | 0 | lb_original_dst_config_.get()); |
156 | 0 | })); |
157 | 403k | ON_CALL(*this, upstreamConfig()) |
158 | 403k | .WillByDefault( |
159 | 403k | Invoke([this]() -> OptRef<const envoy::config::core::v3::TypedExtensionConfig> { |
160 | 6 | return makeOptRefFromPtr<const envoy::config::core::v3::TypedExtensionConfig>( |
161 | 6 | upstream_config_.get()); |
162 | 6 | })); |
163 | | |
164 | 403k | ON_CALL(*this, lbConfig()).WillByDefault(ReturnRef(lb_config_)); |
165 | 403k | ON_CALL(*this, metadata()).WillByDefault(ReturnRef(metadata_)); |
166 | 403k | ON_CALL(*this, upstreamHttpProtocolOptions()) |
167 | 403k | .WillByDefault(ReturnRef(upstream_http_protocol_options_)); |
168 | 403k | ON_CALL(*this, alternateProtocolsCacheOptions()) |
169 | 403k | .WillByDefault(ReturnRef(alternate_protocols_cache_options_)); |
170 | | // Delayed construction of typed_metadata_, to allow for injection of metadata |
171 | 403k | ON_CALL(*this, typedMetadata()) |
172 | 403k | .WillByDefault(Invoke([this]() -> const Envoy::Config::TypedMetadata& { |
173 | 0 | if (typed_metadata_ == nullptr) { |
174 | 0 | typed_metadata_ = |
175 | 0 | std::make_unique<Config::TypedMetadataImpl<ClusterTypedMetadataFactory>>(metadata_); |
176 | 0 | } |
177 | 0 | return *typed_metadata_; |
178 | 0 | })); |
179 | 403k | ON_CALL(*this, clusterType()) |
180 | 403k | .WillByDefault( |
181 | 403k | Invoke([this]() -> OptRef<const envoy::config::cluster::v3::Cluster::CustomClusterType> { |
182 | 0 | return makeOptRefFromPtr<const envoy::config::cluster::v3::Cluster::CustomClusterType>( |
183 | 0 | cluster_type_.get()); |
184 | 0 | })); |
185 | 403k | ON_CALL(*this, upstreamHttpProtocol(_)) |
186 | 403k | .WillByDefault(Return(std::vector<Http::Protocol>{Http::Protocol::Http11})); |
187 | 403k | ON_CALL(*this, createFilterChain(_, _, _)) |
188 | 403k | .WillByDefault(Invoke([&](Http::FilterChainManager& manager, bool only_create_if_configured, |
189 | 403k | const Http::FilterChainOptions&) -> bool { |
190 | 12 | if (only_create_if_configured) { |
191 | 6 | return false; |
192 | 6 | } |
193 | 6 | Http::FilterFactoryCb factory_cb = |
194 | 6 | [](Http::FilterChainFactoryCallbacks& callbacks) -> void { |
195 | 6 | callbacks.addStreamDecoderFilter(std::make_shared<Router::UpstreamCodecFilter>()); |
196 | 6 | }; |
197 | 6 | manager.applyFilterFactoryCb({}, factory_cb); |
198 | 6 | return true; |
199 | 12 | })); |
200 | 403k | ON_CALL(*this, loadBalancerConfig()) |
201 | 403k | .WillByDefault(Return(makeOptRefFromPtr<const LoadBalancerConfig>(nullptr))); |
202 | 403k | ON_CALL(*this, makeHeaderValidator(_)).WillByDefault(Invoke([&](Http::Protocol protocol) { |
203 | 26.1k | return header_validator_factory_ ? header_validator_factory_->createClientHeaderValidator( |
204 | 0 | protocol, codecStats(protocol)) |
205 | 26.1k | : nullptr; |
206 | 26.1k | })); |
207 | 403k | } |
208 | | |
209 | 403k | MockClusterInfo::~MockClusterInfo() = default; |
210 | | |
211 | 0 | ::Envoy::Http::HeaderValidatorStats& MockClusterInfo::codecStats(Http::Protocol protocol) const { |
212 | 0 | switch (protocol) { |
213 | 0 | case ::Envoy::Http::Protocol::Http10: |
214 | 0 | case ::Envoy::Http::Protocol::Http11: |
215 | 0 | return http1CodecStats(); |
216 | 0 | case ::Envoy::Http::Protocol::Http2: |
217 | 0 | return http2CodecStats(); |
218 | 0 | case ::Envoy::Http::Protocol::Http3: |
219 | 0 | return http3CodecStats(); |
220 | 0 | } |
221 | 0 | PANIC_DUE_TO_CORRUPT_ENUM; |
222 | 0 | } |
223 | | |
224 | 2.64k | Http::Http1::CodecStats& MockClusterInfo::http1CodecStats() const { |
225 | 2.64k | return Http::Http1::CodecStats::atomicGet(http1_codec_stats_, *stats_scope_); |
226 | 2.64k | } |
227 | | |
228 | 1.10k | Http::Http2::CodecStats& MockClusterInfo::http2CodecStats() const { |
229 | 1.10k | return Http::Http2::CodecStats::atomicGet(http2_codec_stats_, *stats_scope_); |
230 | 1.10k | } |
231 | | |
232 | 0 | Http::Http3::CodecStats& MockClusterInfo::http3CodecStats() const { |
233 | 0 | return Http::Http3::CodecStats::atomicGet(http3_codec_stats_, *stats_scope_); |
234 | 0 | } |
235 | | |
236 | | } // namespace Upstream |
237 | | } // namespace Envoy |