account_reconcilor_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "build/build_config.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/account_reconcilor_factory.h" 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/signin/chrome_signin_client_factory.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h" 178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/signin/test_signin_client_builder.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/test/base/uma_histogram_helper.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/account_reconcilor.h" 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/signin/core/browser/signin_metrics.h" 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/common/signin_switches.h" 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace { 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kTestEmail[] = "user@gmail.com"; 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char* const kHistogramsToSnapshot[] = { 406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun", 446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.SubsequentRun"}; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockAccountReconcilor : public testing::StrictMock<AccountReconcilor> { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static KeyedService* Build(content::BrowserContext* context); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MockAccountReconcilor(ProfileOAuth2TokenService* token_service, 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerBase* signin_manager, 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninClient* client); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MockAccountReconcilor() {} 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void StartFetchingExternalCcResult() OVERRIDE { 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Don't do this in tests. 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(PerformMergeAction, void(const std::string& account_id)); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MOCK_METHOD1(PerformStartRemoveAction, void(const std::string& account_id)); 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOCK_METHOD3( 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PerformFinishRemoveAction, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void(const std::string& account_id, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GoogleServiceAuthError& error, 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<std::pair<std::string, bool> >& accounts)); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MOCK_METHOD3(PerformAddToChromeAction, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void(const std::string& account_id, 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int session_index, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& signin_scoped_device_id)); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD0(PerformLogoutAllAccountsAction, void()); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochKeyedService* MockAccountReconcilor::Build(content::BrowserContext* context) { 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Profile* profile = Profile::FromBrowserContext(context); 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AccountReconcilor* reconcilor = new MockAccountReconcilor( 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile), 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerFactory::GetForProfile(profile), 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ChromeSigninClientFactory::GetForProfile(profile)); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor->Initialize(false /* start_reconcile_if_tokens_available */); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return reconcilor; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMockAccountReconcilor::MockAccountReconcilor( 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileOAuth2TokenService* token_service, 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerBase* signin_manager, 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninClient* client) 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : testing::StrictMock<AccountReconcilor>(token_service, 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager, 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch client) {} 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class AccountReconcilorTest : public ::testing::TestWithParam<bool> { 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorTest(); 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void SetUp() OVERRIDE; 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestingProfile* profile() { return profile_; } 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeSigninManagerForTesting* signin_manager() { return signin_manager_; } 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service() { return token_service_; } 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UMAHistogramHelper* histogram_helper() { return &histogram_helper_; } 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetFakeResponse(const std::string& url, 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& data, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpStatusCode code, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequestStatus::Status status) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAccountReconcilor* GetMockReconcilor(); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateMergeSessionCompleted( 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateRefreshTokenFetched( 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& refresh_token); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::TestBrowserThreadBundle bundle_; 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestingProfile* profile_; 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeSigninManagerForTesting* signin_manager_; 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service_; 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAccountReconcilor* mock_reconcilor_; 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::FakeURLFetcherFactory url_fetcher_factory_; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestingProfileManager> testing_profile_manager_; 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UMAHistogramHelper histogram_helper_; 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AccountReconcilorTest); 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AccountReconcilorTest::AccountReconcilorTest() 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : signin_manager_(NULL), 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service_(NULL), 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_reconcilor_(NULL), 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_(NULL) {} 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AccountReconcilorTest::SetUp() { 1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // If it's a non-parameterized test, or we have a parameter of true, set flag. 1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!::testing::UnitTest::GetInstance()->current_test_info()->value_param() || 1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetParam()) { 1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) switches::kEnableNewProfileManagement); 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_profile_manager_.reset( 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new TestingProfileManager(TestingBrowserProcess::GetGlobal())); 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(testing_profile_manager_.get()->SetUp()); 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestingProfile::TestingFactories factories; 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factories.push_back(std::make_pair(ChromeSigninClientFactory::GetInstance(), 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin::BuildTestSigninClient)); 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factories.push_back(std::make_pair( 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance(), 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BuildFakeProfileOAuth2TokenService)); 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factories.push_back(std::make_pair(SigninManagerFactory::GetInstance(), 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FakeSigninManagerBase::Build)); 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factories.push_back(std::make_pair(AccountReconcilorFactory::GetInstance(), 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MockAccountReconcilor::Build)); 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_ = testing_profile_manager_.get()->CreateTestingProfile("name", 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<PrefServiceSyncable>(), 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UTF8ToUTF16("name"), 0, std::string(), 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) factories); 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager_ = 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<FakeSigninManagerForTesting*>( 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile())); 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) token_service_ = 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<FakeProfileOAuth2TokenService*>( 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile())); 1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Take a new snapshot of the concerned histograms before each test 1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper_.PrepareSnapshot(kHistogramsToSnapshot, 1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) arraysize(kHistogramsToSnapshot)); 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() { 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!mock_reconcilor_) { 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_reconcilor_ = 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<MockAccountReconcilor*>( 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile())); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return mock_reconcilor_; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateMergeSessionCompleted( 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer, 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer->MergeSessionCompleted(account_id, error); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateRefreshTokenFetched( 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor, 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& refresh_token) { 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->HandleRefreshTokenFetched(account_id, refresh_token); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(AccountReconcilorTest, Basic) { 2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) AccountReconcilor* reconcilor = 2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(token_service(), reconcilor->token_service()); 2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_CHROMEOS) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded| 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// method with an empty implementation. On MacOS, the normal implementation 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// causes the try_bots to time out. 2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, SigninManagerRegistration) { 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilor* reconcilor = 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService()); 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin_manager()->set_password("password"); 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager()->OnExternalSigninCompleted(kTestEmail); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService()); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded| 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// method with an empty implementation. On MacOS, the normal implementation 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// causes the try_bots to time out. 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, Reauth) { 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin_manager()->set_password("password"); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Simulate reauth. The state of the reconcilor should not change. 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->OnExternalSigninCompleted(kTestEmail); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, ProfileAlreadyConnected) { 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilor* reconcilor = 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieSuccess) { 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]", 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<std::pair<std::string, bool> >& accounts = 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->GetGaiaAccountsForTesting(); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, accounts.size()); 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ("user@gmail.com", accounts[0].first); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieFailure) { 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), "", 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetGaiaAccountsForTesting().size()); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokens) { 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueTokenForAllPendingRequests("access_token", 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetValidChromeAccountsForTesting().size()); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedUserInfo) { 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueTokenForAllPendingRequests("access_token", 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size()); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedTokenRequest) { 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->ValidateAccountsFromTokenService(); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueErrorForAllPendingRequests( 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size()); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoop) { 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size()); 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 4006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectTotalCount( 4016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1); 4026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 4056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This is test is needed until chrome changes to use gaia obfuscated id. 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The signin manager and token service use the gaia "email" property, which 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// preserves dots in usernames and preserves case. gaia::ParseListAccountsData() 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// however uses gaia "displayEmail" which does not preserve case, and then 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// passes the string through gaia::CanonicalizeEmail() which removes dots. This 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tests makes sure that an email like "Dot.S@hmail.com", as seen by the 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// token service, will be considered the same as "dots@gmail.com" as returned 415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// by gaia::ParseListAccountsData(). 4166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoopWithDots) { 417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("Dot.S@gmail.com"); 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->UpdateCredentials("Dot.S@gmail.com", "refresh_token"); 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccountReconcilor* reconcilor = 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(reconcilor); 423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"dot.s@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor->StartReconcile(); 431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size()); 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_STREQ("dots@gmail.com", 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor->GetGaiaAccountsForTesting()[0].first.c_str()); 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueAllTokensForAccount("Dot.S@gmail.com", "access_token", 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 4486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 4496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 4506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 4516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 4526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoopMultiple) { 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(2u, reconcilor->GetGaiaAccountsForTesting().size()); 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectTotalCount( 4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1); 4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 4986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 4996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookie) { 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 5276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 5296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 5316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 5326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 5336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1); 5356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1); 5376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookieTwice) { 5406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 5416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 5426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 5436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("third@gmail.com")); 5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetFakeResponse( 5486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GaiaUrls::GetInstance()->list_accounts_url().spec(), 5496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HTTP_OK, 5516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequestStatus::SUCCESS); 552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 5536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "{\"id\":\"foo\"}", 5546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HTTP_OK, 5556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequestStatus::SUCCESS); 5566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 5586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) reconcilor->StartReconcile(); 5596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->IssueAllTokensForAccount( 5606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "other@gmail.com", 5616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "access_token", 5626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 5636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->IssueAllTokensForAccount( 5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "user@gmail.com", 5656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "access_token", 5666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 5676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SimulateMergeSessionCompleted( 5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) reconcilor, "other@gmail.com", GoogleServiceAuthError::AuthErrorNone()); 5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 5756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 5776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 5786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 5796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1); 5816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 5826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1); 5836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Do another pass after I've added a third account to the token service 5856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetFakeResponse( 5876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GaiaUrls::GetInstance()->list_accounts_url().spec(), 5886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 5896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 5906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HTTP_OK, 5916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequestStatus::SUCCESS); 5926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // This will cause the reconcilor to fire. 5936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->UpdateCredentials("third@gmail.com", "refresh_token"); 5946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->IssueAllTokensForAccount( 5966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "other@gmail.com", 5976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "access_token", 5986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 5996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->IssueAllTokensForAccount( 6006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "user@gmail.com", 6016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "access_token", 6026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 6036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service()->IssueAllTokensForAccount( 6046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "third@gmail.com", 6056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "access_token", 6066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 6076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 6086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 6116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SimulateMergeSessionCompleted( 6126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) reconcilor, "third@gmail.com", GoogleServiceAuthError::AuthErrorNone()); 6136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 6146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 6156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 6166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 6186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 6196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 6206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1); 6226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1); 6246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun", 6266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 6276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 6286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 1, 1); 6306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.SubsequentRun", 0, 1); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToChrome) { 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), 639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PerformAddToChromeAction("other@gmail.com", 1, "")); 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", ""); 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 6576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 6586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 6596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 6616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::ACCOUNTS_SAME, 6626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 6636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1); 6656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 6666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 1, 1); 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileBadPrimary) { 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = GetMockReconcilor(); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 7006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 7016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->Fetch(); 7026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 7036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 7046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) signin_metrics::COOKIE_AND_TOKEN_PRIMARIES_DIFFERENT, 7056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1); 7066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 7076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToCookieJar.FirstRun", 2, 1); 7086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) histogram_helper()->ExpectUniqueSample( 7096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1); 7101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileOnlyOnce) { 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername(kTestEmail); 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor = 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor->StartReconcile(); 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileWithSessionInfoExpiredDefault) { 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]," 746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HTTP_OK, net::URLRequestStatus::SUCCESS); 748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccountReconcilor* reconcilor = 752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccountReconcilorFactory::GetForProfile(profile()); 753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(reconcilor); 754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor->StartReconcile(); 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(reconcilor->is_reconcile_started_); 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromHours(1)); 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(reconcilor->is_reconcile_started_); 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 770116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(AccountReconcilorTest, MergeSessionCompletedWithBogusAccount) { 771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]", 778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HTTP_OK, net::URLRequestStatus::SUCCESS); 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo", 780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountReconcilor* reconcilor = 783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountReconcilorFactory::GetForProfile(profile()); 784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(reconcilor); 785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(reconcilor->is_reconcile_started_); 787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reconcilor->StartReconcile(); 788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(reconcilor->is_reconcile_started_); 789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time::Now() + base::TimeDelta::FromHours(1)); 792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop().RunUntilIdle(); 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If an unknown account id is sent, it should not upset the state. 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SimulateMergeSessionCompleted(reconcilor, "bogus@gmail.com", 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GoogleServiceAuthError::AuthErrorNone()); 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(reconcilor->is_reconcile_started_); 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GoogleServiceAuthError::AuthErrorNone()); 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(reconcilor->is_reconcile_started_); 802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AccountReconcilorMaybeEnabled, 8056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountReconcilorTest, 8066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) testing::Bool()); 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 808