Index: go/src/infra/libs/auth/auth_test.go |
diff --git a/go/src/infra/libs/auth/auth_test.go b/go/src/infra/libs/auth/auth_test.go |
deleted file mode 100644 |
index 30015056f0c4326eca9e86520772f464e692e463..0000000000000000000000000000000000000000 |
--- a/go/src/infra/libs/auth/auth_test.go |
+++ /dev/null |
@@ -1,230 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package auth |
- |
-import ( |
- "io/ioutil" |
- "net/http" |
- "os" |
- "path/filepath" |
- "testing" |
- |
- "infra/libs/auth/internal" |
- "infra/libs/logging" |
- |
- "golang.org/x/net/context" |
- |
- . "github.com/smartystreets/goconvey/convey" |
-) |
- |
-var ( |
- ctx = context.Background() |
- log = logging.Null() |
-) |
- |
-func ExampleDefaultAuthenticatedClient() { |
- client, err := AuthenticatedClient(SilentLogin, NewAuthenticator(Options{})) |
- if err == ErrLoginRequired { |
- log.Errorf("Run 'auth login' to login") |
- return |
- } |
- if err != nil { |
- log.Errorf("Failed to login: %s", err) |
- return |
- } |
- client.Get("https://some-server.appspot.com") |
-} |
- |
-func mockSecretsDir() string { |
- tempDir, err := ioutil.TempDir("", "auth_test") |
- So(err, ShouldBeNil) |
- |
- prev := secretsDir |
- secretsDir = func() string { return tempDir } |
- Reset(func() { |
- secretsDir = prev |
- os.RemoveAll(tempDir) |
- }) |
- So(SecretsDir(), ShouldEqual, tempDir) |
- |
- return tempDir |
-} |
- |
-func mockTokenProvider(factory func() internal.TokenProvider) { |
- prev := makeTokenProvider |
- makeTokenProvider = func(*Options) (internal.TokenProvider, error) { |
- return factory(), nil |
- } |
- Reset(func() { |
- makeTokenProvider = prev |
- }) |
-} |
- |
-func TestAuthenticator(t *testing.T) { |
- Convey("Given mocked secrets dir", t, func() { |
- tempDir := mockSecretsDir() |
- |
- Convey("Check NewAuthenticator defaults", func() { |
- clientID, clientSecret := DefaultClient() |
- ctx := context.Background() |
- a := NewAuthenticator(Options{Context: ctx}).(*authenticatorImpl) |
- So(a.opts, ShouldResemble, &Options{ |
- Method: AutoSelectMethod, |
- Scopes: []string{OAuthScopeEmail}, |
- ClientID: clientID, |
- ClientSecret: clientSecret, |
- ServiceAccountJSONPath: filepath.Join(tempDir, "service_account.json"), |
- GCEAccountName: "default", |
- Context: ctx, |
- Logger: logging.Get(ctx), |
- }) |
- }) |
- }) |
-} |
- |
-func TestAuthenticatedClient(t *testing.T) { |
- Convey("Given mocked secrets dir", t, func() { |
- var tokenProvider internal.TokenProvider |
- |
- mockSecretsDir() |
- mockTokenProvider(func() internal.TokenProvider { return tokenProvider }) |
- |
- Convey("Test login required", func() { |
- tokenProvider = &fakeTokenProvider{interactive: true} |
- c, err := AuthenticatedClient(InteractiveLogin, NewAuthenticator(Options{})) |
- So(err, ShouldBeNil) |
- So(c, ShouldNotEqual, http.DefaultClient) |
- }) |
- |
- Convey("Test login not required", func() { |
- tokenProvider = &fakeTokenProvider{interactive: true} |
- c, err := AuthenticatedClient(OptionalLogin, NewAuthenticator(Options{})) |
- So(err, ShouldBeNil) |
- So(c, ShouldEqual, http.DefaultClient) |
- }) |
- }) |
-} |
- |
-func TestRefreshToken(t *testing.T) { |
- Convey("Given mocked secrets dir", t, func() { |
- var tokenProvider *fakeTokenProvider |
- |
- mockSecretsDir() |
- mockTokenProvider(func() internal.TokenProvider { return tokenProvider }) |
- |
- Convey("Test non interactive auth", func() { |
- tokenProvider = &fakeTokenProvider{ |
- interactive: false, |
- tokenToMint: &fakeToken{}, |
- } |
- auth, ok := NewAuthenticator(Options{}).(*authenticatorImpl) |
- So(ok, ShouldBeTrue) |
- _, err := auth.Transport() |
- So(err, ShouldBeNil) |
- // No token yet. The token is minted on first refresh. |
- So(auth.currentToken(), ShouldBeNil) |
- tok, err := auth.refreshToken(nil) |
- So(err, ShouldBeNil) |
- So(tok, ShouldEqual, tokenProvider.tokenToMint) |
- }) |
- |
- Convey("Test interactive auth (cache expired)", func() { |
- tokenProvider = &fakeTokenProvider{ |
- interactive: true, |
- tokenToMint: &fakeToken{name: "minted"}, |
- tokenToRefresh: &fakeToken{name: "refreshed"}, |
- tokenToUnmarshal: &fakeToken{name: "cached", expired: true}, |
- } |
- auth, ok := NewAuthenticator(Options{}).(*authenticatorImpl) |
- So(ok, ShouldBeTrue) |
- _, err := auth.Transport() |
- So(err, ShouldEqual, ErrLoginRequired) |
- err = auth.Login() |
- So(err, ShouldBeNil) |
- _, err = auth.Transport() |
- So(err, ShouldBeNil) |
- // Minted initial token. |
- So(auth.currentToken(), ShouldEqual, tokenProvider.tokenToMint) |
- // Should return refreshed token. |
- tok, err := auth.refreshToken(auth.currentToken()) |
- So(err, ShouldBeNil) |
- So(tok, ShouldEqual, tokenProvider.tokenToRefresh) |
- }) |
- |
- Convey("Test interactive auth (cache non expired)", func() { |
- tokenProvider = &fakeTokenProvider{ |
- interactive: true, |
- tokenToMint: &fakeToken{name: "minted"}, |
- tokenToRefresh: &fakeToken{name: "refreshed"}, |
- tokenToUnmarshal: &fakeToken{name: "cached", expired: false}, |
- } |
- auth, ok := NewAuthenticator(Options{}).(*authenticatorImpl) |
- So(ok, ShouldBeTrue) |
- _, err := auth.Transport() |
- So(err, ShouldEqual, ErrLoginRequired) |
- err = auth.Login() |
- So(err, ShouldBeNil) |
- _, err = auth.Transport() |
- So(err, ShouldBeNil) |
- // Minted initial token. |
- So(auth.currentToken(), ShouldEqual, tokenProvider.tokenToMint) |
- // Should return token from cache (since it's not expired yet). |
- tok, err := auth.refreshToken(auth.currentToken()) |
- So(err, ShouldBeNil) |
- So(tok, ShouldEqual, tokenProvider.tokenToUnmarshal) |
- }) |
- }) |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-type fakeTokenProvider struct { |
- interactive bool |
- tokenToMint internal.Token |
- tokenToRefresh internal.Token |
- tokenToUnmarshal internal.Token |
-} |
- |
-func (p *fakeTokenProvider) RequiresInteraction() bool { |
- return p.interactive |
-} |
- |
-func (p *fakeTokenProvider) MintToken() (internal.Token, error) { |
- if p.tokenToMint != nil { |
- return p.tokenToMint, nil |
- } |
- return &fakeToken{}, nil |
-} |
- |
-func (p *fakeTokenProvider) RefreshToken(internal.Token) (internal.Token, error) { |
- if p.tokenToRefresh != nil { |
- return p.tokenToRefresh, nil |
- } |
- return &fakeToken{}, nil |
-} |
- |
-func (p *fakeTokenProvider) MarshalToken(internal.Token) ([]byte, error) { |
- return []byte("fake token"), nil |
-} |
- |
-func (p *fakeTokenProvider) UnmarshalToken([]byte) (internal.Token, error) { |
- if p.tokenToUnmarshal != nil { |
- return p.tokenToUnmarshal, nil |
- } |
- return &fakeToken{}, nil |
-} |
- |
-type fakeToken struct { |
- name string |
- expired bool |
-} |
- |
-func (t *fakeToken) Equals(another internal.Token) bool { |
- casted, ok := another.(*fakeToken) |
- return ok && casted == t |
-} |
- |
-func (t *fakeToken) RequestHeaders() map[string]string { return make(map[string]string) } |
-func (t *fakeToken) Expired() bool { return t.expired } |