|
|
|
@ -3547,7 +3547,6 @@ TEST_P(LdsTest, NoApiListener) { |
|
|
|
|
auto listener = default_listener_; |
|
|
|
|
listener.clear_api_listener(); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3569,7 +3568,6 @@ TEST_P(LdsTest, WrongRouteSpecifier) { |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3593,7 +3591,6 @@ TEST_P(LdsTest, RdsMissingConfigSource) { |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3618,7 +3615,6 @@ TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) { |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3629,55 +3625,53 @@ TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) { |
|
|
|
|
"RDS does not specify ADS.")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Tests that we ignore filters after the router filter.
|
|
|
|
|
TEST_P(LdsTest, IgnoresHttpFiltersAfterRouterFilter) { |
|
|
|
|
// Tests that we NACK non-terminal filters at the end of the list.
|
|
|
|
|
TEST_P(LdsTest, NacksNonTerminalHttpFilterAtEndOfList) { |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
auto listener = default_listener_; |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
filter->mutable_typed_config()->set_type_url( |
|
|
|
|
"grpc.testing.client_only_http_filter"); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
AdsServiceImpl::EdsResourceArgs args({ |
|
|
|
|
{"locality0", CreateEndpointsForBackends()}, |
|
|
|
|
}); |
|
|
|
|
balancers_[0]->ads_service()->SetEdsResource( |
|
|
|
|
BuildEdsResource(args, DefaultEdsServiceName())); |
|
|
|
|
WaitForAllBackends(); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
|
balancers_[0]->ads_service()->lds_response_state(); |
|
|
|
|
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); |
|
|
|
|
EXPECT_THAT(response_state.error_message, |
|
|
|
|
::testing::HasSubstr( |
|
|
|
|
"non-terminal filter for config type grpc.testing" |
|
|
|
|
".client_only_http_filter is the last filter in the chain")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test that we fail RPCs if there is no router filter.
|
|
|
|
|
TEST_P(LdsTest, FailRpcsIfNoHttpRouterFilter) { |
|
|
|
|
// Test that we NACK terminal filters that are not at the end of the list.
|
|
|
|
|
TEST_P(LdsTest, NacksTerminalFilterBeforeEndOfList) { |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
auto listener = default_listener_; |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
http_connection_manager.clear_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
AdsServiceImpl::EdsResourceArgs args({ |
|
|
|
|
{"locality0", CreateEndpointsForBackends()}, |
|
|
|
|
}); |
|
|
|
|
balancers_[0]->ads_service()->SetEdsResource( |
|
|
|
|
BuildEdsResource(args, DefaultEdsServiceName())); |
|
|
|
|
Status status = SendRpc(); |
|
|
|
|
EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); |
|
|
|
|
EXPECT_EQ(status.error_message(), "no xDS HTTP router filter configured"); |
|
|
|
|
// Wait until xDS server sees ACK.
|
|
|
|
|
while (balancers_[0]->ads_service()->lds_response_state().state == |
|
|
|
|
AdsServiceImpl::ResponseState::SENT) { |
|
|
|
|
CheckRpcSendFailure(); |
|
|
|
|
} |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
|
balancers_[0]->ads_service()->lds_response_state(); |
|
|
|
|
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::ACKED); |
|
|
|
|
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); |
|
|
|
|
EXPECT_THAT( |
|
|
|
|
response_state.error_message, |
|
|
|
|
::testing::HasSubstr( |
|
|
|
|
"terminal filter for config type envoy.extensions.filters.http" |
|
|
|
|
".router.v3.Router must be the last filter in the chain")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test that we NACK empty filter names.
|
|
|
|
@ -3686,19 +3680,21 @@ TEST_P(LdsTest, RejectsEmptyHttpFilterName) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->Clear(); |
|
|
|
|
filter->mutable_typed_config()->PackFrom(Listener()); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
|
balancers_[0]->ads_service()->lds_response_state(); |
|
|
|
|
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); |
|
|
|
|
EXPECT_THAT(response_state.error_message, |
|
|
|
|
::testing::HasSubstr("empty filter name at index 1")); |
|
|
|
|
::testing::HasSubstr("empty filter name at index 0")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test that we NACK duplicate HTTP filter names.
|
|
|
|
@ -3709,10 +3705,12 @@ TEST_P(LdsTest, RejectsDuplicateHttpFilterName) { |
|
|
|
|
&http_connection_manager); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
http_connection_manager.mutable_http_filters(0) |
|
|
|
|
->mutable_typed_config() |
|
|
|
|
->PackFrom(HTTPFault()); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3728,13 +3726,14 @@ TEST_P(LdsTest, RejectsUnknownHttpFilterType) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
filter->mutable_typed_config()->PackFrom(Listener()); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3751,7 +3750,9 @@ TEST_P(LdsTest, IgnoresOptionalUnknownHttpFilterType) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
filter->mutable_typed_config()->PackFrom(Listener()); |
|
|
|
|
filter->set_is_optional(true); |
|
|
|
@ -3775,12 +3776,14 @@ TEST_P(LdsTest, RejectsHttpFilterWithoutConfig) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->Clear(); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3797,7 +3800,10 @@ TEST_P(LdsTest, IgnoresOptionalHttpFilterWithoutConfig) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->Clear(); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
filter->set_is_optional(true); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
@ -3820,15 +3826,16 @@ TEST_P(LdsTest, RejectsUnparseableHttpFilterType) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("unknown"); |
|
|
|
|
filter->mutable_typed_config()->PackFrom(listener); |
|
|
|
|
filter->mutable_typed_config()->set_type_url( |
|
|
|
|
"type.googleapis.com/envoy.extensions.filters.http.router.v3.Router"); |
|
|
|
|
"type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault"); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3838,7 +3845,7 @@ TEST_P(LdsTest, RejectsUnparseableHttpFilterType) { |
|
|
|
|
response_state.error_message, |
|
|
|
|
::testing::HasSubstr( |
|
|
|
|
"filter config for type " |
|
|
|
|
"envoy.extensions.filters.http.router.v3.Router failed to parse")); |
|
|
|
|
"envoy.extensions.filters.http.fault.v3.HTTPFault failed to parse")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Test that we NACK HTTP filters unsupported on client-side.
|
|
|
|
@ -3847,14 +3854,15 @@ TEST_P(LdsTest, RejectsHttpFiltersNotSupportedOnClients) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("grpc.testing.server_only_http_filter"); |
|
|
|
|
filter->mutable_typed_config()->set_type_url( |
|
|
|
|
"grpc.testing.server_only_http_filter"); |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
SetListenerAndRouteConfiguration(0, listener, default_route_config_); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK"; |
|
|
|
|
const auto response_state = |
|
|
|
@ -3872,7 +3880,9 @@ TEST_P(LdsTest, IgnoresOptionalHttpFiltersNotSupportedOnClients) { |
|
|
|
|
HttpConnectionManager http_connection_manager; |
|
|
|
|
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo( |
|
|
|
|
&http_connection_manager); |
|
|
|
|
auto* filter = http_connection_manager.add_http_filters(); |
|
|
|
|
*http_connection_manager.add_http_filters() = |
|
|
|
|
http_connection_manager.http_filters(0); |
|
|
|
|
auto* filter = http_connection_manager.mutable_http_filters(0); |
|
|
|
|
filter->set_name("grpc.testing.server_only_http_filter"); |
|
|
|
|
filter->mutable_typed_config()->set_type_url( |
|
|
|
|
"grpc.testing.server_only_http_filter"); |
|
|
|
@ -3885,7 +3895,6 @@ TEST_P(LdsTest, IgnoresOptionalHttpFiltersNotSupportedOnClients) { |
|
|
|
|
}); |
|
|
|
|
balancers_[0]->ads_service()->SetEdsResource( |
|
|
|
|
BuildEdsResource(args, DefaultEdsServiceName())); |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
WaitForBackend(0); |
|
|
|
|
EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state().state, |
|
|
|
@ -8581,6 +8590,10 @@ TEST_P(XdsEnabledServerTest, HttpFilterNotSupportedOnServer) { |
|
|
|
|
http_filter->set_name("grpc.testing.client_only_http_filter"); |
|
|
|
|
http_filter->mutable_typed_config()->set_type_url( |
|
|
|
|
"grpc.testing.client_only_http_filter"); |
|
|
|
|
http_filter = http_connection_manager.add_http_filters(); |
|
|
|
|
http_filter->set_name("router"); |
|
|
|
|
http_filter->mutable_typed_config()->PackFrom( |
|
|
|
|
envoy::extensions::filters::http::router::v3::Router()); |
|
|
|
|
listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom( |
|
|
|
|
http_connection_manager); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener); |
|
|
|
|