1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/message_loop/message_loop.h" 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/oauth2_access_token_consumer.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/gaia/oauth2_access_token_fetcher_impl.h" 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service_test_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_status_code.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A testing consumer that retries on error. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RetryingTestingOAuth2TokenServiceConsumer 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public TestingOAuth2TokenServiceConsumer { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RetryingTestingOAuth2TokenServiceConsumer( 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService* oauth2_service, 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& account_id) 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : oauth2_service_(oauth2_service), 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_(account_id) {} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RetryingTestingOAuth2TokenServiceConsumer() {} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE { 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingOAuth2TokenServiceConsumer::OnGetTokenFailure(request, error); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_.reset(oauth2_service_->StartRequest( 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), this).release()); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuth2TokenService* oauth2_service_; 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string account_id_; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request_; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestOAuth2TokenService : public OAuth2TokenService { 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch explicit TestOAuth2TokenService(net::TestURLRequestContextGetter* getter) 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : request_context_getter_(getter) { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CancelAllRequestsForTest() { CancelAllRequests(); } 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void CancelRequestsForAccountForTest(const std::string& account_id) { 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CancelRequestsForAccount(account_id); 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For testing: set the refresh token to be used. 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_refresh_token(const std::string& account_id, 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& refresh_token) { 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (refresh_token.empty()) 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) refresh_tokens_.erase(account_id); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) refresh_tokens_[account_id] = refresh_token; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool RefreshTokenIsAvailable(const std::string& account_id) const 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OVERRIDE { 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<std::string, std::string>::const_iterator it = 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) refresh_tokens_.find(account_id); 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return it != refresh_tokens_.end(); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // OAuth2TokenService implementation. 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE { 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return request_context_getter_.get(); 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher( 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& account_id, 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::URLRequestContextGetter* getter, 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OAuth2AccessTokenConsumer* consumer) OVERRIDE { 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<std::string, std::string>::const_iterator it = 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) refresh_tokens_.find(account_id); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(it != refresh_tokens_.end()); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string refresh_token(it->second); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return new OAuth2AccessTokenFetcherImpl(consumer, getter, refresh_token); 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::map<std::string, std::string> refresh_tokens_; 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class OAuth2TokenServiceTest : public testing::Test { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() OVERRIDE { 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) oauth2_service_.reset( 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new TestOAuth2TokenService(new net::TestURLRequestContextGetter( 99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) message_loop_.message_loop_proxy()))); 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_ = "test_user@gmail.com"; 101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void TearDown() OVERRIDE { 104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Makes sure that all the clean up tasks are run. 105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::MessageLoopForIO message_loop_; // net:: stuff needs IO message loop. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcherFactory factory_; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestOAuth2TokenService> oauth2_service_; 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string account_id_; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingOAuth2TokenServiceConsumer consumer_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, NoOAuth2RefreshToken) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, OAuth2TokenService::ScopeSet(), 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 120a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_errors_); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, FailureShouldNotRetry) { 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 132a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_UNAUTHORIZED); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString(std::string()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_errors_); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(fetcher, factory_.GetFetcherByID(0)); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, SuccessWithoutCaching) { 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 152a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, SuccessWithCaching) { 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes1; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes1.insert("s1"); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes1.insert("s2"); 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes1_same; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes1_same.insert("s2"); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes1_same.insert("s1"); 17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes2; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes2.insert("s3"); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First request. 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes1, &consumer_)); 181a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second request to the same set of scopes, should return the same token 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // without needing a network request. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes1_same, &consumer_)); 198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No new network fetcher. 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Third request to a new set of scopes, should return another token. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request3( 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes2, &consumer_)); 208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = factory_.GetFetcherByID(0); 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token2", 3600)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, consumer_.number_of_successful_tokens_); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token2", consumer_.last_token_); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndFailure) { 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First request. 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 0)); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second request must try to access the network as the token has expired. 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Network failure. 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = factory_.GetFetcherByID(0); 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_UNAUTHORIZED); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString(std::string()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_errors_); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, SuccessAndExpirationAndSuccess) { 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First request. 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 268a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 0)); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second request must try to access the network as the token has expired. 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 285a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = factory_.GetFetcherByID(0); 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("another token", 0)); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("another token", consumer_.last_token_); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, RequestDeletedBeforeCompletion) { 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 306a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request.reset(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, RequestDeletedAfterCompletion) { 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), &consumer_)); 326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request.reset(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, MultipleRequestsForTheSameScopesWithOneDeleted) { 34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), &consumer_)); 348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, OAuth2TokenService::ScopeSet(), 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 352a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request.reset(); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, ClearedRefreshTokenFailsSubsequentRequests) { 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We have a valid refresh token; the first request is successful. 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), &consumer_)); 370a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The refresh token is no longer available; subsequent requests fail. 38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, ""); 38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request = oauth2_service_->StartRequest(account_id_, 38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet(), &consumer_); 384a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_errors_); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChangedRefreshTokenDoesNotAffectInFlightRequests) { 39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "first refreshToken"); 39268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes.insert("s1"); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scopes.insert("s2"); 39568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes1; 39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scopes.insert("s3"); 39768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scopes.insert("s4"); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 40068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, scopes, &consumer_)); 401a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher1 = factory_.GetFetcherByID(0); 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher1); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note |request| is still pending when the refresh token changes. 40668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "second refreshToken"); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A 2nd request (using the new refresh token) that occurs and completes 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // while the 1st request is in flight is successful. 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingOAuth2TokenServiceConsumer consumer2; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 41268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes1, &consumer2)); 413a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher2 = factory_.GetFetcherByID(0); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher2->set_response_code(net::HTTP_OK); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher2->SetResponseString(GetValidTokenResponse("second token", 3600)); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher2->delegate()->OnURLFetchComplete(fetcher2); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer2.number_of_successful_tokens_); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer2.number_of_errors_); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("second token", consumer2.last_token_); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher1->set_response_code(net::HTTP_OK); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher1->SetResponseString(GetValidTokenResponse("first token", 3600)); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher1->delegate()->OnURLFetchComplete(fetcher1); 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("first token", consumer_.last_token_); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, ServiceShutDownBeforeFetchComplete) { 43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), &consumer_)); 435a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The destructor should cancel all in-flight fetchers. 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_service_.reset(NULL); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_errors_); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, RetryingConsumer) { 44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RetryingTestingOAuth2TokenServiceConsumer consumer(oauth2_service_.get(), 44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request(oauth2_service_->StartRequest( 45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, OAuth2TokenService::ScopeSet(), &consumer)); 452a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer.number_of_successful_tokens_); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, consumer.number_of_errors_); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(fetcher); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_UNAUTHORIZED); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString(std::string()); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer.number_of_successful_tokens_); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, consumer.number_of_errors_); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = factory_.GetFetcherByID(0); 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(fetcher); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(net::HTTP_UNAUTHORIZED); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString(std::string()); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer.number_of_successful_tokens_); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, consumer.number_of_errors_); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(OAuth2TokenServiceTest, InvalidateToken) { 47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes; 47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // First request. 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes, &consumer_)); 480a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token", 3600)); 488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Second request, should return the same token without needing a network 494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // request. 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes, &consumer_)); 497a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // No new network fetcher. 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Invalidating the token should return a new token on the next request. 50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->InvalidateToken(account_id_, scopes, consumer_.last_token_); 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request3( 50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scopes, &consumer_)); 508a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher = factory_.GetFetcherByID(0); 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->set_response_code(net::HTTP_OK); 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->SetResponseString(GetValidTokenResponse("token2", 3600)); 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(3, consumer_.number_of_successful_tokens_); 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("token2", consumer_.last_token_); 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(OAuth2TokenServiceTest, CancelAllRequests) { 52268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 52468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, OAuth2TokenService::ScopeSet(), 52568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token("account_id_2", "refreshToken2"); 528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 52968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, OAuth2TokenService::ScopeSet(), 53068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &consumer_)); 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) oauth2_service_->CancelAllRequestsForTest(); 537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_errors_); 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 54268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(OAuth2TokenServiceTest, CancelRequestsForAccount) { 54368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scope_set_1; 544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scope_set_1.insert("scope1"); 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scope_set_1.insert("scope2"); 54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::ScopeSet scope_set_2(scope_set_1.begin(), 54768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scope_set_1.end()); 548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scope_set_2.insert("scope3"); 549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, "refreshToken"); 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request1( 55268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scope_set_1, &consumer_)); 553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 55468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_, scope_set_2, &consumer_)); 555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string account_id_2("account_id_2"); 55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_2, "refreshToken2"); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request3( 55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequest(account_id_2, scope_set_1, &consumer_)); 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 56568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->CancelRequestsForAccountForTest(account_id_); 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_errors_); 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 57068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->CancelRequestsForAccountForTest(account_id_2); 571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_successful_tokens_); 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, consumer_.number_of_errors_); 574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(OAuth2TokenServiceTest, SameScopesRequestedForDifferentClients) { 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string client_id_1("client1"); 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string client_secret_1("secret1"); 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string client_id_2("client2"); 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string client_secret_2("secret2"); 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::set<std::string> scope_set; 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set.insert("scope1"); 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set.insert("scope2"); 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string refresh_token("refreshToken"); 58668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->set_refresh_token(account_id_, refresh_token); 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request1( 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequestForClient(account_id_, 59068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) client_id_1, 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) client_secret_1, 59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set, 59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &consumer_)); 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request2( 59568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequestForClient(account_id_, 59668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) client_id_2, 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) client_secret_2, 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set, 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &consumer_)); 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a request that should be duplicate of |request1|. 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request3( 60268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_service_->StartRequestForClient(account_id_, 60368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) client_id_1, 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) client_secret_1, 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set, 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &consumer_)); 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(2U, 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) oauth2_service_->GetNumPendingRequestsForTesting( 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) client_id_1, 61268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set)); 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1U, 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) oauth2_service_->GetNumPendingRequestsForTesting( 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) client_id_2, 61768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) account_id_, 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scope_set)); 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(OAuth2TokenServiceTest, RequestParametersOrderTest) { 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OAuth2TokenService::ScopeSet set_0; 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OAuth2TokenService::ScopeSet set_1; 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) set_1.insert("1"); 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters params[] = { 62768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("0", "0", set_0), 62868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("0", "0", set_1), 62968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("0", "1", set_0), 63068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("0", "1", set_1), 63168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("1", "0", set_0), 63268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("1", "0", set_1), 63368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("1", "1", set_0), 63468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2TokenService::RequestParameters("1", "1", set_1), 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(params); i++) { 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t j = 0; j < arraysize(params); j++) { 63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (i == j) { 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(params[i] < params[j]) << " i=" << i << ", j=" << j; 64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(params[j] < params[i]) << " i=" << i << ", j=" << j; 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else if (i < j) { 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(params[i] < params[j]) << " i=" << i << ", j=" << j; 64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(params[j] < params[i]) << " i=" << i << ", j=" << j; 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(params[j] < params[i]) << " i=" << i << ", j=" << j; 64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(params[i] < params[j]) << " i=" << i << ", j=" << j; 64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 652