Chromium Code Reviews| Index: chrome/browser/signin/oauth2_token_service_unittest.cc |
| diff --git a/chrome/browser/signin/oauth2_token_service_unittest.cc b/chrome/browser/signin/oauth2_token_service_unittest.cc |
| index 3649374b62fb6d4b5c5ef73c9da38d2c0a18568c..59f8bea66f0fae7e1e095a4f118ebe0e47be64b5 100644 |
| --- a/chrome/browser/signin/oauth2_token_service_unittest.cc |
| +++ b/chrome/browser/signin/oauth2_token_service_unittest.cc |
| @@ -2,62 +2,26 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <string> |
| + |
| #include "base/stringprintf.h" |
| #include "chrome/browser/signin/oauth2_token_service.h" |
| -#include "chrome/browser/signin/oauth2_token_service_factory.h" |
| +#include "chrome/browser/signin/oauth2_token_service_test_util.h" |
| #include "chrome/browser/signin/token_service_factory.h" |
| #include "chrome/browser/signin/token_service_unittest.h" |
| #include "chrome/common/chrome_notification_types.h" |
| -#include "content/public/browser/browser_thread.h" |
| +#include "chrome/test/base/testing_browser_process.h" |
| #include "google_apis/gaia/gaia_constants.h" |
| #include "google_apis/gaia/google_service_auth_error.h" |
| #include "google_apis/gaia/oauth2_access_token_consumer.h" |
| #include "net/http/http_status_code.h" |
| #include "net/url_request/test_url_fetcher_factory.h" |
| #include "net/url_request/url_request_status.h" |
| +#include "net/url_request/url_request_test_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| using content::BrowserThread; |
| -static const char kValidTokenResponse[] = |
| - "{" |
| - " \"access_token\": \"%s\"," |
| - " \"expires_in\": %d," |
| - " \"token_type\": \"Bearer\"" |
| - "}"; |
| - |
| -std::string GetValidTokenResponse(std::string token, int expiration) { |
| - return base::StringPrintf(kValidTokenResponse, token.c_str(), expiration); |
| -} |
| - |
| -// A simple testing consumer. |
| -class TestingOAuth2TokenServiceConsumer : public OAuth2TokenService::Consumer { |
| - public: |
| - TestingOAuth2TokenServiceConsumer() |
| - : number_of_correct_tokens_(0), |
| - last_error_(GoogleServiceAuthError::AuthErrorNone()), |
| - number_of_errors_(0) {} |
| - virtual ~TestingOAuth2TokenServiceConsumer() {} |
| - |
| - virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, |
| - const std::string& token, |
| - const base::Time& expiration_date) OVERRIDE { |
| - last_token_ = token; |
| - ++number_of_correct_tokens_; |
| - } |
| - |
| - virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, |
| - const GoogleServiceAuthError& error) OVERRIDE { |
| - last_error_ = error; |
| - ++number_of_errors_; |
| - } |
| - |
| - std::string last_token_; |
| - int number_of_correct_tokens_; |
| - GoogleServiceAuthError last_error_; |
| - int number_of_errors_; |
| -}; |
| - |
| // A testing consumer that retries on error. |
| class RetryingTestingOAuth2TokenServiceConsumer |
| : public OAuth2TokenService::Consumer { |
| @@ -93,17 +57,35 @@ class RetryingTestingOAuth2TokenServiceConsumer |
| int number_of_errors_; |
| }; |
| +class TestOAuth2TokenService : public OAuth2TokenService { |
| + public: |
| + explicit TestOAuth2TokenService(net::URLRequestContextGetter* getter) |
| + : OAuth2TokenService(getter) { |
| + } |
| + // For testing: set the refresh token to be used. |
| + void refresh_token(const std::string& refresh_token) { |
|
Andrew T Wilson (Slow)
2013/03/19 19:58:44
call setters something like "set_refresh_token()".
David Roche
2013/03/21 00:12:02
Done.
|
| + refresh_token_ = refresh_token; |
| + } |
| + protected: |
| + std::string GetRefreshToken() { |
| + return refresh_token_; |
| + } |
| + private: |
| + std::string refresh_token_; |
| +}; |
| + |
| class OAuth2TokenServiceTest : public TokenServiceTestHarness { |
| public: |
| - OAuth2TokenServiceTest() {} |
| + OAuth2TokenServiceTest() { |
|
Andrew T Wilson (Slow)
2013/03/19 19:58:44
This is fine, but consider not editing this line i
David Roche
2013/03/21 00:12:02
Done.
|
| + } |
| virtual void SetUp() OVERRIDE { |
| TokenServiceTestHarness::SetUp(); |
| io_thread_.reset(new content::TestBrowserThread(content::BrowserThread::IO, |
| &message_loop_)); |
| - service_->UpdateCredentials(credentials_); |
| - profile_->CreateRequestContext(); |
| - oauth2_service_ = OAuth2TokenServiceFactory::GetForProfile(profile_.get()); |
| + oauth2_service_.reset(new TestOAuth2TokenService( |
| + new net::TestURLRequestContextGetter( |
|
Andrew T Wilson (Slow)
2013/03/19 19:58:44
Does this leak the TestURLRequestContextGetter() w
David Roche
2013/03/21 00:12:02
Done.
|
| + message_loop_.message_loop_proxy()))); |
| } |
| virtual void TearDown() OVERRIDE { |
| @@ -113,7 +95,7 @@ class OAuth2TokenServiceTest : public TokenServiceTestHarness { |
| protected: |
| scoped_ptr<content::TestBrowserThread> io_thread_; |
| net::TestURLFetcherFactory factory_; |
| - OAuth2TokenService* oauth2_service_; |
| + scoped_ptr<TestOAuth2TokenService> oauth2_service_; |
| TestingOAuth2TokenServiceConsumer consumer_; |
| }; |
| @@ -127,10 +109,9 @@ TEST_F(OAuth2TokenServiceTest, NoOAuth2RefreshToken) { |
| } |
| TEST_F(OAuth2TokenServiceTest, FailureShouldNotRetry) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| - std::set<std::string>(), &consumer_)); |
| + oauth2_service_->refresh_token("refreshToken"); |
| + scoped_ptr<OAuth2TokenService::Request> request( |
| + oauth2_service_->StartRequest(std::set<std::string>(), &consumer_)); |
| message_loop_.RunUntilIdle(); |
| EXPECT_EQ(0, consumer_.number_of_correct_tokens_); |
| @@ -146,10 +127,9 @@ TEST_F(OAuth2TokenServiceTest, FailureShouldNotRetry) { |
| } |
| TEST_F(OAuth2TokenServiceTest, SuccessWithoutCaching) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| - std::set<std::string>(), &consumer_)); |
| + oauth2_service_->refresh_token("refreshToken"); |
| + scoped_ptr<OAuth2TokenService::Request> request( |
| + oauth2_service_->StartRequest(std::set<std::string>(), &consumer_)); |
| message_loop_.RunUntilIdle(); |
| EXPECT_EQ(0, consumer_.number_of_correct_tokens_); |
| @@ -174,8 +154,7 @@ TEST_F(OAuth2TokenServiceTest, SuccessWithCaching) { |
| std::set<std::string> scopes2; |
| scopes2.insert("s3"); |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| // First request. |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| @@ -222,8 +201,7 @@ TEST_F(OAuth2TokenServiceTest, SuccessWithCaching) { |
| } |
| TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndFailure) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| // First request. |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| @@ -258,8 +236,7 @@ TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndFailure) { |
| } |
| TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndSuccess) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| // First request. |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| @@ -294,8 +271,7 @@ TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndSuccess) { |
| } |
| TEST_F(OAuth2TokenServiceTest, RequestDeletedBeforeCompletion) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer_)); |
| @@ -315,8 +291,7 @@ TEST_F(OAuth2TokenServiceTest, RequestDeletedBeforeCompletion) { |
| } |
| TEST_F(OAuth2TokenServiceTest, RequestDeletedAfterCompletion) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer_)); |
| @@ -337,8 +312,7 @@ TEST_F(OAuth2TokenServiceTest, RequestDeletedAfterCompletion) { |
| } |
| TEST_F(OAuth2TokenServiceTest, MultipleRequestsForTheSameScopesWithOneDeleted) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer_)); |
| @@ -357,10 +331,9 @@ TEST_F(OAuth2TokenServiceTest, MultipleRequestsForTheSameScopesWithOneDeleted) { |
| EXPECT_EQ(0, consumer_.number_of_errors_); |
| } |
| -TEST_F(OAuth2TokenServiceTest, SuccessAndSignOutAndRequest) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - |
| +TEST_F(OAuth2TokenServiceTest, ClearedRefreshTokenFailsSubsequentRequests) { |
| + // We have a valid refresh token; the first request is successful. |
| + oauth2_service_->refresh_token("refreshToken"); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer_)); |
| message_loop_.RunUntilIdle(); |
| @@ -372,11 +345,8 @@ TEST_F(OAuth2TokenServiceTest, SuccessAndSignOutAndRequest) { |
| EXPECT_EQ(0, consumer_.number_of_errors_); |
| EXPECT_EQ("token", consumer_.last_token_); |
| - // Signs out |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - ""); |
| - service_->EraseTokensFromDB(); |
| - |
| + // The refresh token is no longer available; subsequent requests fail. |
| + oauth2_service_->refresh_token(""); |
| request = oauth2_service_->StartRequest(std::set<std::string>(), &consumer_); |
| message_loop_.RunUntilIdle(); |
| EXPECT_EQ(fetcher, factory_.GetFetcherByID(0)); |
| @@ -384,45 +354,9 @@ TEST_F(OAuth2TokenServiceTest, SuccessAndSignOutAndRequest) { |
| EXPECT_EQ(1, consumer_.number_of_errors_); |
| } |
| -TEST_F(OAuth2TokenServiceTest, SuccessAndSignOutAndSignInAndSuccess) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - std::set<std::string> scopes; |
| - scopes.insert("s1"); |
| - scopes.insert("s2"); |
| - |
| - scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| - scopes, &consumer_)); |
| - message_loop_.RunUntilIdle(); |
| - net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
| - fetcher->set_response_code(net::HTTP_OK); |
| - fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); |
| - fetcher->delegate()->OnURLFetchComplete(fetcher); |
| - EXPECT_EQ(1, consumer_.number_of_correct_tokens_); |
| - EXPECT_EQ(0, consumer_.number_of_errors_); |
| - EXPECT_EQ("token", consumer_.last_token_); |
| - |
| - // Signs out and signs in |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - ""); |
| - service_->EraseTokensFromDB(); |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - |
| - request = oauth2_service_->StartRequest(scopes, &consumer_); |
| - message_loop_.RunUntilIdle(); |
| - fetcher = factory_.GetFetcherByID(0); |
| - fetcher->set_response_code(net::HTTP_OK); |
| - fetcher->SetResponseString(GetValidTokenResponse("another token", 3600)); |
| - fetcher->delegate()->OnURLFetchComplete(fetcher); |
| - EXPECT_EQ(2, consumer_.number_of_correct_tokens_); |
| - EXPECT_EQ(0, consumer_.number_of_errors_); |
| - EXPECT_EQ("another token", consumer_.last_token_); |
| -} |
| - |
| -TEST_F(OAuth2TokenServiceTest, PendingAndSignOutAndSignInAndSuccess) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "first refreshToken"); |
| +TEST_F(OAuth2TokenServiceTest, |
| + ChangedRefreshTokenDoesNotAffectInFlightRequests) { |
| + oauth2_service_->refresh_token("first refreshToken"); |
| std::set<std::string> scopes; |
| scopes.insert("s1"); |
| scopes.insert("s2"); |
| @@ -432,11 +366,11 @@ TEST_F(OAuth2TokenServiceTest, PendingAndSignOutAndSignInAndSuccess) { |
| message_loop_.RunUntilIdle(); |
| net::TestURLFetcher* fetcher1 = factory_.GetFetcherByID(0); |
| - // Note |request| is still pending. |
| - service_->EraseTokensFromDB(); |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "second refreshToken"); |
| + // Note |request| is still pending when the refresh token changes. |
| + oauth2_service_->refresh_token("second refreshToken"); |
| + // A 2nd request (using the new refresh token) that occurs and completes |
| + // while the 1st request is in flight is successful. |
| TestingOAuth2TokenServiceConsumer consumer2; |
| scoped_ptr<OAuth2TokenService::Request> request2( |
| oauth2_service_->StartRequest(scopes, &consumer2)); |
| @@ -459,24 +393,23 @@ TEST_F(OAuth2TokenServiceTest, PendingAndSignOutAndSignInAndSuccess) { |
| } |
| TEST_F(OAuth2TokenServiceTest, ServiceShutDownBeforeFetchComplete) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| + oauth2_service_->refresh_token("refreshToken"); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer_)); |
| message_loop_.RunUntilIdle(); |
| EXPECT_EQ(0, consumer_.number_of_correct_tokens_); |
| EXPECT_EQ(0, consumer_.number_of_errors_); |
| - profile_.reset(); |
| + // The destructor should cancel all in-flight fetchers. |
| + oauth2_service_.reset(NULL); |
| EXPECT_EQ(0, consumer_.number_of_correct_tokens_); |
| EXPECT_EQ(1, consumer_.number_of_errors_); |
| } |
| TEST_F(OAuth2TokenServiceTest, RetryingConsumer) { |
| - service_->IssueAuthTokenForTest(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| - "refreshToken"); |
| - RetryingTestingOAuth2TokenServiceConsumer consumer(oauth2_service_); |
| + oauth2_service_->refresh_token("refreshToken"); |
| + RetryingTestingOAuth2TokenServiceConsumer consumer(oauth2_service_.get()); |
| scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( |
| std::set<std::string>(), &consumer)); |
| message_loop_.RunUntilIdle(); |