oauth2: fix brittle test

A change introduced in https://golang.org/cl/18692 expanded upon the errors
returned by the json package to be more informative about where the error occurred.
This breaks a test in oauth2 that relies on the exact form that an error takes.
Fix this test by simply checking whether it passes or not.

Fixes golang/go#17363
Updates golang/go#11811

Change-Id: I0062dc64fc1a8fd094b14ed1d0b21528edfbb282
Reviewed-on: https://go-review.googlesource.com/30600
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/oauth2_test.go b/oauth2_test.go
index 982ea99..e98c01a 100644
--- a/oauth2_test.go
+++ b/oauth2_test.go
@@ -5,15 +5,12 @@
 package oauth2
 
 import (
-	"encoding/json"
 	"errors"
 	"fmt"
 	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"net/url"
-	"reflect"
-	"strconv"
 	"testing"
 	"time"
 
@@ -210,23 +207,22 @@
 
 func TestExchangeRequest_JSONResponse_Expiry(t *testing.T) {
 	seconds := int32(day.Seconds())
-	jsonNumberType := reflect.TypeOf(json.Number("0"))
 	for _, c := range []struct {
 		expires string
-		expect  error
+		want    bool
 	}{
-		{fmt.Sprintf(`"expires_in": %d`, seconds), nil},
-		{fmt.Sprintf(`"expires_in": "%d"`, seconds), nil},                                             // PayPal case
-		{fmt.Sprintf(`"expires": %d`, seconds), nil},                                                  // Facebook case
-		{`"expires": false`, &json.UnmarshalTypeError{Value: "bool", Type: jsonNumberType}},           // wrong type
-		{`"expires": {}`, &json.UnmarshalTypeError{Value: "object", Type: jsonNumberType}},            // wrong type
-		{`"expires": "zzz"`, &strconv.NumError{Func: "ParseInt", Num: "zzz", Err: strconv.ErrSyntax}}, // wrong value
+		{fmt.Sprintf(`"expires_in": %d`, seconds), true},
+		{fmt.Sprintf(`"expires_in": "%d"`, seconds), true}, // PayPal case
+		{fmt.Sprintf(`"expires": %d`, seconds), true},      // Facebook case
+		{`"expires": false`, false},                        // wrong type
+		{`"expires": {}`, false},                           // wrong type
+		{`"expires": "zzz"`, false},                        // wrong value
 	} {
-		testExchangeRequest_JSONResponse_expiry(t, c.expires, c.expect)
+		testExchangeRequest_JSONResponse_expiry(t, c.expires, c.want)
 	}
 }
 
-func testExchangeRequest_JSONResponse_expiry(t *testing.T, exp string, expect error) {
+func testExchangeRequest_JSONResponse_expiry(t *testing.T, exp string, want bool) {
 	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		w.Header().Set("Content-Type", "application/json")
 		w.Write([]byte(fmt.Sprintf(`{"access_token": "90d", "scope": "user", "token_type": "bearer", %s}`, exp)))
@@ -236,19 +232,15 @@
 	t1 := time.Now().Add(day)
 	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
-	// non-nil expected error ever stringifies as "<nil>", so this
-	// isn't terribly disgusting.  We do this because Go 1.4 and
-	// Go 1.5 return a different deep value for
-	// json.UnmarshalTypeError.  In Go 1.5, the
-	// json.UnmarshalTypeError contains a new field with a new
-	// non-zero value.  Rather than ignore it here with reflect or
-	// add new files and +build tags, just look at the strings.
-	if fmt.Sprint(err) != fmt.Sprint(expect) {
-		t.Errorf("Error = %v; want %v", err, expect)
+
+	if got := (err == nil); got != want {
+		if want {
+			t.Errorf("unexpected error: got %v", err)
+		} else {
+			t.Errorf("unexpected success")
+		}
 	}
-	if err != nil {
+	if !want {
 		return
 	}
 	if !tok.Valid() {