account_reconcilor_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file. 48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h" 88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/account_reconcilor.h" 98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/account_reconcilor_factory.h" 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service_wrapper.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h" 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace { 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTestEmail[] = "user@gmail.com"; 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockAccountReconcilor : public testing::StrictMock<AccountReconcilor> { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static BrowserContextKeyedService* Build(content::BrowserContext* profile); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit MockAccountReconcilor(Profile* profile); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MockAccountReconcilor() {} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(PerformMergeAction, void(const std::string& account_id)); 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(StartRemoveAction, void(const std::string& account_id)); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD3(FinishRemoveAction, 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void(const std::string& account_id, 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<std::string>& accounts)); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD2(PerformAddToChromeAction, void(const std::string& account_id, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int session_index)); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD0(PerformLogoutAllAccountsAction, void()); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserContextKeyedService* MockAccountReconcilor::Build( 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* profile) { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new MockAccountReconcilor(static_cast<Profile*>(profile)); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MockAccountReconcilor::MockAccountReconcilor(Profile* profile) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : testing::StrictMock<AccountReconcilor>(profile) { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class AccountReconcilorTest : public testing::Test { 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorTest(); 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void SetUp() OVERRIDE; 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void TearDown() OVERRIDE; 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestingProfile* profile() { return profile_.get(); } 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeSigninManagerForTesting* signin_manager() { return signin_manager_; } 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service() { return token_service_; } 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetFakeResponse(const std::string& url, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& data, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpStatusCode code, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequestStatus::Status status) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAccountReconcilor* GetMockReconcilor(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateMergeSessionCompleted( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateRefreshTokenFetched( 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& refresh_token); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)private: 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::TestBrowserThreadBundle bundle_; 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestingProfile> profile_; 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeSigninManagerForTesting* signin_manager_; 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service_; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAccountReconcilor* mock_reconcilor_; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::FakeURLFetcherFactory url_fetcher_factory_; 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AccountReconcilorTest::AccountReconcilorTest() 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : signin_manager_(NULL), 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service_(NULL), 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_reconcilor_(NULL), 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_(NULL) {} 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AccountReconcilorTest::SetUp() { 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestingProfile::Builder builder; 1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(), 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeProfileOAuth2TokenServiceWrapper::Build); 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeSigninManagerBase::Build); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) builder.AddTestingFactory(AccountReconcilorFactory::GetInstance(), 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAccountReconcilor::Build); 1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile_ = builder.Build(); 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager_ = 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<FakeSigninManagerForTesting*>( 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile())); 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) token_service_ = 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<FakeProfileOAuth2TokenService*>( 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile())); 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AccountReconcilorTest::TearDown() { 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Destroy the profile before all threads are torn down. 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile_.reset(); 1238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() { 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!mock_reconcilor_) { 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_reconcilor_ = 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<MockAccountReconcilor*>( 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile())); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return mock_reconcilor_; 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateMergeSessionCompleted( 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) { 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer->MergeSessionCompleted(account_id, error); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateRefreshTokenFetched( 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& refresh_token) { 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->HandleRefreshTokenFetched(account_id, refresh_token); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(AccountReconcilorTest, Basic) { 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) AccountReconcilor* reconcilor = 1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(profile(), reconcilor->profile()); 1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_CHROMEOS) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, SigninManagerRegistration) { 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilor* reconcilor = 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsPeriodicReconciliationRunning()); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService()); 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager()->OnExternalSigninCompleted(kTestEmail); 1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsPeriodicReconciliationRunning()); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager()->SignOut(); 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsPeriodicReconciliationRunning()); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService()); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, Reauth) { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsPeriodicReconciliationRunning()); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Simulate reauth. The state of the reconcilor should not change. 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->OnExternalSigninCompleted(kTestEmail); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsPeriodicReconciliationRunning()); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, ProfileAlreadyConnected) { 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilor* reconcilor = 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsPeriodicReconciliationRunning()); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieSuccess) { 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0]]]", 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<std::string>& accounts = 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->GetGaiaAccountsForTesting(); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, accounts.size()); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ("user@gmail.com", accounts[0]); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieFailure) { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", "", 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetGaiaAccountsForTesting().size()); 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokens) { 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueTokenForAllPendingRequests("access_token", 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetValidChromeAccountsForTesting().size()); 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedUserInfo) { 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueTokenForAllPendingRequests("access_token", 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size()); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedTokenRequest) { 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueErrorForAllPendingRequests( 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size()); 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileNoop) { 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0]]]", 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size()); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileNoopMultiple) { 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0], " 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0]]]", 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(2u, reconcilor->GetGaiaAccountsForTesting().size()); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileAddToCookie) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0]]]", 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileAddToChrome) { 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PerformAddToChromeAction("other@gmail.com", 1)); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0], " 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0]]]", 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", ""); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileBadPrimary) { 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0], " 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0]]]", 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, StartReconcileOnlyOnce) { 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://accounts.google.com/ListAccounts", 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "[\"foo\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0]]]", 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 483