account_reconcilor_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(PerformMergeAction, void(const std::string& account_id));
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(PerformStartRemoveAction, void(const std::string& account_id));
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD3(
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PerformFinishRemoveAction,
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      void(const std::string& account_id,
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           const GoogleServiceAuthError& error,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           const std::vector<std::pair<std::string, bool> >& accounts));
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MOCK_METHOD3(PerformAddToChromeAction,
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               void(const std::string& account_id,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    int session_index,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    const std::string& signin_scoped_device_id));
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD0(PerformLogoutAllAccountsAction, void());
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochKeyedService* MockAccountReconcilor::Build(content::BrowserContext* context) {
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Profile* profile = Profile::FromBrowserContext(context);
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AccountReconcilor* reconcilor = new MockAccountReconcilor(
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      SigninManagerFactory::GetForProfile(profile),
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ChromeSigninClientFactory::GetForProfile(profile));
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  reconcilor->Initialize(false /* start_reconcile_if_tokens_available */);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return reconcilor;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMockAccountReconcilor::MockAccountReconcilor(
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ProfileOAuth2TokenService* token_service,
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SigninManagerBase* signin_manager,
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SigninClient* client)
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : testing::StrictMock<AccountReconcilor>(token_service,
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                             signin_manager,
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                             client) {}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class AccountReconcilorTest : public ::testing::TestWithParam<bool> {
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccountReconcilorTest();
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingProfile* profile() { return profile_; }
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeSigninManagerForTesting* signin_manager() { return signin_manager_; }
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeProfileOAuth2TokenService* token_service() { return token_service_; }
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  UMAHistogramHelper* histogram_helper() { return &histogram_helper_; }
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetFakeResponse(const std::string& url,
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const std::string& data,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       net::HttpStatusCode code,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       net::URLRequestStatus::Status status) {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockAccountReconcilor* GetMockReconcilor();
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SimulateMergeSessionCompleted(
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MergeSessionHelper::Observer* observer,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& account_id,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GoogleServiceAuthError& error);
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SimulateRefreshTokenFetched(
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilor* reconcilor,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& account_id,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& refresh_token);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::TestBrowserThreadBundle bundle_;
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingProfile* profile_;
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeSigninManagerForTesting* signin_manager_;
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeProfileOAuth2TokenService* token_service_;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockAccountReconcilor* mock_reconcilor_;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::FakeURLFetcherFactory url_fetcher_factory_;
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<TestingProfileManager> testing_profile_manager_;
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  UMAHistogramHelper histogram_helper_;
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccountReconcilorTest);
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AccountReconcilorTest::AccountReconcilorTest()
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : signin_manager_(NULL),
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      token_service_(NULL),
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      mock_reconcilor_(NULL),
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url_fetcher_factory_(NULL) {}
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AccountReconcilorTest::SetUp() {
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // If it's a non-parameterized test, or we have a parameter of true, set flag.
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!::testing::UnitTest::GetInstance()->current_test_info()->value_param() ||
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GetParam()) {
1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        switches::kEnableNewProfileManagement);
1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  testing_profile_manager_.reset(
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(testing_profile_manager_.get()->SetUp());
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingProfile::TestingFactories factories;
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  factories.push_back(std::make_pair(ChromeSigninClientFactory::GetInstance(),
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      signin::BuildTestSigninClient));
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  factories.push_back(std::make_pair(
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetInstance(),
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BuildFakeProfileOAuth2TokenService));
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  factories.push_back(std::make_pair(SigninManagerFactory::GetInstance(),
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FakeSigninManagerBase::Build));
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  factories.push_back(std::make_pair(AccountReconcilorFactory::GetInstance(),
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      MockAccountReconcilor::Build));
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  profile_ = testing_profile_manager_.get()->CreateTestingProfile("name",
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              scoped_ptr<PrefServiceSyncable>(),
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              base::UTF8ToUTF16("name"), 0, std::string(),
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              factories);
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  signin_manager_ =
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      static_cast<FakeSigninManagerForTesting*>(
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          SigninManagerFactory::GetForProfile(profile()));
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  token_service_ =
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      static_cast<FakeProfileOAuth2TokenService*>(
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ProfileOAuth2TokenServiceFactory::GetForProfile(profile()));
1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Take a new snapshot of the concerned histograms before each test
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper_.PrepareSnapshot(kHistogramsToSnapshot,
1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                    arraysize(kHistogramsToSnapshot));
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() {
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!mock_reconcilor_) {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    mock_reconcilor_ =
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<MockAccountReconcilor*>(
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            AccountReconcilorFactory::GetForProfile(profile()));
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return mock_reconcilor_;
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateMergeSessionCompleted(
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MergeSessionHelper::Observer* observer,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& account_id,
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GoogleServiceAuthError& error) {
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer->MergeSessionCompleted(account_id, error);
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilorTest::SimulateRefreshTokenFetched(
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AccountReconcilor* reconcilor,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& account_id,
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& refresh_token) {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->HandleRefreshTokenFetched(account_id, refresh_token);
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(AccountReconcilorTest, Basic) {
2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  AccountReconcilor* reconcilor =
2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(token_service(), reconcilor->token_service());
2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_CHROMEOS)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded|
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// method with an empty implementation. On MacOS, the normal implementation
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// causes the try_bots to time out.
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, SigninManagerRegistration) {
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccountReconcilor* reconcilor =
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService());
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  signin_manager()->set_password("password");
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  signin_manager()->OnExternalSigninCompleted(kTestEmail);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST);
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService());
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded|
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// method with an empty implementation. On MacOS, the normal implementation
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// causes the try_bots to time out.
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, Reauth) {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  signin_manager()->set_password("password");
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate reauth.  The state of the reconcilor should not change.
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->OnExternalSigninCompleted(kTestEmail);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AccountReconcilorTest, ProfileAlreadyConnected) {
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccountReconcilor* reconcilor =
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieSuccess) {
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]",
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::vector<std::pair<std::string, bool> >& accounts =
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reconcilor->GetGaiaAccountsForTesting();
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, accounts.size());
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ("user@gmail.com", accounts[0].first);
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieFailure) {
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), "",
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS);
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetGaiaAccountsForTesting().size());
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokens) {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueTokenForAllPendingRequests("access_token",
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetValidChromeAccountsForTesting().size());
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetInvalidChromeAccountsForTesting().size());
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedUserInfo) {
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "", net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS);
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueTokenForAllPendingRequests("access_token",
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size());
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size());
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedTokenRequest) {
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueErrorForAllPendingRequests(
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size());
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoop) {
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size());
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
3946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
3966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectTotalCount(
3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
4006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
4016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This is test is needed until chrome changes to use gaia obfuscated id.
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The signin manager and token service use the gaia "email" property, which
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// preserves dots in usernames and preserves case. gaia::ParseListAccountsData()
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// however uses gaia "displayEmail" which does not preserve case, and then
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// passes the string through gaia::CanonicalizeEmail() which removes dots.  This
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tests makes sure that an email like "Dot.S@hmail.com", as seen by the
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// token service, will be considered the same as "dots@gmail.com" as returned
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// by gaia::ParseListAccountsData().
4126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoopWithDots) {
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("Dot.S@gmail.com");
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->UpdateCredentials("Dot.S@gmail.com", "refresh_token");
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AccountReconcilor* reconcilor =
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"dot.s@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  reconcilor->StartReconcile();
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size());
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_STREQ("dots@gmail.com",
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               reconcilor->GetGaiaAccountsForTesting()[0].first.c_str());
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("Dot.S@gmail.com", "access_token",
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
4436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
4456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
4466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
4476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
4486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoopMultiple) {
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, reconcilor->GetGaiaAccountsForTesting().size());
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
4906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectTotalCount(
4916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookie) {
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
5256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
5276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
5296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
5316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
5336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookieTwice) {
5366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
5376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
5396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
5416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("third@gmail.com"));
5426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse(
5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GaiaUrls::GetInstance()->list_accounts_url().spec(),
5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::HTTP_OK,
5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::URLRequestStatus::SUCCESS);
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
5496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  "{\"id\":\"foo\"}",
5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  net::HTTP_OK,
5516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  net::URLRequestStatus::SUCCESS);
5526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
5546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->StartReconcile();
5556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "other@gmail.com",
5576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "access_token",
5586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "user@gmail.com",
5616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "access_token",
5626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
5656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
5666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SimulateMergeSessionCompleted(
5676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      reconcilor, "other@gmail.com", GoogleServiceAuthError::AuthErrorNone());
5686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
5756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
5776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
5786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
5796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Do another pass after I've added a third account to the token service
5816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse(
5836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GaiaUrls::GetInstance()->list_accounts_url().spec(),
5846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
5856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
5866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::HTTP_OK,
5876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::URLRequestStatus::SUCCESS);
5886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // This will cause the reconcilor to fire.
5896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("third@gmail.com", "refresh_token");
5906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "other@gmail.com",
5936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "access_token",
5946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "user@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)      "third@gmail.com",
6016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "access_token",
6026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
6036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
6076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SimulateMergeSessionCompleted(
6086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      reconcilor, "third@gmail.com", GoogleServiceAuthError::AuthErrorNone());
6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
6126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
6146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
6156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
6166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
6186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
6206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun",
6226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
6236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
6246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 1, 1);
6266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.SubsequentRun", 0, 1);
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToChrome) {
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(),
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              PerformAddToChromeAction("other@gmail.com", 1, ""));
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", "");
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
6536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
6556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
6576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
6586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
6596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1);
6616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 1, 1);
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileBadPrimary) {
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               "[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
6966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->Fetch();
6986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
6996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
7006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      signin_metrics::COOKIE_AND_TOKEN_PRIMARIES_DIFFERENT,
7016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      1);
7026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
7036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 2, 1);
7046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_helper()->ExpectUniqueSample(
7056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
7061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileOnlyOnce) {
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AccountReconcilor* reconcilor =
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  reconcilor->StartReconcile();
724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileWithSessionInfoExpiredDefault) {
734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0],"
742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AccountReconcilor* reconcilor =
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reconcilor->StartReconcile();
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
766116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(AccountReconcilorTest, MergeSessionCompletedWithBogusAccount) {
767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]",
774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AccountReconcilor* reconcilor =
779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AccountReconcilorFactory::GetForProfile(profile());
780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor);
781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->is_reconcile_started_);
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  reconcilor->StartReconcile();
784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If an unknown account id is sent, it should not upset the state.
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateMergeSessionCompleted(reconcilor, "bogus@gmail.com",
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                GoogleServiceAuthError::AuthErrorNone());
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                GoogleServiceAuthError::AuthErrorNone());
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->is_reconcile_started_);
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AccountReconcilorMaybeEnabled,
8016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        AccountReconcilorTest,
8026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        testing::Bool());
803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
804