| 
					
				 | 
			
			
				@@ -1177,8 +1177,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   void ResetStub(int failover_timeout = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  const grpc::string& expected_targets = "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 int xds_resource_does_not_exist_timeout = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 bool xds_routing_enabled = false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 int xds_resource_does_not_exist_timeout = 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ChannelArguments args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (failover_timeout > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       args.SetInt(GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, failover_timeout); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1187,9 +1186,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       args.SetInt(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   xds_resource_does_not_exist_timeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (xds_routing_enabled) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      args.SetInt(GRPC_ARG_XDS_ROUTING_ENABLED, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // If the parent channel is using the fake resolver, we inject the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // response generator for the parent here, and then SetNextResolution() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // will inject the xds channel's response generator via the parent's 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2372,10 +2368,7 @@ TEST_P(LdsRdsTest, RouteMatchHasNonemptyPrefix) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has a prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string with no "/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2390,15 +2383,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has a prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string does not end with "/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2411,15 +2402,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Prefix not in the required format of /service/"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has a prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string does not start with "/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2431,15 +2420,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has a prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string with extra content outside of "/service/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2451,15 +2438,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Prefix does not end with a /"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has a prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string "//". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2471,15 +2456,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Prefix contains empty service name"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // but it's empty. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2494,15 +2477,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Path if set cannot be empty"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string does not start with "/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2517,15 +2498,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Path does not start with a /"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string that ends with "/". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2541,15 +2520,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Path not in the required format of /service/method"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string that misses "/" between service and method. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2565,15 +2542,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Path not in the required format of /service/method"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string that is missing service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2588,15 +2563,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Path contains empty service name"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route match has path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // string that is missing method. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2611,6 +2584,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const auto& response_state = RouteConfigurationResponseState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, "Path contains empty method name"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should send a NACK if route has an action other than 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2649,10 +2623,7 @@ TEST_P(LdsRdsTest, RouteActionUnsupportedClusterSpecifier) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2669,13 +2640,11 @@ TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "RouteAction cluster contains empty cluster name."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kWeight75 = 75; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2701,13 +2670,11 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "RouteAction weighted_cluster has incorrect total weight"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kWeight75 = 75; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       balancers_[0]->ads_service()->default_route_config(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2733,13 +2700,11 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       "RouteAction weighted_cluster cluster contains empty cluster name."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kWeight75 = 75; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   RouteConfiguration route_config = 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2764,6 +2729,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(response_state.error_message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "RouteAction weighted_cluster cluster missing weight"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client times out when no response received. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2782,10 +2748,7 @@ TEST_P(LdsRdsTest, Timeout) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Tests that LDS client should choose the default route (with no matching 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // specified) after unable to find a match with previous routes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, XdsRoutingPathMatching) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster2Name = "new_cluster_2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kNumEcho1Rpcs = 10; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2855,13 +2818,11 @@ TEST_P(LdsRdsTest, XdsRoutingPathMatching) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster2Name = "new_cluster_2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kNumEcho1Rpcs = 10; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2926,13 +2887,11 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster2Name = "new_cluster_2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const size_t kNumEcho1Rpcs = 1000; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3009,13 +2968,11 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 - kErrorTolerance)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 + kErrorTolerance)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster2Name = "anew_cluster_2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster3Name = "new_cluster_3"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3137,13 +3094,11 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 - kErrorTolerance)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 + kErrorTolerance)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ResetStub(/*failover_timeout=*/0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*expected_targets=*/"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_resource_does_not_exist_timeout*/ 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /*xds_routing_enabled=*/true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster1Name = "new_cluster_1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster2Name = "anew_cluster_2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* kNewCluster3Name = "new_cluster_3"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3290,6 +3245,7 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 - kErrorTolerance)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              (1 + kErrorTolerance)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using CdsTest = BasicTest; 
			 |