| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package auth | 5 package auth |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "io/ioutil" | 8 "io/ioutil" |
| 9 "net/http" | 9 "net/http" |
| 10 "os" | 10 "os" |
| 11 "path/filepath" | 11 "path/filepath" |
| 12 "testing" | 12 "testing" |
| 13 | 13 |
| 14 "infra/libs/auth/internal" | 14 "infra/libs/auth/internal" |
| 15 "infra/libs/logging" | 15 "infra/libs/logging" |
| 16 | 16 |
| 17 "golang.org/x/net/context" | 17 "golang.org/x/net/context" |
| 18 | 18 |
| 19 . "github.com/smartystreets/goconvey/convey" | 19 . "github.com/smartystreets/goconvey/convey" |
| 20 ) | 20 ) |
| 21 | 21 |
| 22 var ( |
| 23 log = logging.DefaultLogger |
| 24 ) |
| 25 |
| 22 func ExampleDefaultAuthenticatedClient() { | 26 func ExampleDefaultAuthenticatedClient() { |
| 23 client, err := DefaultAuthenticatedClient(SilentLogin) | 27 client, err := DefaultAuthenticatedClient(SilentLogin) |
| 24 if err == ErrLoginRequired { | 28 if err == ErrLoginRequired { |
| 25 » » logging.Errorf("Run 'auth login' to login") | 29 » » log.Errorf("Run 'auth login' to login") |
| 26 return | 30 return |
| 27 } | 31 } |
| 28 if err != nil { | 32 if err != nil { |
| 29 » » logging.Errorf("Failed to login: %s", err) | 33 » » log.Errorf("Failed to login: %s", err) |
| 30 return | 34 return |
| 31 } | 35 } |
| 32 client.Get("https://some-server.appspot.com") | 36 client.Get("https://some-server.appspot.com") |
| 33 } | 37 } |
| 34 | 38 |
| 35 func mockSecretsDir() string { | 39 func mockSecretsDir() string { |
| 36 tempDir, err := ioutil.TempDir("", "auth_test") | 40 tempDir, err := ioutil.TempDir("", "auth_test") |
| 37 So(err, ShouldBeNil) | 41 So(err, ShouldBeNil) |
| 38 | 42 |
| 39 prev := secretsDir | 43 prev := secretsDir |
| (...skipping 10 matching lines...) Expand all Loading... |
| 50 func mockTokenProvider(factory func() internal.TokenProvider) { | 54 func mockTokenProvider(factory func() internal.TokenProvider) { |
| 51 prev := makeTokenProvider | 55 prev := makeTokenProvider |
| 52 makeTokenProvider = func(*Options) (internal.TokenProvider, error) { | 56 makeTokenProvider = func(*Options) (internal.TokenProvider, error) { |
| 53 return factory(), nil | 57 return factory(), nil |
| 54 } | 58 } |
| 55 Reset(func() { | 59 Reset(func() { |
| 56 makeTokenProvider = prev | 60 makeTokenProvider = prev |
| 57 }) | 61 }) |
| 58 } | 62 } |
| 59 | 63 |
| 60 func mockTerminal() { | |
| 61 prev := logging.IsTerminal | |
| 62 logging.IsTerminal = true | |
| 63 Reset(func() { | |
| 64 logging.IsTerminal = prev | |
| 65 }) | |
| 66 } | |
| 67 | |
| 68 func TestAuthenticator(t *testing.T) { | 64 func TestAuthenticator(t *testing.T) { |
| 69 Convey("Given mocked secrets dir", t, func() { | 65 Convey("Given mocked secrets dir", t, func() { |
| 70 tempDir := mockSecretsDir() | 66 tempDir := mockSecretsDir() |
| 71 | 67 |
| 72 Convey("Check NewAuthenticator defaults", func() { | 68 Convey("Check NewAuthenticator defaults", func() { |
| 73 clientID, clientSecret := DefaultClient() | 69 clientID, clientSecret := DefaultClient() |
| 74 a := NewAuthenticator(Options{}).(*authenticatorImpl) | 70 a := NewAuthenticator(Options{}).(*authenticatorImpl) |
| 75 So(a.opts, ShouldResemble, &Options{ | 71 So(a.opts, ShouldResemble, &Options{ |
| 76 Method: AutoSelectMethod, | 72 Method: AutoSelectMethod, |
| 77 Scopes: []string{OAuthScopeEmail
}, | 73 Scopes: []string{OAuthScopeEmail
}, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 107 So(len(left), ShouldEqual, 1) | 103 So(len(left), ShouldEqual, 1) |
| 108 So(left[0].Name(), ShouldEqual, "not-secret.txt") | 104 So(left[0].Name(), ShouldEqual, "not-secret.txt") |
| 109 }) | 105 }) |
| 110 }) | 106 }) |
| 111 } | 107 } |
| 112 | 108 |
| 113 func TestAuthenticatedClient(t *testing.T) { | 109 func TestAuthenticatedClient(t *testing.T) { |
| 114 Convey("Given mocked secrets dir", t, func() { | 110 Convey("Given mocked secrets dir", t, func() { |
| 115 var tokenProvider internal.TokenProvider | 111 var tokenProvider internal.TokenProvider |
| 116 | 112 |
| 117 mockTerminal() | |
| 118 mockSecretsDir() | 113 mockSecretsDir() |
| 119 mockTokenProvider(func() internal.TokenProvider { return tokenPr
ovider }) | 114 mockTokenProvider(func() internal.TokenProvider { return tokenPr
ovider }) |
| 120 | 115 |
| 121 Convey("Test login required", func() { | 116 Convey("Test login required", func() { |
| 122 tokenProvider = &fakeTokenProvider{interactive: true} | 117 tokenProvider = &fakeTokenProvider{interactive: true} |
| 123 c, err := AuthenticatedClient(InteractiveLogin, NewAuthe
nticator(Options{})) | 118 c, err := AuthenticatedClient(InteractiveLogin, NewAuthe
nticator(Options{})) |
| 124 So(err, ShouldBeNil) | 119 So(err, ShouldBeNil) |
| 125 So(c, ShouldNotEqual, http.DefaultClient) | 120 So(c, ShouldNotEqual, http.DefaultClient) |
| 126 }) | 121 }) |
| 127 | 122 |
| 128 Convey("Test login not required", func() { | 123 Convey("Test login not required", func() { |
| 129 tokenProvider = &fakeTokenProvider{interactive: true} | 124 tokenProvider = &fakeTokenProvider{interactive: true} |
| 130 c, err := AuthenticatedClient(OptionalLogin, NewAuthenti
cator(Options{})) | 125 c, err := AuthenticatedClient(OptionalLogin, NewAuthenti
cator(Options{})) |
| 131 So(err, ShouldBeNil) | 126 So(err, ShouldBeNil) |
| 132 So(c, ShouldEqual, http.DefaultClient) | 127 So(c, ShouldEqual, http.DefaultClient) |
| 133 }) | 128 }) |
| 134 }) | 129 }) |
| 135 } | 130 } |
| 136 | 131 |
| 137 func TestRefreshToken(t *testing.T) { | 132 func TestRefreshToken(t *testing.T) { |
| 138 Convey("Given mocked secrets dir", t, func() { | 133 Convey("Given mocked secrets dir", t, func() { |
| 139 var tokenProvider *fakeTokenProvider | 134 var tokenProvider *fakeTokenProvider |
| 140 | 135 |
| 141 mockTerminal() | |
| 142 mockSecretsDir() | 136 mockSecretsDir() |
| 143 mockTokenProvider(func() internal.TokenProvider { return tokenPr
ovider }) | 137 mockTokenProvider(func() internal.TokenProvider { return tokenPr
ovider }) |
| 144 | 138 |
| 145 Convey("Test non interactive auth", func() { | 139 Convey("Test non interactive auth", func() { |
| 146 tokenProvider = &fakeTokenProvider{ | 140 tokenProvider = &fakeTokenProvider{ |
| 147 interactive: false, | 141 interactive: false, |
| 148 tokenToMint: &fakeToken{}, | 142 tokenToMint: &fakeToken{}, |
| 149 } | 143 } |
| 150 auth, ok := NewAuthenticator(Options{}).(*authenticatorI
mpl) | 144 auth, ok := NewAuthenticator(Options{}).(*authenticatorI
mpl) |
| 151 So(ok, ShouldBeTrue) | 145 So(ok, ShouldBeTrue) |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 expired bool | 243 expired bool |
| 250 } | 244 } |
| 251 | 245 |
| 252 func (t *fakeToken) Equals(another internal.Token) bool { | 246 func (t *fakeToken) Equals(another internal.Token) bool { |
| 253 casted, ok := another.(*fakeToken) | 247 casted, ok := another.(*fakeToken) |
| 254 return ok && casted == t | 248 return ok && casted == t |
| 255 } | 249 } |
| 256 | 250 |
| 257 func (t *fakeToken) RequestHeaders() map[string]string { return make(map[string]
string) } | 251 func (t *fakeToken) RequestHeaders() map[string]string { return make(map[string]
string) } |
| 258 func (t *fakeToken) Expired() bool { return t.expired } | 252 func (t *fakeToken) Expired() bool { return t.expired } |
| OLD | NEW |