21 #include <gmock/gmock.h>
22 #include <gtest/gtest.h>
24 #include "absl/strings/str_format.h"
33 #include "src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h"
34 #include "src/proto/grpc/testing/xds/v3/ring_hash.grpc.pb.h"
35 #include "src/proto/grpc/testing/xds/v3/round_robin.grpc.pb.h"
36 #include "src/proto/grpc/testing/xds/v3/typed_struct.grpc.pb.h"
37 #include "src/proto/grpc/testing/xds/v3/udpa_typed_struct.grpc.pb.h"
38 #include "src/proto/grpc/testing/xds/v3/wrr_locality.grpc.pb.h"
46 using LoadBalancingPolicyProto =
47 ::envoy::config::cluster::v3::LoadBalancingPolicy;
48 using ::envoy::extensions::load_balancing_policies::ring_hash::v3::RingHash;
49 using ::envoy::extensions::load_balancing_policies::round_robin::v3::RoundRobin;
50 using ::envoy::extensions::load_balancing_policies::wrr_locality::v3::
52 using ::xds::type::v3::TypedStruct;
57 std::string serialized_policy = policy.SerializeAsString();
60 XdsEncodingContext
context = {
nullptr, XdsBootstrap::XdsServer(),
65 serialized_policy.data(), serialized_policy.size(),
arena.ptr());
69 TEST(XdsLbPolicyRegistryTest, EmptyLoadBalancingPolicy) {
70 auto result = ConvertXdsPolicy(LoadBalancingPolicyProto());
77 TEST(XdsLbPolicyRegistryTest, UnsupportedBuiltinType) {
78 LoadBalancingPolicyProto policy;
79 auto* lb_policy = policy.add_policies();
80 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
81 LoadBalancingPolicyProto());
82 auto result = ConvertXdsPolicy(policy);
89 TEST(XdsLbPolicyRegistryTest, MissingTypedExtensionConfig) {
90 LoadBalancingPolicyProto policy;
91 policy.add_policies();
92 auto result = ConvertXdsPolicy(policy);
96 "- Missing typed_extension_config field"));
99 TEST(XdsLbPolicyRegistryTest, MissingTypedConfig) {
100 LoadBalancingPolicyProto policy;
101 auto* lb_policy = policy.add_policies();
102 lb_policy->mutable_typed_extension_config();
103 auto result = ConvertXdsPolicy(policy);
108 "Missing TypedExtensionConfig::typed_config field"));
111 TEST(XdsLbPolicyRegistryTest, RingHashInvalidHash) {
113 ring_hash.set_hash_function(RingHash::DEFAULT_HASH);
114 LoadBalancingPolicyProto policy;
115 auto* lb_policy = policy.add_policies();
116 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
118 auto result = ConvertXdsPolicy(policy);
123 "loadbalancing policy. Only XX_HASH is supported"));
126 TEST(XdsLbPolicyRegistryTest, RingHashRingSizeDefaults) {
128 ring_hash.set_hash_function(RingHash::XX_HASH);
129 LoadBalancingPolicyProto policy;
130 auto* lb_policy = policy.add_policies();
131 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
133 auto result = ConvertXdsPolicy(policy);
138 "\"ring_hash_experimental\": {"
143 TEST(XdsLbPolicyRegistryTest, RingHashRingSizeCustom) {
145 ring_hash.set_hash_function(RingHash::XX_HASH);
146 ring_hash.mutable_minimum_ring_size()->set_value(1234);
147 ring_hash.mutable_maximum_ring_size()->set_value(4567);
148 LoadBalancingPolicyProto policy;
149 auto* lb_policy = policy.add_policies();
150 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
152 auto result = ConvertXdsPolicy(policy);
157 "\"ring_hash_experimental\": {"
158 " \"minRingSize\": 1234,"
159 " \"maxRingSize\": 4567"
164 TEST(XdsLbPolicyRegistryTest, RoundRobin) {
165 LoadBalancingPolicyProto policy;
166 auto* lb_policy = policy.add_policies();
167 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
169 auto result = ConvertXdsPolicy(policy);
174 "\"round_robin\": {}"
179 TEST(XdsLbPolicyRegistryTest, WrrLocality) {
180 WrrLocality wrr_locality;
181 wrr_locality.mutable_endpoint_picking_policy()
183 ->mutable_typed_extension_config()
184 ->mutable_typed_config()
185 ->PackFrom(RoundRobin());
186 LoadBalancingPolicyProto policy;
187 auto* lb_policy = policy.add_policies();
188 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
190 auto result = ConvertXdsPolicy(policy);
195 "\"xds_wrr_locality_experimental\": {"
196 " \"child_policy\": [{"
197 " \"round_robin\": {}"
203 TEST(XdsLbPolicyRegistryTest, WrrLocalityMissingEndpointPickingPolicy) {
204 LoadBalancingPolicyProto policy;
205 auto* lb_policy = policy.add_policies();
206 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
208 auto result = ConvertXdsPolicy(policy);
212 "Error parsing LoadBalancingPolicy.*WrrLocality: "
213 "endpoint_picking_policy not found"));
216 TEST(XdsLbPolicyRegistryTest, WrrLocalityChildPolicyError) {
217 WrrLocality wrr_locality;
218 wrr_locality.mutable_endpoint_picking_policy()
220 ->mutable_typed_extension_config()
221 ->mutable_typed_config()
222 ->PackFrom(RingHash());
223 LoadBalancingPolicyProto policy;
224 auto* lb_policy = policy.add_policies();
225 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
227 auto result = ConvertXdsPolicy(policy);
231 "Error parsing LoadBalancingPolicy.*Error parsing "
232 "WrrLocality load balancing policy.*Error parsing "
233 "LoadBalancingPolicy.*Invalid hash function provided for "
234 "RingHash loadbalancing policy. Only XX_HASH is supported."));
237 TEST(XdsLbPolicyRegistryTest, WrrLocalityUnsupportedTypeSkipped) {
241 WrrLocality wrr_locality;
242 wrr_locality.mutable_endpoint_picking_policy()
244 ->mutable_typed_extension_config()
245 ->mutable_typed_config()
246 ->PackFrom(LoadBalancingPolicyProto());
247 wrr_locality.mutable_endpoint_picking_policy()
249 ->mutable_typed_extension_config()
250 ->mutable_typed_config()
251 ->PackFrom(RoundRobin());
252 LoadBalancingPolicyProto policy;
253 auto* lb_policy = policy.add_policies();
254 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
256 auto result = ConvertXdsPolicy(policy);
261 "\"xds_wrr_locality_experimental\": {"
262 " \"child_policy\": [{"
263 " \"round_robin\": {}"
269 class CustomLbPolicyFactory :
public LoadBalancingPolicyFactory {
271 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
277 const char*
name()
const override {
return "test.CustomLb"; }
279 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
285 TEST(XdsLbPolicyRegistryTest, CustomLbPolicy) {
286 TypedStruct typed_struct;
287 typed_struct.set_type_url(
"type.googleapis.com/test.CustomLb");
288 LoadBalancingPolicyProto policy;
289 auto* lb_policy = policy.add_policies();
290 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
292 auto result = ConvertXdsPolicy(policy);
297 "\"test.CustomLb\": null}",
301 TEST(XdsLbPolicyRegistryTest, CustomLbPolicyUdpaTyped) {
302 ::udpa::type::v1::TypedStruct typed_struct;
303 typed_struct.set_type_url(
"type.googleapis.com/test.CustomLb");
304 LoadBalancingPolicyProto policy;
305 auto* lb_policy = policy.add_policies();
306 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
308 auto result = ConvertXdsPolicy(policy);
313 "\"test.CustomLb\": null}",
317 TEST(XdsLbPolicyRegistryTest, UnsupportedCustomTypeError) {
318 TypedStruct typed_struct;
319 typed_struct.set_type_url(
"myorg/foo/bar/test.UnknownLb");
320 LoadBalancingPolicyProto policy;
321 auto* lb_policy = policy.add_policies();
322 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
324 auto result = ConvertXdsPolicy(policy);
331 TEST(XdsLbPolicyRegistryTest, CustomTypeInvalidUrlMissingSlash) {
332 TypedStruct typed_struct;
333 typed_struct.set_type_url(
"test.UnknownLb");
334 LoadBalancingPolicyProto policy;
335 auto* lb_policy = policy.add_policies();
336 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
338 auto result = ConvertXdsPolicy(policy);
343 "LoadBalancingPolicy::Policy::TypedExtensionConfig::"
344 "typed_config: Invalid type_url test.UnknownLb"));
347 TEST(XdsLbPolicyRegistryTest, CustomTypeInvalidUrlEmptyType) {
348 TypedStruct typed_struct;
349 typed_struct.set_type_url(
"myorg/");
350 LoadBalancingPolicyProto policy;
351 auto* lb_policy = policy.add_policies();
352 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
354 auto result = ConvertXdsPolicy(policy);
359 "LoadBalancingPolicy::Policy::TypedExtensionConfig::"
360 "typed_config: Invalid type_url myorg/"));
363 TEST(XdsLbPolicyRegistryTest, CustomLbPolicyJsonConversion) {
364 TypedStruct typed_struct;
367 type_url: "type.googleapis.com/test.CustomLb"
371 value { null_value: NULL_VALUE }
375 value { number_value: 123 }
379 value { string_value: "value" }
387 value { null_value: NULL_VALUE }
396 values { null_value: NULL_VALUE }
397 values { number_value: 234 }
404 LoadBalancingPolicyProto policy;
405 auto* lb_policy = policy.add_policies();
406 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
408 auto result = ConvertXdsPolicy(policy);
427 TEST(XdsLbPolicyRegistryTest, CustomLbPolicyListError) {
428 TypedStruct typed_struct;
429 typed_struct.set_type_url("type.googleapis.com/test.CustomLb");
430 auto*
fields = typed_struct.mutable_value()->mutable_fields();
432 value.mutable_list_value()->add_values();
433 (*fields)[
"key"] =
value;
434 LoadBalancingPolicyProto policy;
435 auto* lb_policy = policy.add_policies();
436 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
438 auto result = ConvertXdsPolicy(policy);
442 "Error parsing LoadBalancingPolicy: Custom Policy: "
443 "test.CustomLb: Error parsing google::Protobuf::Struct: No "
444 "value set in Value proto"));
447 TEST(XdsLbPolicyRegistryTest, UnsupportedBuiltInTypeSkipped) {
451 LoadBalancingPolicyProto policy;
452 auto* lb_policy = policy.add_policies();
453 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
454 LoadBalancingPolicyProto());
455 lb_policy = policy.add_policies();
456 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
458 auto result = ConvertXdsPolicy(policy);
463 "\"round_robin\": {}"
468 TEST(XdsLbPolicyRegistryTest, UnsupportedCustomTypeSkipped) {
472 TypedStruct typed_struct;
473 typed_struct.set_type_url(
"myorg/foo/bar/test.UnknownLb");
474 LoadBalancingPolicyProto policy;
475 auto* lb_policy = policy.add_policies();
476 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
478 lb_policy = policy.add_policies();
479 lb_policy->mutable_typed_extension_config()->mutable_typed_config()->PackFrom(
481 auto result = ConvertXdsPolicy(policy);
486 "\"round_robin\": {}"
493 LoadBalancingPolicyProto BuildRecursiveLoadBalancingPolicy(
int depth) {
494 LoadBalancingPolicyProto policy;
496 policy.add_policies()
497 ->mutable_typed_extension_config()
498 ->mutable_typed_config()
499 ->PackFrom(RoundRobin());
502 WrrLocality wrr_locality;
503 *wrr_locality.mutable_endpoint_picking_policy() =
504 BuildRecursiveLoadBalancingPolicy(
depth + 1);
505 policy.add_policies()
506 ->mutable_typed_extension_config()
507 ->mutable_typed_config()
508 ->PackFrom(wrr_locality);
512 TEST(XdsLbPolicyRegistryTest, MaxRecursion) {
513 auto result = ConvertXdsPolicy(BuildRecursiveLoadBalancingPolicy(0));
517 "a recursion depth of more than 16"));
524 int main(
int argc,
char** argv) {
529 absl::make_unique<grpc_core::testing::CustomLbPolicyFactory>());