| 
					
				 | 
			
			
				@@ -49,6 +49,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/proto/grpc/testing/echo.grpc.pb.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/port.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/test_config.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "test/cpp/util/test_credentials_provider.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using grpc::testing::EchoRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using grpc::testing::EchoResponse; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -72,7 +73,7 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_event* ev_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class ShutdownTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class ShutdownTest : public ::testing::TestWithParam<string> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ShutdownTest() : shutdown_(false), service_(&ev_) { gpr_event_init(&ev_); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -85,7 +86,9 @@ class ShutdownTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc::string server_address = "localhost:" + to_string(port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ServerBuilder builder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    builder.AddListeningPort(server_address, InsecureServerCredentials()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server_creds = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GetCredentialsProvider()->GetServerCredentials(GetParam()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    builder.AddListeningPort(server_address, server_creds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     builder.RegisterService(&service_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::unique_ptr<Server> server = builder.BuildAndStart(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return server; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,7 +98,10 @@ class ShutdownTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   void ResetStub() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     string target = "dns:localhost:" + to_string(port_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    channel_ = CreateChannel(target, InsecureChannelCredentials()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ChannelArguments args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto channel_creds = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GetCredentialsProvider()->GetChannelCredentials(GetParam(), &args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    channel_ = CreateCustomChannel(target, channel_creds, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     stub_ = grpc::testing::EchoTestService::NewStub(channel_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -125,8 +131,31 @@ class ShutdownTest : public ::testing::Test { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   TestServiceImpl service_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+std::vector<string> GetAllCredentialsTypeList() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<grpc::string> credentials_types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (GetCredentialsProvider()->GetChannelCredentials(kInsecureCredentialsType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      nullptr) != nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    credentials_types.push_back(kInsecureCredentialsType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  auto sec_list = GetCredentialsProvider()->GetSecureCredentialsTypeList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (auto sec = sec_list.begin(); sec != sec_list.end(); sec++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    credentials_types.push_back(*sec); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(!credentials_types.empty()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string credentials_type_list("credentials types:"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (const string& type : credentials_types) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    credentials_type_list.append(" " + type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_log(GPR_INFO, "%s", credentials_type_list.c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return credentials_types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+INSTANTIATE_TEST_CASE_P(End2EndShutdown, ShutdownTest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ::testing::ValuesIn(GetAllCredentialsTypeList())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // TODO(ctiller): leaked objects in this test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-TEST_F(ShutdownTest, ShutdownTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TEST_P(ShutdownTest, ShutdownTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ResetStub(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // send the request in a background thread 
			 |