| 
					
				 | 
			
			
				@@ -833,6 +833,109 @@ static void test_google_default_creds_access_token(void) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_setenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR, ""); /* Reset. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+typedef enum { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  PLUGIN_INITIAL_STATE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  PLUGIN_GET_METADATA_CALLED_STATE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  PLUGIN_DESTROY_CALLED_STATE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} plugin_state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char *key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char *value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} plugin_metadata; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static const plugin_metadata plugin_md[] = {{"foo", "bar"}, {"hi", "there"}}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void plugin_get_metadata_success(void *state, const char *service_url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        grpc_credentials_plugin_metadata_cb cb, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        void *user_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  size_t i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_metadata md[GPR_ARRAY_SIZE(plugin_md)]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin_state *s = (plugin_state *)state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(strcmp(service_url, test_service_url) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *s = PLUGIN_GET_METADATA_CALLED_STATE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (i = 0; i < GPR_ARRAY_SIZE(plugin_md); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    memset(&md[i], 0, sizeof(grpc_metadata)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    md[i].key = plugin_md[i].key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    md[i].value = plugin_md[i].value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    md[i].value_length = strlen(plugin_md[i].value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cb(user_data, md, GPR_ARRAY_SIZE(md), GRPC_STATUS_OK, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void plugin_get_metadata_failure(void *state, const char *service_url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        grpc_credentials_plugin_metadata_cb cb, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        void *user_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin_state *s = (plugin_state *)state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(strcmp(service_url, test_service_url) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *s = PLUGIN_GET_METADATA_CALLED_STATE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cb(user_data, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "Could not get metadata for plugin."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void on_plugin_metadata_received_success( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    void *user_data, grpc_credentials_md *md_elems, size_t num_md, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_credentials_status status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  size_t i = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(user_data == NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(md_elems != NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(num_md == GPR_ARRAY_SIZE(plugin_md)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (i = 0; i < num_md; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GPR_ASSERT(gpr_slice_str_cmp(md_elems[i].key, plugin_md[i].key) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GPR_ASSERT(gpr_slice_str_cmp(md_elems[i].value, plugin_md[i].value) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void on_plugin_metadata_received_failure( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    void *user_data, grpc_credentials_md *md_elems, size_t num_md, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_credentials_status status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(user_data == NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(md_elems == NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(num_md == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(status == GRPC_CREDENTIALS_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void plugin_destroy(void *state) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin_state *s = (plugin_state *)state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *s = PLUGIN_DESTROY_CALLED_STATE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void test_metadata_plugin_success(void) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials *creds; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin_state state = PLUGIN_INITIAL_STATE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_metadata_credentials_plugin plugin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.state = &state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.get_metadata = plugin_get_metadata_success; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.destroy = plugin_destroy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  creds = grpc_metadata_credentials_create_from_plugin(plugin, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_INITIAL_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials_get_request_metadata( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      creds, NULL, test_service_url, on_plugin_metadata_received_success, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_GET_METADATA_CALLED_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials_release(creds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_DESTROY_CALLED_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void test_metadata_plugin_failure(void) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials *creds; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin_state state = PLUGIN_INITIAL_STATE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_metadata_credentials_plugin plugin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.state = &state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.get_metadata = plugin_get_metadata_failure; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  plugin.destroy = plugin_destroy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  creds = grpc_metadata_credentials_create_from_plugin(plugin, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_INITIAL_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials_get_request_metadata( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      creds, NULL, test_service_url, on_plugin_metadata_received_failure, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_GET_METADATA_CALLED_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_credentials_release(creds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(state == PLUGIN_DESTROY_CALLED_STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int main(int argc, char **argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_test_init(argc, argv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   test_empty_md_store(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -860,5 +963,7 @@ int main(int argc, char **argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   test_jwt_creds_signing_failure(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   test_google_default_creds_auth_key(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   test_google_default_creds_access_token(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  test_metadata_plugin_success(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  test_metadata_plugin_failure(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |