account_reconcilor_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/command_line.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/run_loop.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/test/histogram_tester.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/time/time.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "build/build_config.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/signin/account_reconcilor_factory.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/signin/chrome_signin_client_factory.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/signin/test_signin_client_builder.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/browser/account_reconcilor.h"
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/signin/core/browser/profile_oauth2_token_service.h"
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/browser/signin_manager.h"
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/signin/core/browser/signin_metrics.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/signin/core/common/profile_management_switches.h"
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/signin/core/common/signin_switches.h"
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kTestEmail[] = "user@gmail.com";
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MockAccountReconcilor : public testing::StrictMock<AccountReconcilor> {
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static KeyedService* Build(content::BrowserContext* context);
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockAccountReconcilor(ProfileOAuth2TokenService* token_service,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        SigninManagerBase* signin_manager,
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        SigninClient* client);
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~MockAccountReconcilor() {}
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void StartFetchingExternalCcResult() OVERRIDE {
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Don't do this in tests.
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD1(PerformMergeAction, void(const std::string& account_id));
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MOCK_METHOD1(PerformStartRemoveAction, void(const std::string& account_id));
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MOCK_METHOD3(
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      PerformFinishRemoveAction,
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      void(const std::string& account_id,
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)           const GoogleServiceAuthError& error,
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)           const std::vector<std::pair<std::string, bool> >& accounts));
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  MOCK_METHOD3(PerformAddToChromeAction,
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)               void(const std::string& account_id,
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    int session_index,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    const std::string& signin_scoped_device_id));
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MOCK_METHOD0(PerformLogoutAllAccountsAction, void());
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)KeyedService* MockAccountReconcilor::Build(content::BrowserContext* context) {
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(context);
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor = new MockAccountReconcilor(
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SigninManagerFactory::GetForProfile(profile),
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ChromeSigninClientFactory::GetForProfile(profile));
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->Initialize(false /* start_reconcile_if_tokens_available */);
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return reconcilor;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MockAccountReconcilor::MockAccountReconcilor(
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ProfileOAuth2TokenService* token_service,
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SigninManagerBase* signin_manager,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SigninClient* client)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : testing::StrictMock<AccountReconcilor>(token_service,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             signin_manager,
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             client) {}
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class AccountReconcilorTest : public ::testing::TestWithParam<bool> {
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AccountReconcilorTest();
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE;
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingProfile* profile() { return profile_; }
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FakeSigninManagerForTesting* signin_manager() { return signin_manager_; }
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FakeProfileOAuth2TokenService* token_service() { return token_service_; }
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::HistogramTester* histogram_tester() { return &histogram_tester_; }
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetFakeResponse(const std::string& url,
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       const std::string& data,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       net::HttpStatusCode code,
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       net::URLRequestStatus::Status status) {
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  MockAccountReconcilor* GetMockReconcilor();
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SimulateMergeSessionCompleted(
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MergeSessionHelper::Observer* observer,
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& account_id,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const GoogleServiceAuthError& error);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void SimulateRefreshTokenFetched(
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilor* reconcilor,
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& account_id,
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& refresh_token);
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::TestBrowserThreadBundle bundle_;
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestingProfile* profile_;
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FakeSigninManagerForTesting* signin_manager_;
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FakeProfileOAuth2TokenService* token_service_;
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  MockAccountReconcilor* mock_reconcilor_;
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  net::FakeURLFetcherFactory url_fetcher_factory_;
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<TestingProfileManager> testing_profile_manager_;
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::HistogramTester histogram_tester_;
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccountReconcilorTest);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AccountReconcilorTest::AccountReconcilorTest()
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : signin_manager_(NULL),
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      token_service_(NULL),
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      mock_reconcilor_(NULL),
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      url_fetcher_factory_(NULL) {}
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AccountReconcilorTest::SetUp() {
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // If it's a non-parameterized test, or we have a parameter of true, set flag.
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!::testing::UnitTest::GetInstance()->current_test_info()->value_param() ||
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetParam()) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CommandLine::ForCurrentProcess()->AppendSwitch(
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switches::kEnableNewProfileManagement);
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  testing_profile_manager_.reset(
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(testing_profile_manager_.get()->SetUp());
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingProfile::TestingFactories factories;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  factories.push_back(std::make_pair(ChromeSigninClientFactory::GetInstance(),
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      signin::BuildTestSigninClient));
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  factories.push_back(std::make_pair(
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetInstance(),
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BuildFakeProfileOAuth2TokenService));
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  factories.push_back(std::make_pair(SigninManagerFactory::GetInstance(),
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      FakeSigninManagerBase::Build));
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  factories.push_back(std::make_pair(AccountReconcilorFactory::GetInstance(),
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MockAccountReconcilor::Build));
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  profile_ = testing_profile_manager_.get()->CreateTestingProfile("name",
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              scoped_ptr<PrefServiceSyncable>(),
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              base::UTF8ToUTF16("name"), 0, std::string(),
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              factories);
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager_ =
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      static_cast<FakeSigninManagerForTesting*>(
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          SigninManagerFactory::GetForProfile(profile()));
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service_ =
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      static_cast<FakeProfileOAuth2TokenService*>(
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ProfileOAuth2TokenServiceFactory::GetForProfile(profile()));
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() {
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!mock_reconcilor_) {
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    mock_reconcilor_ =
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        static_cast<MockAccountReconcilor*>(
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            AccountReconcilorFactory::GetForProfile(profile()));
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return mock_reconcilor_;
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AccountReconcilorTest::SimulateMergeSessionCompleted(
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MergeSessionHelper::Observer* observer,
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& account_id,
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GoogleServiceAuthError& error) {
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  observer->MergeSessionCompleted(account_id, error);
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AccountReconcilorTest::SimulateRefreshTokenFetched(
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AccountReconcilor* reconcilor,
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& account_id,
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& refresh_token) {
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->HandleRefreshTokenFetched(account_id, refresh_token);
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AccountReconcilorTest, Basic) {
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(token_service(), reconcilor->token_service());
2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if !defined(OS_CHROMEOS)
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded|
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// method with an empty implementation. On MacOS, the normal implementation
2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// causes the try_bots to time out.
2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(AccountReconcilorTest, SigninManagerRegistration) {
2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AccountReconcilor* reconcilor =
2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService());
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->set_password("password");
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->OnExternalSigninCompleted(kTestEmail);
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST);
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService());
2246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This method requires the use of the |TestSigninClient| to be created from the
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |ChromeSigninClientFactory| because it overrides the |GoogleSigninSucceeded|
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// method with an empty implementation. On MacOS, the normal implementation
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// causes the try_bots to time out.
2306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(AccountReconcilorTest, Reauth) {
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  signin_manager()->set_password("password");
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AccountReconcilorFactory::GetForProfile(profile());
2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
2386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Simulate reauth.  The state of the reconcilor should not change.
2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->OnExternalSigninCompleted(kTestEmail);
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(AccountReconcilorTest, ProfileAlreadyConnected) {
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor->IsRegisteredWithTokenService());
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieSuccess) {
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]",
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->StartReconcile();
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::vector<std::pair<std::string, bool> >& accounts =
272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      reconcilor->GetGaiaAccountsForTesting();
2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(1u, accounts.size());
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ("user@gmail.com", accounts[0].first);
2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(AccountReconcilorTest, GetAccountsFromCookieFailure) {
2786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), "",
2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS);
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->StartReconcile();
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
2896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetGaiaAccountsForTesting().size());
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokens) {
2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AccountReconcilor* reconcilor =
2996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
3076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueTokenForAllPendingRequests("access_token",
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetValidChromeAccountsForTesting().size());
3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetInvalidChromeAccountsForTesting().size());
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedUserInfo) {
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor =
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor);
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "", net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS);
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->IssueTokenForAllPendingRequests("access_token",
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size());
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size());
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AccountReconcilorTest, ValidateAccountsFromTokensFailedTokenRequest) {
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor =
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor);
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->ValidateAccountsFromTokenService();
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->IssueErrorForAllPendingRequests(
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size());
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size());
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileNoop) {
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->SetAuthenticatedUsername(kTestEmail);
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor =
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor);
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  reconcilor->StartReconcile();
373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size());
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->is_reconcile_started_);
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histogram_tester()->ExpectTotalCount(
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      1);
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This is test is needed until chrome changes to use gaia obfuscated id.
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The signin manager and token service use the gaia "email" property, which
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// preserves dots in usernames and preserves case. gaia::ParseListAccountsData()
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// however uses gaia "displayEmail" which does not preserve case, and then
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// passes the string through gaia::CanonicalizeEmail() which removes dots.  This
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// tests makes sure that an email like "Dot.S@hmail.com", as seen by the
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// token service, will be considered the same as "dots@gmail.com" as returned
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// by gaia::ParseListAccountsData().
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(AccountReconcilorTest, StartReconcileNoopWithDots) {
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("Dot.S@gmail.com");
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials("Dot.S@gmail.com", "refresh_token");
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor =
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor);
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"dot.s@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->StartReconcile();
4196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
4206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size());
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_STREQ("dots@gmail.com",
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               reconcilor->GetGaiaAccountsForTesting()[0].first.c_str());
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("Dot.S@gmail.com", "access_token",
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
4316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      1);
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(AccountReconcilorTest, StartReconcileNoopMultiple) {
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
4456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
4466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AccountReconcilor* reconcilor =
4486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
4496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
4506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
4526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
4536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
4546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
4566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->StartReconcile();
4596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
4606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
4646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(2u, reconcilor->GetGaiaAccountsForTesting().size());
4666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
4686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
4696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
4726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
4746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectTotalCount(
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      1);
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookie) {
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
4986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
4996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reconcilor->StartReconcile();
503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
5046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
5096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
5106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
5116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
5156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      1);
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
5206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToCookieTwice) {
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
5306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("third@gmail.com"));
531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse(
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GaiaUrls::GetInstance()->list_accounts_url().spec(),
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK,
536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::URLRequestStatus::SUCCESS);
537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  "{\"id\":\"foo\"}",
539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  net::HTTP_OK,
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  net::URLRequestStatus::SUCCESS);
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  reconcilor->StartReconcile();
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "other@gmail.com",
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "access_token",
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "user@gmail.com",
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "access_token",
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SimulateMergeSessionCompleted(
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      reconcilor, "other@gmail.com", GoogleServiceAuthError::AuthErrorNone());
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histogram_tester()->ExpectUniqueSample(
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      1);
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Do another pass after I've added a third account to the token service
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse(
571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GaiaUrls::GetInstance()->list_accounts_url().spec(),
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::HTTP_OK,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::URLRequestStatus::SUCCESS);
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This will cause the reconcilor to fire.
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials("third@gmail.com", "refresh_token");
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "other@gmail.com",
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "access_token",
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "user@gmail.com",
585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "access_token",
586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount(
588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "third@gmail.com",
589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "access_token",
590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateMergeSessionCompleted(
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      reconcilor, "third@gmail.com", GoogleServiceAuthError::AuthErrorNone());
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      1);
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun",
609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      1);
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 1, 1);
613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.AddedToChrome.SubsequentRun", 0, 1);
615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileAddToChrome) {
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(),
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              PerformAddToChromeAction("other@gmail.com", 1, ""));
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor = GetMockReconcilor();
632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  reconcilor->StartReconcile();
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", "");
639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
6435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      signin_metrics::ACCOUNTS_SAME,
6445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      1);
6456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
6466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1);
6476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  histogram_tester()->ExpectUniqueSample(
6485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Signin.Reconciler.AddedToChrome.FirstRun", 1, 1);
6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AccountReconcilorTest, StartReconcileBadPrimary) {
6526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
6536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
6546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
6555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               "[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AccountReconcilor* reconcilor = GetMockReconcilor();
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  reconcilor->StartReconcile();
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                GoogleServiceAuthError::AuthErrorNone());
678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                GoogleServiceAuthError::AuthErrorNone());
681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->is_reconcile_started_);
682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histogram_tester()->ExpectUniqueSample(
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      signin_metrics::COOKIE_AND_TOKEN_PRIMARIES_DIFFERENT,
686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      1);
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  histogram_tester()->ExpectUniqueSample(
688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Signin.Reconciler.AddedToCookieJar.FirstRun", 2, 1);
689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histogram_tester()->ExpectUniqueSample(
690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
693116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_P(AccountReconcilorTest, StartReconcileOnlyOnce) {
694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager()->SetAuthenticatedUsername(kTestEmail);
695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->UpdateCredentials(kTestEmail, "refresh_token");
696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AccountReconcilor* reconcilor =
698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AccountReconcilorFactory::GetForProfile(profile());
699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor);
700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  reconcilor->StartReconcile();
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(reconcilor->is_reconcile_started_);
716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
718116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_P(AccountReconcilorTest, StartReconcileWithSessionInfoExpiredDefault) {
719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0],"
727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* reconcilor =
733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(reconcilor);
7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  reconcilor->StartReconcile();
738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(reconcilor->is_reconcile_started_);
739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Time::Now() + base::TimeDelta::FromHours(1));
744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
7466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
7476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
7486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
7496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
7506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
7516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(AccountReconcilorTest, MergeSessionCompletedWithBogusAccount) {
7526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  signin_manager()->SetAuthenticatedUsername("user@gmail.com");
7536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
7546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
7556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]]]",
7595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      net::HTTP_OK, net::URLRequestStatus::SUCCESS);
7605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetFakeResponse("https://www.googleapis.com/oauth2/v1/userinfo",
7615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
7625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccountReconcilor* reconcilor =
7645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile());
7655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor);
7665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
7685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reconcilor->StartReconcile();
7695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
7705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // If an unknown account id is sent, it should not upset the state.
7766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "bogus@gmail.com",
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(reconcilor->is_reconcile_started_);
7796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
7805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
7816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                GoogleServiceAuthError::AuthErrorNone());
7826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(reconcilor->is_reconcile_started_);
7836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(AccountReconcilorMaybeEnabled,
7865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        AccountReconcilorTest,
7875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        testing::Bool());
7886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
7896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)