all: deprecate NoContext

There is no good reason why we suggest NoContext rather than
context.Background(). When the oauth2 library first came around, the
community was not familiar with the x/net/context package. For
documentation reasons, we decided to add NoContext to the oauth2
package. It was not a good idea even back then. And given that context
package is fairly popular, there is no good reason why we are
depending on this.

Updating all the references of NoContext with context.Background
and documenting it as deprecated.

Change-Id: I18e390f1351023a29b567777a3f963dd550cf657
Reviewed-on: https://go-review.googlesource.com/27690
Reviewed-by: Chris Broadfoot <cbro@golang.org>
diff --git a/clientcredentials/clientcredentials_test.go b/clientcredentials/clientcredentials_test.go
index 5a0170a..061b43b 100644
--- a/clientcredentials/clientcredentials_test.go
+++ b/clientcredentials/clientcredentials_test.go
@@ -5,12 +5,11 @@
 package clientcredentials
 
 import (
+	"context"
 	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"testing"
-
-	"golang.org/x/oauth2"
 )
 
 func newConf(url string) *Config {
@@ -57,7 +56,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	tok, err := conf.Token(oauth2.NoContext)
+	tok, err := conf.Token(context.Background())
 	if err != nil {
 		t.Error(err)
 	}
@@ -91,6 +90,6 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	c := conf.Client(oauth2.NoContext)
+	c := conf.Client(context.Background())
 	c.Get(ts.URL + "/somethingelse")
 }
diff --git a/example_test.go b/example_test.go
index f5ac863..d861fe7 100644
--- a/example_test.go
+++ b/example_test.go
@@ -5,6 +5,7 @@
 package oauth2_test
 
 import (
+	"context"
 	"fmt"
 	"log"
 
@@ -12,6 +13,7 @@
 )
 
 func ExampleConfig() {
+	ctx := context.Background()
 	conf := &oauth2.Config{
 		ClientID:     "YOUR_CLIENT_ID",
 		ClientSecret: "YOUR_CLIENT_SECRET",
@@ -35,11 +37,11 @@
 	if _, err := fmt.Scan(&code); err != nil {
 		log.Fatal(err)
 	}
-	tok, err := conf.Exchange(oauth2.NoContext, code)
+	tok, err := conf.Exchange(ctx, code)
 	if err != nil {
 		log.Fatal(err)
 	}
 
-	client := conf.Client(oauth2.NoContext, tok)
+	client := conf.Client(ctx, tok)
 	client.Get("...")
 }
diff --git a/jwt/example_test.go b/jwt/example_test.go
index a9533e8..58503d8 100644
--- a/jwt/example_test.go
+++ b/jwt/example_test.go
@@ -5,11 +5,13 @@
 package jwt_test
 
 import (
-	"golang.org/x/oauth2"
+	"context"
+
 	"golang.org/x/oauth2/jwt"
 )
 
 func ExampleJWTConfig() {
+	ctx := context.Background()
 	conf := &jwt.Config{
 		Email: "xxx@developer.com",
 		// The contents of your RSA private key or your PEM file
@@ -26,6 +28,6 @@
 	}
 	// Initiate an http.Client, the following GET request will be
 	// authorized and authenticated on the behalf of user@example.com.
-	client := conf.Client(oauth2.NoContext)
+	client := conf.Client(ctx)
 	client.Get("...")
 }
diff --git a/jwt/jwt_test.go b/jwt/jwt_test.go
index a9c126b..b79b816 100644
--- a/jwt/jwt_test.go
+++ b/jwt/jwt_test.go
@@ -5,11 +5,10 @@
 package jwt
 
 import (
+	"context"
 	"net/http"
 	"net/http/httptest"
 	"testing"
-
-	"golang.org/x/oauth2"
 )
 
 var dummyPrivateKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
@@ -57,7 +56,7 @@
 		PrivateKey: dummyPrivateKey,
 		TokenURL:   ts.URL,
 	}
-	tok, err := conf.TokenSource(oauth2.NoContext).Token()
+	tok, err := conf.TokenSource(context.Background()).Token()
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -91,7 +90,7 @@
 		PrivateKey: dummyPrivateKey,
 		TokenURL:   ts.URL,
 	}
