aboutsummaryrefslogtreecommitdiff
path: root/test/core/xds/xds_endpoint_resource_type_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/core/xds/xds_endpoint_resource_type_test.cc')
-rw-r--r--test/core/xds/xds_endpoint_resource_type_test.cc269
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");