14ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/mutable_profile_oauth2_token_service.h" 64ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 74ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "base/run_loop.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_error_controller.h" 104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "components/signin/core/browser/test_signin_client.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_web_data.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service_test_util.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_status_code.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/os_crypt.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Defining constant here to handle backward compatiblity tests, but this 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// constant is no longer used in current versions of chrome. 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static const char kLSOService[] = "lso"; 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static const char kEmail[] = "user@gmail.com"; 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochclass MutableProfileOAuth2TokenServiceTest 294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch : public testing::Test, 304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch public OAuth2TokenService::Observer { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MutableProfileOAuth2TokenServiceTest() 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : factory_(NULL), 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) token_available_count_(0), 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch token_revoked_count_(0), 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tokens_loaded_count_(0), 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start_batch_changes_(0), 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch end_batch_changes_(0) {} 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OSCrypt::UseMockKeychain(true); 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_revoke_url(), 464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch "", 474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::HTTP_OK, 484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::URLRequestStatus::SUCCESS); 494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.Initialize(&client_); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure PO2TS has a chance to load itself before continuing. 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.AddObserver(this); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDown() OVERRIDE { 564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RemoveObserver(this); 574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.Shutdown(); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void AddAuthTokenManually(const std::string& service, 614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch const std::string& value) { 624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch scoped_refptr<TokenWebData> token_web_data = client_.GetDatabase(); 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (token_web_data.get()) 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) token_web_data->SetTokenForService(service, value); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // OAuth2TokenService::Observer implementation. 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE { 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++token_available_count_; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE { 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++token_revoked_count_; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch virtual void OnRefreshTokensLoaded() OVERRIDE { ++tokens_loaded_count_; } 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnStartBatchChanges() OVERRIDE { 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++start_batch_changes_; 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnEndBatchChanges() OVERRIDE { 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++end_batch_changes_; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ResetObserverCounts() { 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch token_available_count_ = 0; 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch token_revoked_count_ = 0; 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tokens_loaded_count_ = 0; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start_batch_changes_ = 0; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch end_batch_changes_ = 0; 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ExpectNoNotifications() { 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_available_count_); 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_revoked_count_); 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, tokens_loaded_count_); 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResetObserverCounts(); 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ExpectOneTokenAvailableNotification() { 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1, token_available_count_); 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_revoked_count_); 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, tokens_loaded_count_); 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResetObserverCounts(); 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ExpectOneTokenRevokedNotification() { 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_available_count_); 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1, token_revoked_count_); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, tokens_loaded_count_); 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResetObserverCounts(); 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ExpectOneTokensLoadedNotification() { 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_available_count_); 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, token_revoked_count_); 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1, tokens_loaded_count_); 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResetObserverCounts(); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::MessageLoop message_loop_; 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::FakeURLFetcherFactory factory_; 1234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch TestSigninClient client_; 1244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch MutableProfileOAuth2TokenService oauth2_service_; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingOAuth2TokenServiceConsumer consumer_; 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int token_available_count_; 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int token_revoked_count_; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int tokens_loaded_count_; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int start_batch_changes_; 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int end_batch_changes_; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceDBUpgrade) { 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string main_account_id(kEmail); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string main_refresh_token("old_refresh_token"); 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Populate DB with legacy tokens. 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddAuthTokenManually(GaiaConstants::kSyncService, "syncServiceToken"); 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddAuthTokenManually(kLSOService, "lsoToken"); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddAuthTokenManually(GaiaConstants::kGaiaOAuth2LoginRefreshToken, 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) main_refresh_token); 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Force LoadCredentials. 1444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.LoadCredentials(main_account_id); 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Legacy tokens get discarded, but the old refresh token is kept. 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, tokens_loaded_count_); 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, token_available_count_); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 1524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(main_account_id)); 1534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(1U, oauth2_service_.refresh_tokens().size()); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(main_refresh_token, 1554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.refresh_tokens()[main_account_id]->refresh_token()); 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add an old legacy token to the DB, to ensure it will not overwrite existing 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // credentials for main account. 1594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch AddAuthTokenManually(GaiaConstants::kGaiaOAuth2LoginRefreshToken, 1604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch "secondOldRefreshToken"); 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add some other legacy token. (Expected to get discarded). 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddAuthTokenManually(kLSOService, "lsoToken"); 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Also add a token using PO2TS.UpdateCredentials and make sure upgrade does 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // not wipe it. 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string other_account_id("other_account_id"); 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string other_refresh_token("other_refresh_token"); 1674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(other_account_id, other_refresh_token); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Force LoadCredentials. 1714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.LoadCredentials(main_account_id); 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Again legacy tokens get discarded, but since the main porfile account 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // token is present it is not overwritten. 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, token_available_count_); 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, tokens_loaded_count_); 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 1804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(main_account_id)); 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // TODO(fgorski): cover both using RefreshTokenIsAvailable() and then get the 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // tokens using GetRefreshToken() 1834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(2U, oauth2_service_.refresh_tokens().size()); 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(main_refresh_token, 1854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.refresh_tokens()[main_account_id]->refresh_token()); 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ( 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) other_refresh_token, 1884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.refresh_tokens()[other_account_id]->refresh_token()); 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeAllCredentials(); 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, start_batch_changes_); 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, end_batch_changes_); 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceRevokeCredentials) { 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string account_id_1 = "account_id_1"; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string refresh_token_1 = "refresh_token_1"; 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string account_id_2 = "account_id_2"; 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string refresh_token_2 = "refresh_token_2"; 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(fgorski): Enable below when implemented: 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1)); 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_2)); 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(account_id_1, refresh_token_1); 2064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(account_id_2, refresh_token_2); 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, start_batch_changes_); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, end_batch_changes_); 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(fgorski): Enable below when implemented: 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // EXPECT_TRUE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1)); 2124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(account_id_2)); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 2154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeCredentials(account_id_1); 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokenRevokedNotification(); 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(fgorski): Enable below when implemented: 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1)); 2224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(account_id_2)); 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeAllCredentials(); 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, token_available_count_); 226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, token_revoked_count_); 227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, tokens_loaded_count_); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceLoadCredentials) { 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Ensure DB is clean. 2354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeAllCredentials(); 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetObserverCounts(); 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Perform a load from an empty DB. 2384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.LoadCredentials("account_id"); 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokensLoadedNotification(); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // LoadCredentials() guarantees that the account given to it as argument 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is in the refresh_token map. 2454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(1U, oauth2_service_.refresh_tokens().size()); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 2474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.refresh_tokens()["account_id"]->refresh_token().empty()); 248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Setup a DB with tokens that don't require upgrade and clear memory. 2494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id", "refresh_token"); 2504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id2", "refresh_token2"); 2514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.refresh_tokens().clear(); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, start_batch_changes_); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, end_batch_changes_); 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.LoadCredentials("account_id"); 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, token_available_count_); 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, token_revoked_count_); 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, tokens_loaded_count_); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(fgorski): Enable below when implemented: 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // EXPECT_TRUE(oauth2_servive_->RefreshTokenIsAvailable("account_id")); 2674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id2")); 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeAllCredentials(); 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, token_available_count_); 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, token_revoked_count_); 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, tokens_loaded_count_); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, start_batch_changes_); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, end_batch_changes_); 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistanceNotifications) { 2794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(0, oauth2_service_.cache_size_for_testing()); 2804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id", "refresh_token"); 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokenAvailableNotification(); 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id", "refresh_token"); 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectNoNotifications(); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id", "refresh_token2"); 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokenAvailableNotification(); 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeCredentials("account_id"); 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokenRevokedNotification(); 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id", "refresh_token2"); 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExpectOneTokenAvailableNotification(); 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeAllCredentials(); 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResetObserverCounts(); 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, GetAccounts) { 3004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_TRUE(oauth2_service_.GetAccounts().empty()); 3014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id1", "refresh_token1"); 3024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials("account_id2", "refresh_token2"); 3034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch std::vector<std::string> accounts = oauth2_service_.GetAccounts(); 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(2u, accounts.size()); 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id1")); 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id2")); 3074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeCredentials("account_id2"); 3084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch accounts = oauth2_service_.GetAccounts(); 3094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(1u, oauth2_service_.GetAccounts().size()); 31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id1")); 31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, TokenServiceUpdateClearsCache) { 3144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(0, oauth2_service_.cache_size_for_testing()); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> scope_list; 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_list.insert("scope"); 3174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(kEmail, "refreshToken"); 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExpectOneTokenAvailableNotification(); 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(), 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetValidTokenResponse("token", 3600), 3214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::HTTP_OK, 3224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::URLRequestStatus::SUCCESS); 32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 3254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.StartRequest(kEmail, scope_list, &consumer_)); 326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, consumer_.number_of_successful_tokens_); 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("token", consumer_.last_token_); 3304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(1, oauth2_service_.cache_size_for_testing()); 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Signs out and signs in 3334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.RevokeCredentials(kEmail); 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ExpectOneTokenRevokedNotification(); 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(0, oauth2_service_.cache_size_for_testing()); 3374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(kEmail, "refreshToken"); 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExpectOneTokenAvailableNotification(); 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(), 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetValidTokenResponse("another token", 3600), 3414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::HTTP_OK, 3424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::URLRequestStatus::SUCCESS); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch request = oauth2_service_.StartRequest(kEmail, scope_list, &consumer_); 345a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2, consumer_.number_of_successful_tokens_); 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, consumer_.number_of_errors_); 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("another token", consumer_.last_token_); 3494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(1, oauth2_service_.cache_size_for_testing()); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, FetchTransientError) { 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(), 3544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch "", 3554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch net::HTTP_FORBIDDEN, 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::FAILED); 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(0, oauth2_service_.cache_size_for_testing()); 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::set<std::string> scope_list; 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scope_list.insert("scope"); 3614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.set_max_authorization_token_fetch_retries_for_testing(0); 3624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.UpdateCredentials(kEmail, "refreshToken"); 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExpectOneTokenAvailableNotification(); 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 3664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.StartRequest(kEmail, scope_list, &consumer_)); 367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), 3694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch oauth2_service_.signin_error_controller()->auth_error()); 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 371