diff options
Diffstat (limited to 'test/core/xds/xds_endpoint_resource_type_test.cc')
-rw-r--r-- | test/core/xds/xds_endpoint_resource_type_test.cc | 269 |
1 files changed, 256 insertions, 13 deletions
diff --git a/test/core/xds/xds_endpoint_resource_type_test.cc b/test/core/xds/xds_endpoint_resource_type_test.cc index 4507863bd3..b393909930 100644 --- a/test/core/xds/xds_endpoint_resource_type_test.cc +++ b/test/core/xds/xds_endpoint_resource_type_test.cc @@ -16,12 +16,12 @@ #include <stdint.h> -#include <initializer_list> #include <limits> #include <map> #include <memory> #include <string> #include <utility> +#include <vector> #include <google/protobuf/wrappers.pb.h> @@ -30,8 +30,8 @@ #include "absl/strings/str_format.h" #include "absl/types/optional.h" #include "gtest/gtest.h" +#include "upb/mem/arena.hpp" #include "upb/reflection/def.hpp" -#include "upb/upb.hpp" #include <grpc/grpc.h> @@ -48,12 +48,14 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/error.h" -#include "src/core/lib/resolver/server_address.h" +#include "src/core/lib/iomgr/resolved_address.h" +#include "src/core/lib/resolver/endpoint_addresses.h" #include "src/proto/grpc/testing/xds/v3/address.pb.h" #include "src/proto/grpc/testing/xds/v3/base.pb.h" #include "src/proto/grpc/testing/xds/v3/endpoint.pb.h" #include "src/proto/grpc/testing/xds/v3/health_check.pb.h" #include "src/proto/grpc/testing/xds/v3/percent.pb.h" +#include "test/core/util/scoped_env_var.h" #include "test/core/util/test_config.h" using envoy::config::endpoint::v3::ClusterLoadAssignment; @@ -165,8 +167,7 @@ TEST_F(XdsEndpointTest, MinimumValidConfig) { .Set(GRPC_ARG_ADDRESS_WEIGHT, 1) .Set(GRPC_ARG_XDS_HEALTH_STATUS, XdsHealthStatus::HealthStatus::kUnknown)); - ASSERT_NE(resource.drop_config, nullptr); - EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); + EXPECT_EQ(resource.drop_config, nullptr); } TEST_F(XdsEndpointTest, EndpointWeight) { @@ -212,8 +213,7 @@ TEST_F(XdsEndpointTest, EndpointWeight) { .Set(GRPC_ARG_ADDRESS_WEIGHT, 3) .Set(GRPC_ARG_XDS_HEALTH_STATUS, XdsHealthStatus::HealthStatus::kUnknown)); - ASSERT_NE(resource.drop_config, nullptr); - EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); + EXPECT_EQ(resource.drop_config, nullptr); } TEST_F(XdsEndpointTest, IgnoresLocalityWithNoWeight) { @@ -261,8 +261,7 @@ TEST_F(XdsEndpointTest, IgnoresLocalityWithNoWeight) { .Set(GRPC_ARG_ADDRESS_WEIGHT, 1) .Set(GRPC_ARG_XDS_HEALTH_STATUS, XdsHealthStatus::HealthStatus::kUnknown)); - ASSERT_NE(resource.drop_config, nullptr); - EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); + EXPECT_EQ(resource.drop_config, nullptr); } TEST_F(XdsEndpointTest, IgnoresLocalityWithZeroWeight) { @@ -311,8 +310,7 @@ TEST_F(XdsEndpointTest, IgnoresLocalityWithZeroWeight) { .Set(GRPC_ARG_ADDRESS_WEIGHT, 1) .Set(GRPC_ARG_XDS_HEALTH_STATUS, XdsHealthStatus::HealthStatus::kUnknown)); - ASSERT_NE(resource.drop_config, nullptr); - EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); + EXPECT_EQ(resource.drop_config, nullptr); } TEST_F(XdsEndpointTest, LocalityWithNoEndpoints) { @@ -344,8 +342,7 @@ TEST_F(XdsEndpointTest, LocalityWithNoEndpoints) { EXPECT_EQ(p.first->sub_zone(), "mysubzone"); EXPECT_EQ(p.second.lb_weight, 1); EXPECT_EQ(p.second.endpoints.size(), 0); - ASSERT_NE(resource.drop_config, nullptr); - EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); + EXPECT_EQ(resource.drop_config, nullptr); } TEST_F(XdsEndpointTest, NoLocality) { @@ -489,6 +486,252 @@ TEST_F(XdsEndpointTest, MissingAddress) { << decode_result.resource.status(); } +TEST_F(XdsEndpointTest, MultipleAddressesPerEndpoint) { + testing::ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + socket_address = ep->add_additional_addresses() + ->mutable_address() + ->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(444); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.resource.ok()) << decode_result.resource.status(); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + auto& resource = + static_cast<const XdsEndpointResource&>(**decode_result.resource); + ASSERT_EQ(resource.priorities.size(), 1); + const auto& priority = resource.priorities[0]; + ASSERT_EQ(priority.localities.size(), 1); + const auto& p = *priority.localities.begin(); + ASSERT_EQ(p.first, p.second.name.get()); + EXPECT_EQ(p.first->region(), "myregion"); + EXPECT_EQ(p.first->zone(), "myzone"); + EXPECT_EQ(p.first->sub_zone(), "mysubzone"); + EXPECT_EQ(p.second.lb_weight, 1); + ASSERT_EQ(p.second.endpoints.size(), 1); + const auto& endpoint = p.second.endpoints.front(); + ASSERT_EQ(endpoint.addresses().size(), 2); + auto addr = + grpc_sockaddr_to_string(&endpoint.addresses()[0], /*normalize=*/false); + ASSERT_TRUE(addr.ok()) << addr.status(); + EXPECT_EQ(*addr, "127.0.0.1:443"); + addr = grpc_sockaddr_to_string(&endpoint.addresses()[1], /*normalize=*/false); + ASSERT_TRUE(addr.ok()) << addr.status(); + EXPECT_EQ(*addr, "127.0.0.1:444"); + EXPECT_EQ(endpoint.args(), ChannelArgs() + .Set(GRPC_ARG_ADDRESS_WEIGHT, 1) + .Set(GRPC_ARG_XDS_HEALTH_STATUS, + XdsHealthStatus::HealthStatus::kUnknown)); + EXPECT_EQ(resource.drop_config, nullptr); +} + +TEST_F(XdsEndpointTest, AdditionalAddressesMissingAddress) { + testing::ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + ep->add_additional_addresses(); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + EXPECT_EQ(decode_result.resource.status().code(), + absl::StatusCode::kInvalidArgument); + EXPECT_EQ(decode_result.resource.status().message(), + "errors parsing EDS resource: [" + "field:endpoints[0].lb_endpoints[0].endpoint" + ".additional_addresses[0].address error:field not present]") + << decode_result.resource.status(); +} + +TEST_F(XdsEndpointTest, AdditionalAddressesMissingSocketAddress) { + testing::ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + ep->add_additional_addresses()->mutable_address(); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + EXPECT_EQ(decode_result.resource.status().code(), + absl::StatusCode::kInvalidArgument); + EXPECT_EQ(decode_result.resource.status().message(), + "errors parsing EDS resource: [" + "field:endpoints[0].lb_endpoints[0].endpoint" + ".additional_addresses[0].address.socket_address " + "error:field not present]") + << decode_result.resource.status(); +} + +TEST_F(XdsEndpointTest, AdditionalAddressesInvalidPort) { + testing::ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + socket_address = ep->add_additional_addresses() + ->mutable_address() + ->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(65537); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + EXPECT_EQ(decode_result.resource.status().code(), + absl::StatusCode::kInvalidArgument); + EXPECT_EQ(decode_result.resource.status().message(), + "errors parsing EDS resource: [" + "field:endpoints[0].lb_endpoints[0].endpoint" + ".additional_addresses[0].address.socket_address.port_value " + "error:invalid port]") + << decode_result.resource.status(); +} + +TEST_F(XdsEndpointTest, AdditionalAddressesInvalidAddress) { + testing::ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + socket_address = ep->add_additional_addresses() + ->mutable_address() + ->mutable_socket_address(); + socket_address->set_address("not_an_ip_address"); + socket_address->set_port_value(444); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + EXPECT_EQ(decode_result.resource.status().code(), + absl::StatusCode::kInvalidArgument); + EXPECT_EQ(decode_result.resource.status().message(), + "errors parsing EDS resource: [" + "field:endpoints[0].lb_endpoints[0].endpoint" + ".additional_addresses[0].address.socket_address error:" + "Failed to parse address:not_an_ip_address:444]") + << decode_result.resource.status(); +} + +TEST_F(XdsEndpointTest, IgnoresMultipleAddressesPerEndpointWhenNotEnabled) { + ClusterLoadAssignment cla; + cla.set_cluster_name("foo"); + auto* locality = cla.add_endpoints(); + locality->mutable_load_balancing_weight()->set_value(1); + auto* locality_name = locality->mutable_locality(); + locality_name->set_region("myregion"); + locality_name->set_zone("myzone"); + locality_name->set_sub_zone("mysubzone"); + auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); + auto* socket_address = ep->mutable_address()->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(443); + socket_address = ep->add_additional_addresses() + ->mutable_address() + ->mutable_socket_address(); + socket_address->set_address("127.0.0.1"); + socket_address->set_port_value(444); + std::string serialized_resource; + ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); + auto* resource_type = XdsEndpointResourceType::Get(); + auto decode_result = + resource_type->Decode(decode_context_, serialized_resource); + ASSERT_TRUE(decode_result.resource.ok()) << decode_result.resource.status(); + ASSERT_TRUE(decode_result.name.has_value()); + EXPECT_EQ(*decode_result.name, "foo"); + auto& resource = + static_cast<const XdsEndpointResource&>(**decode_result.resource); + ASSERT_EQ(resource.priorities.size(), 1); + const auto& priority = resource.priorities[0]; + ASSERT_EQ(priority.localities.size(), 1); + const auto& p = *priority.localities.begin(); + ASSERT_EQ(p.first, p.second.name.get()); + EXPECT_EQ(p.first->region(), "myregion"); + EXPECT_EQ(p.first->zone(), "myzone"); + EXPECT_EQ(p.first->sub_zone(), "mysubzone"); + EXPECT_EQ(p.second.lb_weight, 1); + ASSERT_EQ(p.second.endpoints.size(), 1); + const auto& endpoint = p.second.endpoints.front(); + ASSERT_EQ(endpoint.addresses().size(), 1); + auto addr = + grpc_sockaddr_to_string(&endpoint.addresses()[0], /*normalize=*/false); + ASSERT_TRUE(addr.ok()) << addr.status(); + EXPECT_EQ(*addr, "127.0.0.1:443"); + EXPECT_EQ(endpoint.args(), ChannelArgs() + .Set(GRPC_ARG_ADDRESS_WEIGHT, 1) + .Set(GRPC_ARG_XDS_HEALTH_STATUS, + XdsHealthStatus::HealthStatus::kUnknown)); + EXPECT_EQ(resource.drop_config, nullptr); +} + TEST_F(XdsEndpointTest, MissingEndpoint) { ClusterLoadAssignment cla; cla.set_cluster_name("foo"); |