From 331e3782af23388a87d34c818ae205d15dacba1f Mon Sep 17 00:00:00 2001
From: Julien Boeuf <jboeuf@google.com>
Date: Thu, 10 Dec 2015 14:44:35 -0800
Subject: [PATCH 1/2] Testing cached google default creds.

---
 test/core/security/credentials_test.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/test/core/security/credentials_test.c b/test/core/security/credentials_test.c
index 5eb61180575..40a2332a117 100644
--- a/test/core/security/credentials_test.c
+++ b/test/core/security/credentials_test.c
@@ -917,6 +917,7 @@ static char *null_well_known_creds_path_getter(void) {
 static void test_google_default_creds_gce(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_composite_channel_credentials *creds;
+  grpc_channel_credentials *cached_creds;
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
   grpc_flush_cached_google_default_credentials();
@@ -942,7 +943,13 @@ static void test_google_default_creds_gce(void) {
   grpc_exec_ctx_flush(&exec_ctx);
   grpc_exec_ctx_finish(&exec_ctx);
 
+  /* Check that we get a cached creds if we call
+     grpc_google_default_credentials_create again. */
+  cached_creds = grpc_google_default_credentials_create();
+  GPR_ASSERT(cached_creds == &creds->base);
+
   /* Cleanup. */
+  grpc_channel_credentials_release(cached_creds);
   grpc_channel_credentials_release(&creds->base);
   grpc_httpcli_set_override(NULL, NULL);
   grpc_override_well_known_credentials_path_getter(NULL);

From 97e5147bd1ab47adb659fdb5306091a9342c7d9f Mon Sep 17 00:00:00 2001
From: Julien Boeuf <jboeuf@google.com>
Date: Thu, 10 Dec 2015 15:06:45 -0800
Subject: [PATCH 2/2] One more test for default google creds.

---
 test/core/security/credentials_test.c | 40 ++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/test/core/security/credentials_test.c b/test/core/security/credentials_test.c
index 40a2332a117..d3cdb079583 100644
--- a/test/core/security/credentials_test.c
+++ b/test/core/security/credentials_test.c
@@ -944,7 +944,10 @@ static void test_google_default_creds_gce(void) {
   grpc_exec_ctx_finish(&exec_ctx);
 
   /* Check that we get a cached creds if we call
-     grpc_google_default_credentials_create again. */
+     grpc_google_default_credentials_create again.
+     GCE detection should not occur anymore either. */
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
   cached_creds = grpc_google_default_credentials_create();
   GPR_ASSERT(cached_creds == &creds->base);
 
@@ -955,6 +958,40 @@ static void test_google_default_creds_gce(void) {
   grpc_override_well_known_credentials_path_getter(NULL);
 }
 
+static int default_creds_gce_detection_httpcli_get_failure_override(
+    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
+    gpr_timespec deadline, grpc_httpcli_response_cb on_response,
+    void *user_data) {
+  /* No magic header. */
+  grpc_httpcli_response response = http_response(200, "");
+  GPR_ASSERT(strcmp(request->path, "/") == 0);
+  GPR_ASSERT(strcmp(request->host, "metadata.google.internal") == 0);
+  on_response(exec_ctx, user_data, &response);
+  return 1;
+}
+
+static void test_no_google_default_creds(void) {
+  grpc_flush_cached_google_default_credentials();
+  gpr_setenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR, ""); /* Reset. */
+  grpc_override_well_known_credentials_path_getter(
+      null_well_known_creds_path_getter);
+
+  /* Simulate a successful detection of GCE. */
+  grpc_httpcli_set_override(
+      default_creds_gce_detection_httpcli_get_failure_override,
+      httpcli_post_should_not_be_called);
+  GPR_ASSERT(grpc_google_default_credentials_create() == NULL);
+
+  /* Try a cached one. GCE detection should not occur anymore. */
+  grpc_httpcli_set_override(httpcli_get_should_not_be_called,
+                            httpcli_post_should_not_be_called);
+  GPR_ASSERT(grpc_google_default_credentials_create() == NULL);
+
+  /* Cleanup. */
+  grpc_httpcli_set_override(NULL, NULL);
+  grpc_override_well_known_credentials_path_getter(NULL);
+}
+
 typedef enum {
   PLUGIN_INITIAL_STATE,
   PLUGIN_GET_METADATA_CALLED_STATE,
@@ -1131,6 +1168,7 @@ int main(int argc, char **argv) {
   test_google_default_creds_auth_key();
   test_google_default_creds_refresh_token();
   test_google_default_creds_gce();
+  test_no_google_default_creds();
   test_metadata_plugin_success();
   test_metadata_plugin_failure();
   test_get_well_known_google_credentials_file_path();