-	tok, err := conf.TokenSource(oauth2.NoContext).Token()
+	tok, err := conf.TokenSource(context.Background()).Token()
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -124,7 +123,7 @@
 		PrivateKey: dummyPrivateKey,
 		TokenURL:   ts.URL,
 	}
-	tok, err := conf.TokenSource(oauth2.NoContext).Token()
+	tok, err := conf.TokenSource(context.Background()).Token()
 	if err == nil {
 		t.Error("got a token; expected error")
 		if tok.AccessToken != "" {
diff --git a/oauth2.go b/oauth2.go
index 0505263..7b06bfe 100644
--- a/oauth2.go
+++ b/oauth2.go
@@ -21,6 +21,8 @@
 
 // NoContext is the default context you should supply if not using
 // your own context.Context (see https://golang.org/x/net/context).
+//
+// Deprecated: Use context.Background() or context.TODO() instead.
 var NoContext = context.TODO()
 
 // RegisterBrokenAuthHeaderProvider registers an OAuth2 server
diff --git a/oauth2_test.go b/oauth2_test.go
index a9aecd6..e6f5cac 100644
--- a/oauth2_test.go
+++ b/oauth2_test.go
@@ -97,7 +97,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	tok, err := conf.Exchange(NoContext, "exchange-code")
+	tok, err := conf.Exchange(context.Background(), "exchange-code")
 	if err != nil {
 		t.Error(err)
 	}
@@ -141,7 +141,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	tok, err := conf.Exchange(NoContext, "exchange-code")
+	tok, err := conf.Exchange(context.Background(), "exchange-code")
 	if err != nil {
 		t.Error(err)
 	}
@@ -236,7 +236,7 @@
 	defer ts.Close()
 	conf := newConf(ts.URL)
 	t1 := time.Now().Add(day)
-	tok, err := conf.Exchange(NoContext, "exchange-code")
+	tok, err := conf.Exchange(context.Background(), "exchange-code")
 	t2 := time.Now().Add(day)
 	// Do a fmt.Sprint comparison so either side can be
 	// nil. fmt.Sprint just stringifies them to "<nil>", and no
@@ -269,7 +269,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	tok, err := conf.Exchange(NoContext, "code")
+	tok, err := conf.Exchange(context.Background(), "code")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -285,7 +285,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	_, err := conf.Exchange(NoContext, "exchange-code")
+	_, err := conf.Exchange(context.Background(), "exchange-code")
 	if err == nil {
 		t.Error("expected error from invalid access_token type")
 	}
@@ -344,7 +344,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	tok, err := conf.PasswordCredentialsToken(NoContext, "user1", "password1")
+	tok, err := conf.PasswordCredentialsToken(context.Background(), "user1", "password1")
 	if err != nil {
 		t.Error(err)
 	}
@@ -380,7 +380,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	c := conf.Client(NoContext, &Token{RefreshToken: "REFRESH_TOKEN"})
+	c := conf.Client(context.Background(), &Token{RefreshToken: "REFRESH_TOKEN"})
 	c.Get(ts.URL + "/somethingelse")
 }
 
@@ -403,7 +403,7 @@
 	}))
 	defer ts.Close()
 	conf := newConf(ts.URL)
-	c := conf.Client(NoContext, nil)
+	c := conf.Client(context.Background(), nil)
 	_, err := c.Get(ts.URL + "/somethingelse")
 	if err == nil {
 		t.Errorf("Fetch should return an error if no refresh token is set")
@@ -420,7 +420,7 @@
 	conf := newConf(ts.URL)
 	tkr := tokenRefresher{
 		conf:         conf,
-		ctx:          NoContext,
+		ctx:          context.Background(),
 		refreshToken: "OLD REFRESH TOKEN",
 	}
 	tk, err := tkr.Token()
@@ -446,7 +446,7 @@
 	defer ts.Close()
 	conf := newConf(ts.URL)
 
-	c := conf.Client(NoContext, tok)
+	c := conf.Client(context.Background(), tok)
 	req, err := http.NewRequest("GET", ts.URL, nil)
 	if err != nil {
 		t.Error(err)