| 
					
				 | 
			
			
				@@ -37,6 +37,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gpr/thd.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gprpp/ref_counted_ptr.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/iomgr/sockaddr.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/core/lib/security/credentials/fake/fake_credentials.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/cpp/server/secure_server_credentials.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/cpp/client/secure_credentials.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/port.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/test_config.h" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -380,15 +384,21 @@ class GrpclbEnd2endTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SetNextResolution(addresses); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  void ResetStub(int fallback_timeout = 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void ResetStub(int fallback_timeout = 0, grpc::string expected_targets = "") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ChannelArguments args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     args.SetGrpclbFallbackTimeout(fallback_timeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     response_generator_.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!expected_targets.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      args.SetString(GRPC_ARG_FAKE_SECURITY_EXPECTED_TARGETS, expected_targets); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::ostringstream uri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    uri << "fake:///servername_not_used"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    channel_ = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        CreateCustomChannel(uri.str(), InsecureChannelCredentials(), args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    uri << "fake:///" << kApplicationTargetName_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // TODO(dgq): templatize tests to run everything using both secure and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // insecure channel credentials. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::shared_ptr<ChannelCredentials> creds(new SecureChannelCredentials( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        grpc_fake_transport_security_credentials_create())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    channel_ = CreateCustomChannel(uri.str(), creds, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     stub_ = grpc::testing::EchoTestService::NewStub(channel_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -566,8 +576,9 @@ class GrpclbEnd2endTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       std::ostringstream server_address; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address << server_host << ":" << port_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       ServerBuilder builder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      builder.AddListeningPort(server_address.str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                               InsecureServerCredentials()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      std::shared_ptr<ServerCredentials> creds(new SecureServerCredentials( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          grpc_fake_transport_security_server_credentials_create())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      builder.AddListeningPort(server_address.str(), creds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       builder.RegisterService(service_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_ = builder.BuildAndStart(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       cond->notify_one(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -600,6 +611,7 @@ class GrpclbEnd2endTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       response_generator_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const grpc::string kRequestMessage_ = "Live long and prosper."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const grpc::string kApplicationTargetName_ = "application_target_name"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class SingleBalancerTest : public GrpclbEnd2endTest { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -635,6 +647,48 @@ TEST_F(SingleBalancerTest, Vanilla) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TEST_F(SingleBalancerTest, SecureNaming) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ResetStub(0, kApplicationTargetName_ + ";lb"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  SetNextResolution({AddressData{balancer_servers_[0].port_, true, "lb"}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const size_t kNumRpcsPerAddress = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ScheduleResponseForBalancer( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Make sure that trying to connect works without a call. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  channel_->GetState(true /* try_to_connect */); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // We need to wait for all backends to come online. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  WaitForAllBackends(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Send kNumRpcsPerAddress RPCs per server. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Each backend should have gotten 100 requests. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < backends_.size(); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(kNumRpcsPerAddress, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              backend_servers_[i].service_->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  balancers_[0]->NotifyDoneWithServerlists(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The balancer got a single request. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  EXPECT_EQ(1U, balancer_servers_[0].service_->request_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // and sent a single response. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  EXPECT_EQ(1U, balancer_servers_[0].service_->response_count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Check LB policy name for the channel. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TEST_F(SingleBalancerTest, SecureNamingDeathTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Make sure that we blow up (via abort() from the security connector) when 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // the name from the balancer doesn't match expectations. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ASSERT_DEATH( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ResetStub(0, kApplicationTargetName_ + ";lb"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SetNextResolution( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            {AddressData{balancer_servers_[0].port_, true, "woops"}}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        channel_->WaitForConnected(grpc_timeout_seconds_to_deadline(1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_F(SingleBalancerTest, InitiallyEmptyServerlist) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   SetNextResolutionAllBalancers(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor(); 
			 |