Coverage Report

Created: 2023-11-12 09:30

/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