summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian White <bcwhite@chromium.org>2015-10-07 14:44:16 -0400
committerBrian White <bcwhite@chromium.org>2015-10-07 18:45:24 +0000
commit6993a02b0f64a22708c9227fd44beea0bf5c7e77 (patch)
tree152ecbf75a0c699caedc7305ba76f5093f60c9fe
parent1236c617911ba27938f244006fc0b96bf3e65cf0 (diff)
downloadchromium_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}
-rw-r--r--chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc9
-rw-r--r--chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h8
-rw-r--r--chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc40
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";