diff options
author | Brian White <bcwhite@chromium.org> | 2015-10-07 14:44:16 -0400 |
---|---|---|
committer | Brian White <bcwhite@chromium.org> | 2015-10-07 18:45:24 +0000 |
commit | 6993a02b0f64a22708c9227fd44beea0bf5c7e77 (patch) | |
tree | 152ecbf75a0c699caedc7305ba76f5093f60c9fe | |
parent | 1236c617911ba27938f244006fc0b96bf3e65cf0 (diff) | |
download | chromium_src-6993a02b0f64a22708c9227fd44beea0bf5c7e77.zip chromium_src-6993a02b0f64a22708c9227fd44beea0bf5c7e77.tar.gz chromium_src-6993a02b0f64a22708c9227fd44beea0bf5c7e77.tar.bz2 |
Reset OAuth backoff when network changes.
BUG=526854
TBR=tinazh@chromium.org
Review URL: https://codereview.chromium.org/1364333004
Cr-Commit-Position: refs/heads/master@{#351772}
(cherry picked from commit 84dbeca8a21ba824d2d6b57d67bbee0787c4e520)
Review URL: https://codereview.chromium.org/1395643002 .
Cr-Commit-Position: refs/branch-heads/2490@{#512}
Cr-Branched-From: 7790a3535f2a81a03685eca31a32cf69ae0c114f-refs/heads/master@{#344925}
3 files changed, 56 insertions, 1 deletions
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc index 093c662..8f973e0 100644 --- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc +++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc @@ -141,12 +141,14 @@ MutableProfileOAuth2TokenServiceDelegate:: backoff_policy_.maximum_backoff_ms = 15 * 60 * 1000; backoff_policy_.entry_lifetime_ms = -1; backoff_policy_.always_use_initial_delay = false; + net::NetworkChangeNotifier::AddNetworkChangeObserver(this); } MutableProfileOAuth2TokenServiceDelegate:: ~MutableProfileOAuth2TokenServiceDelegate() { VLOG(1) << "MutablePO2TS::~MutablePO2TS"; DCHECK(server_revokes_.empty()); + net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); } OAuth2AccessTokenFetcher* @@ -500,3 +502,10 @@ void MutableProfileOAuth2TokenServiceDelegate::Shutdown() { CancelWebTokenFetch(); refresh_tokens_.clear(); } + +void MutableProfileOAuth2TokenServiceDelegate::OnNetworkChanged( + net::NetworkChangeNotifier::ConnectionType type) { + // If our network has changed, reset the backoff timer so that errors caused + // by a previous lack of network connectivity don't prevent new requests. + backoff_entry_.Reset(); +} diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h index c89e6c4..9eb94f0 100644 --- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h +++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h @@ -13,10 +13,12 @@ #include "components/webdata/common/web_data_service_base.h" #include "components/webdata/common/web_data_service_consumer.h" #include "net/base/backoff_entry.h" +#include "net/base/network_change_notifier.h" class MutableProfileOAuth2TokenServiceDelegate : public OAuth2TokenServiceDelegate, - public WebDataServiceConsumer { + public WebDataServiceConsumer, + public net::NetworkChangeNotifier::NetworkChangeObserver { public: MutableProfileOAuth2TokenServiceDelegate( SigninClient* client, @@ -51,6 +53,10 @@ class MutableProfileOAuth2TokenServiceDelegate // Overridden from OAuth2TokenServiceDelegate. void Shutdown() override; + // Overridden from NetworkChangeObserver. + void OnNetworkChanged(net::NetworkChangeNotifier::ConnectionType type) + override; + private: friend class MutableProfileOAuth2TokenServiceDelegateTest; diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc index e6c64ca..c918da8 100644 --- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc +++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc @@ -420,6 +420,46 @@ TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, RetryBackoff) { EXPECT_EQ(1, access_token_failure_count_); } +TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, ResetBackoff) { + oauth2_service_delegate_->UpdateCredentials(kEmail, "refreshToken"); + EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), + signin_error_controller_.auth_error()); + + GoogleServiceAuthError authfail(GoogleServiceAuthError::SERVICE_UNAVAILABLE); + oauth2_service_delegate_->UpdateAuthError(kEmail, authfail); + EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), + signin_error_controller_.auth_error()); + + // Create a "success" fetch we don't expect to get called just yet. + factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(), + GetValidTokenResponse("token", 3600), net::HTTP_OK, + net::URLRequestStatus::SUCCESS); + + // Transient error will repeat until backoff period expires. + EXPECT_EQ(0, access_token_success_count_); + EXPECT_EQ(0, access_token_failure_count_); + std::vector<std::string> scope_list; + scope_list.push_back("scope"); + scoped_ptr<OAuth2AccessTokenFetcher> fetcher1( + oauth2_service_delegate_->CreateAccessTokenFetcher( + kEmail, oauth2_service_delegate_->GetRequestContext(), this)); + fetcher1->Start("foo", "bar", scope_list); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(0, access_token_success_count_); + EXPECT_EQ(1, access_token_failure_count_); + + // Notify of network change and ensure that request now runs. + oauth2_service_delegate_->OnNetworkChanged( + net::NetworkChangeNotifier::CONNECTION_WIFI); + scoped_ptr<OAuth2AccessTokenFetcher> fetcher2( + oauth2_service_delegate_->CreateAccessTokenFetcher( + kEmail, oauth2_service_delegate_->GetRequestContext(), this)); + fetcher2->Start("foo", "bar", scope_list); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, access_token_success_count_); + EXPECT_EQ(1, access_token_failure_count_); +} + TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, CanonicalizeAccountId) { std::map<std::string, std::string> tokens; tokens["AccountId-user@gmail.com"] = "refresh_token"; |