Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Side by Side Diff: chrome/browser/signin/account_reconcilor_unittest.cc

Issue 309843002: Improve UMA tests; improve no-op reconcilor; new reconcilor test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/test/statistics_delta_reader.h ('k') | chrome/test/base/uma_histogram_helper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "chrome/browser/prefs/pref_service_syncable.h" 11 #include "chrome/browser/prefs/pref_service_syncable.h"
12 #include "chrome/browser/signin/account_reconcilor_factory.h" 12 #include "chrome/browser/signin/account_reconcilor_factory.h"
13 #include "chrome/browser/signin/chrome_signin_client_factory.h" 13 #include "chrome/browser/signin/chrome_signin_client_factory.h"
14 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 14 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
15 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 15 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
16 #include "chrome/browser/signin/fake_signin_manager.h" 16 #include "chrome/browser/signin/fake_signin_manager.h"
17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
18 #include "chrome/browser/signin/signin_manager_factory.h" 18 #include "chrome/browser/signin/signin_manager_factory.h"
19 #include "chrome/browser/signin/test_signin_client_builder.h" 19 #include "chrome/browser/signin/test_signin_client_builder.h"
20 #include "chrome/test/base/testing_browser_process.h" 20 #include "chrome/test/base/testing_browser_process.h"
21 #include "chrome/test/base/testing_profile.h" 21 #include "chrome/test/base/testing_profile.h"
22 #include "chrome/test/base/testing_profile_manager.h" 22 #include "chrome/test/base/testing_profile_manager.h"
23 #include "chrome/test/base/uma_histogram_helper.h"
23 #include "components/signin/core/browser/account_reconcilor.h" 24 #include "components/signin/core/browser/account_reconcilor.h"
24 #include "components/signin/core/browser/profile_oauth2_token_service.h" 25 #include "components/signin/core/browser/profile_oauth2_token_service.h"
25 #include "components/signin/core/browser/signin_manager.h" 26 #include "components/signin/core/browser/signin_manager.h"
26 #include "components/signin/core/common/profile_management_switches.h" 27 #include "components/signin/core/common/profile_management_switches.h"
27 #include "components/signin/core/common/signin_switches.h" 28 #include "components/signin/core/common/signin_switches.h"
28 #include "content/public/test/test_browser_thread_bundle.h" 29 #include "content/public/test/test_browser_thread_bundle.h"
29 #include "google_apis/gaia/gaia_urls.h" 30 #include "google_apis/gaia/gaia_urls.h"
30 #include "net/url_request/test_url_fetcher_factory.h" 31 #include "net/url_request/test_url_fetcher_factory.h"
31 #include "testing/gmock/include/gmock/gmock.h" 32 #include "testing/gmock/include/gmock/gmock.h"
32 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
33 34
34 namespace { 35 namespace {
35 36
36 const char kTestEmail[] = "user@gmail.com"; 37 const char kTestEmail[] = "user@gmail.com";
38 const char* const kHistogramsToSnapshot[] = {
39 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
40 "Signin.Reconciler.AddedToCookieJar.FirstRun",
41 "Signin.Reconciler.AddedToChrome.FirstRun",
42 "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun",
43 "Signin.Reconciler.AddedToCookieJar.SubsequentRun",
44 "Signin.Reconciler.AddedToChrome.SubsequentRun"};
37 45
38 class MockAccountReconcilor : public testing::StrictMock<AccountReconcilor> { 46 class MockAccountReconcilor : public testing::StrictMock<AccountReconcilor> {
39 public: 47 public:
40 static KeyedService* Build(content::BrowserContext* context); 48 static KeyedService* Build(content::BrowserContext* context);
41 49
42 MockAccountReconcilor(ProfileOAuth2TokenService* token_service, 50 MockAccountReconcilor(ProfileOAuth2TokenService* token_service,
43 SigninManagerBase* signin_manager, 51 SigninManagerBase* signin_manager,
44 SigninClient* client); 52 SigninClient* client);
45 virtual ~MockAccountReconcilor() {} 53 virtual ~MockAccountReconcilor() {}
46 54
(...skipping 23 matching lines...) Expand all
70 MockAccountReconcilor::MockAccountReconcilor( 78 MockAccountReconcilor::MockAccountReconcilor(
71 ProfileOAuth2TokenService* token_service, 79 ProfileOAuth2TokenService* token_service,
72 SigninManagerBase* signin_manager, 80 SigninManagerBase* signin_manager,
73 SigninClient* client) 81 SigninClient* client)
74 : testing::StrictMock<AccountReconcilor>(token_service, 82 : testing::StrictMock<AccountReconcilor>(token_service,
75 signin_manager, 83 signin_manager,
76 client) {} 84 client) {}
77 85
78 } // namespace 86 } // namespace
79 87
80 class AccountReconcilorTest : public testing::Test { 88 class AccountReconcilorTest : public ::testing::TestWithParam<bool> {
81 public: 89 public:
82 AccountReconcilorTest(); 90 AccountReconcilorTest();
83 virtual void SetUp() OVERRIDE; 91 virtual void SetUp() OVERRIDE;
84 92
85 TestingProfile* profile() { return profile_; } 93 TestingProfile* profile() { return profile_; }
86 FakeSigninManagerForTesting* signin_manager() { return signin_manager_; } 94 FakeSigninManagerForTesting* signin_manager() { return signin_manager_; }
87 FakeProfileOAuth2TokenService* token_service() { return token_service_; } 95 FakeProfileOAuth2TokenService* token_service() { return token_service_; }
96 UMAHistogramHelper* histogram_helper() { return &histogram_helper_; }
88 97
89 void SetFakeResponse(const std::string& url, 98 void SetFakeResponse(const std::string& url,
90 const std::string& data, 99 const std::string& data,
91 net::HttpStatusCode code, 100 net::HttpStatusCode code,
92 net::URLRequestStatus::Status status) { 101 net::URLRequestStatus::Status status) {
93 url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status); 102 url_fetcher_factory_.SetFakeResponse(GURL(url), data, code, status);
94 } 103 }
95 104
96 MockAccountReconcilor* GetMockReconcilor(); 105 MockAccountReconcilor* GetMockReconcilor();
97 106
98 void SimulateMergeSessionCompleted( 107 void SimulateMergeSessionCompleted(
99 MergeSessionHelper::Observer* observer, 108 MergeSessionHelper::Observer* observer,
100 const std::string& account_id, 109 const std::string& account_id,
101 const GoogleServiceAuthError& error); 110 const GoogleServiceAuthError& error);
102 111
103 void SimulateRefreshTokenFetched( 112 void SimulateRefreshTokenFetched(
104 AccountReconcilor* reconcilor, 113 AccountReconcilor* reconcilor,
105 const std::string& account_id, 114 const std::string& account_id,
106 const std::string& refresh_token); 115 const std::string& refresh_token);
107 116
108 private: 117 private:
109 content::TestBrowserThreadBundle bundle_; 118 content::TestBrowserThreadBundle bundle_;
110 TestingProfile* profile_; 119 TestingProfile* profile_;
111 FakeSigninManagerForTesting* signin_manager_; 120 FakeSigninManagerForTesting* signin_manager_;
112 FakeProfileOAuth2TokenService* token_service_; 121 FakeProfileOAuth2TokenService* token_service_;
113 MockAccountReconcilor* mock_reconcilor_; 122 MockAccountReconcilor* mock_reconcilor_;
114 net::FakeURLFetcherFactory url_fetcher_factory_; 123 net::FakeURLFetcherFactory url_fetcher_factory_;
115 scoped_ptr<TestingProfileManager> testing_profile_manager_; 124 scoped_ptr<TestingProfileManager> testing_profile_manager_;
125 UMAHistogramHelper histogram_helper_;
126
127 DISALLOW_COPY_AND_ASSIGN(AccountReconcilorTest);
116 }; 128 };
117 129
118 AccountReconcilorTest::AccountReconcilorTest() 130 AccountReconcilorTest::AccountReconcilorTest()
119 : signin_manager_(NULL), 131 : signin_manager_(NULL),
120 token_service_(NULL), 132 token_service_(NULL),
121 mock_reconcilor_(NULL), 133 mock_reconcilor_(NULL),
122 url_fetcher_factory_(NULL) {} 134 url_fetcher_factory_(NULL) {}
123 135
124 void AccountReconcilorTest::SetUp() { 136 void AccountReconcilorTest::SetUp() {
125 CommandLine::ForCurrentProcess()->AppendSwitch( 137 // If it's a non-parameterized test, or we have a parameter of true, set flag.
126 switches::kEnableNewProfileManagement); 138 if (!::testing::UnitTest::GetInstance()->current_test_info()->value_param() ||
139 GetParam()) {
140 CommandLine::ForCurrentProcess()->AppendSwitch(
141 switches::kEnableNewProfileManagement);
142 }
127 143
128 testing_profile_manager_.reset( 144 testing_profile_manager_.reset(
129 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); 145 new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
130 ASSERT_TRUE(testing_profile_manager_.get()->SetUp()); 146 ASSERT_TRUE(testing_profile_manager_.get()->SetUp());
131 147
132 TestingProfile::TestingFactories factories; 148 TestingProfile::TestingFactories factories;
133 factories.push_back(std::make_pair(ChromeSigninClientFactory::GetInstance(), 149 factories.push_back(std::make_pair(ChromeSigninClientFactory::GetInstance(),
134 signin::BuildTestSigninClient)); 150 signin::BuildTestSigninClient));
135 factories.push_back(std::make_pair( 151 factories.push_back(std::make_pair(
136 ProfileOAuth2TokenServiceFactory::GetInstance(), 152 ProfileOAuth2TokenServiceFactory::GetInstance(),
137 BuildFakeProfileOAuth2TokenService)); 153 BuildFakeProfileOAuth2TokenService));
138 factories.push_back(std::make_pair(SigninManagerFactory::GetInstance(), 154 factories.push_back(std::make_pair(SigninManagerFactory::GetInstance(),
139 FakeSigninManagerBase::Build)); 155 FakeSigninManagerBase::Build));
140 factories.push_back(std::make_pair(AccountReconcilorFactory::GetInstance(), 156 factories.push_back(std::make_pair(AccountReconcilorFactory::GetInstance(),
141 MockAccountReconcilor::Build)); 157 MockAccountReconcilor::Build));
142 158
143 profile_ = testing_profile_manager_.get()->CreateTestingProfile("name", 159 profile_ = testing_profile_manager_.get()->CreateTestingProfile("name",
144 scoped_ptr<PrefServiceSyncable>(), 160 scoped_ptr<PrefServiceSyncable>(),
145 base::UTF8ToUTF16("name"), 0, std::string(), 161 base::UTF8ToUTF16("name"), 0, std::string(),
146 factories); 162 factories);
147 163
148 signin_manager_ = 164 signin_manager_ =
149 static_cast<FakeSigninManagerForTesting*>( 165 static_cast<FakeSigninManagerForTesting*>(
150 SigninManagerFactory::GetForProfile(profile())); 166 SigninManagerFactory::GetForProfile(profile()));
151 167
152 token_service_ = 168 token_service_ =
153 static_cast<FakeProfileOAuth2TokenService*>( 169 static_cast<FakeProfileOAuth2TokenService*>(
154 ProfileOAuth2TokenServiceFactory::GetForProfile(profile())); 170 ProfileOAuth2TokenServiceFactory::GetForProfile(profile()));
171
172 // Take a new snapshot of the concerned histograms before each test
173 histogram_helper_.PrepareSnapshot(kHistogramsToSnapshot,
174 arraysize(kHistogramsToSnapshot));
155 } 175 }
156 176
157 MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() { 177 MockAccountReconcilor* AccountReconcilorTest::GetMockReconcilor() {
158 if (!mock_reconcilor_) { 178 if (!mock_reconcilor_) {
159 mock_reconcilor_ = 179 mock_reconcilor_ =
160 static_cast<MockAccountReconcilor*>( 180 static_cast<MockAccountReconcilor*>(
161 AccountReconcilorFactory::GetForProfile(profile())); 181 AccountReconcilorFactory::GetForProfile(profile()));
162 } 182 }
163 183
164 return mock_reconcilor_; 184 return mock_reconcilor_;
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 352
333 token_service()->IssueErrorForAllPendingRequests( 353 token_service()->IssueErrorForAllPendingRequests(
334 GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); 354 GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
335 355
336 base::RunLoop().RunUntilIdle(); 356 base::RunLoop().RunUntilIdle();
337 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 357 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
338 ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size()); 358 ASSERT_EQ(0u, reconcilor->GetValidChromeAccountsForTesting().size());
339 ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size()); 359 ASSERT_EQ(1u, reconcilor->GetInvalidChromeAccountsForTesting().size());
340 } 360 }
341 361
342 TEST_F(AccountReconcilorTest, StartReconcileNoop) { 362 TEST_P(AccountReconcilorTest, StartReconcileNoop) {
343 signin_manager()->SetAuthenticatedUsername(kTestEmail); 363 signin_manager()->SetAuthenticatedUsername(kTestEmail);
344 token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 364 token_service()->UpdateCredentials(kTestEmail, "refresh_token");
345 365
346 AccountReconcilor* reconcilor = 366 AccountReconcilor* reconcilor =
347 AccountReconcilorFactory::GetForProfile(profile()); 367 AccountReconcilorFactory::GetForProfile(profile());
348 ASSERT_TRUE(reconcilor); 368 ASSERT_TRUE(reconcilor);
349 369
350 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 370 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
351 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 371 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
352 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 372 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
353 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(), 373 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(),
354 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 374 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
355 375
356 reconcilor->StartReconcile(); 376 reconcilor->StartReconcile();
357 ASSERT_FALSE(reconcilor->AreGaiaAccountsSet()); 377 ASSERT_FALSE(reconcilor->AreGaiaAccountsSet());
358 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 378 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
359 379
360 base::RunLoop().RunUntilIdle(); 380 base::RunLoop().RunUntilIdle();
361 ASSERT_TRUE(reconcilor->AreGaiaAccountsSet()); 381 ASSERT_TRUE(reconcilor->AreGaiaAccountsSet());
362 ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size()); 382 ASSERT_EQ(1u, reconcilor->GetGaiaAccountsForTesting().size());
363 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 383 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
364 384
365 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 385 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
366 base::Time::Now() + base::TimeDelta::FromHours(1)); 386 base::Time::Now() + base::TimeDelta::FromHours(1));
367 387
368 base::RunLoop().RunUntilIdle(); 388 base::RunLoop().RunUntilIdle();
369 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 389 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
370 ASSERT_FALSE(reconcilor->is_reconcile_started_); 390 ASSERT_FALSE(reconcilor->is_reconcile_started_);
391
392 histogram_helper()->Fetch();
393 histogram_helper()->ExpectTotalCount(
394 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
395 histogram_helper()->ExpectUniqueSample(
396 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
371 } 397 }
372 398
373 // This is test is needed until chrome changes to use gaia obfuscated id. 399 // This is test is needed until chrome changes to use gaia obfuscated id.
374 // The signin manager and token service use the gaia "email" property, which 400 // The signin manager and token service use the gaia "email" property, which
375 // preserves dots in usernames and preserves case. gaia::ParseListAccountsData() 401 // preserves dots in usernames and preserves case. gaia::ParseListAccountsData()
376 // however uses gaia "displayEmail" which does not preserve case, and then 402 // however uses gaia "displayEmail" which does not preserve case, and then
377 // passes the string through gaia::CanonicalizeEmail() which removes dots. This 403 // passes the string through gaia::CanonicalizeEmail() which removes dots. This
378 // tests makes sure that an email like "Dot.S@hmail.com", as seen by the 404 // tests makes sure that an email like "Dot.S@hmail.com", as seen by the
379 // token service, will be considered the same as "dots@gmail.com" as returned 405 // token service, will be considered the same as "dots@gmail.com" as returned
380 // by gaia::ParseListAccountsData(). 406 // by gaia::ParseListAccountsData().
381 TEST_F(AccountReconcilorTest, StartReconcileNoopWithDots) { 407 TEST_P(AccountReconcilorTest, StartReconcileNoopWithDots) {
382 signin_manager()->SetAuthenticatedUsername("Dot.S@gmail.com"); 408 signin_manager()->SetAuthenticatedUsername("Dot.S@gmail.com");
383 token_service()->UpdateCredentials("Dot.S@gmail.com", "refresh_token"); 409 token_service()->UpdateCredentials("Dot.S@gmail.com", "refresh_token");
384 410
385 AccountReconcilor* reconcilor = 411 AccountReconcilor* reconcilor =
386 AccountReconcilorFactory::GetForProfile(profile()); 412 AccountReconcilorFactory::GetForProfile(profile());
387 ASSERT_TRUE(reconcilor); 413 ASSERT_TRUE(reconcilor);
388 414
389 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 415 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
390 "[\"f\", [[\"b\", 0, \"n\", \"dot.s@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 416 "[\"f\", [[\"b\", 0, \"n\", \"dot.s@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
391 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 417 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
(...skipping 10 matching lines...) Expand all
402 ASSERT_STREQ("dots@gmail.com", 428 ASSERT_STREQ("dots@gmail.com",
403 reconcilor->GetGaiaAccountsForTesting()[0].first.c_str()); 429 reconcilor->GetGaiaAccountsForTesting()[0].first.c_str());
404 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 430 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
405 431
406 token_service()->IssueAllTokensForAccount("Dot.S@gmail.com", "access_token", 432 token_service()->IssueAllTokensForAccount("Dot.S@gmail.com", "access_token",
407 base::Time::Now() + base::TimeDelta::FromHours(1)); 433 base::Time::Now() + base::TimeDelta::FromHours(1));
408 434
409 base::RunLoop().RunUntilIdle(); 435 base::RunLoop().RunUntilIdle();
410 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 436 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
411 ASSERT_FALSE(reconcilor->is_reconcile_started_); 437 ASSERT_FALSE(reconcilor->is_reconcile_started_);
438
439 histogram_helper()->Fetch();
440 histogram_helper()->ExpectUniqueSample(
441 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
412 } 442 }
413 443
414 TEST_F(AccountReconcilorTest, StartReconcileNoopMultiple) { 444 TEST_P(AccountReconcilorTest, StartReconcileNoopMultiple) {
415 signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 445 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
416 token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 446 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
417 token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 447 token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
418 448
419 AccountReconcilor* reconcilor = 449 AccountReconcilor* reconcilor =
420 AccountReconcilorFactory::GetForProfile(profile()); 450 AccountReconcilorFactory::GetForProfile(profile());
421 ASSERT_TRUE(reconcilor); 451 ASSERT_TRUE(reconcilor);
422 452
423 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 453 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
424 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 454 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
(...skipping 16 matching lines...) Expand all
441 471
442 base::RunLoop().RunUntilIdle(); 472 base::RunLoop().RunUntilIdle();
443 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked()); 473 ASSERT_FALSE(reconcilor->AreAllRefreshTokensChecked());
444 474
445 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 475 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
446 base::Time::Now() + base::TimeDelta::FromHours(1)); 476 base::Time::Now() + base::TimeDelta::FromHours(1));
447 477
448 base::RunLoop().RunUntilIdle(); 478 base::RunLoop().RunUntilIdle();
449 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked()); 479 ASSERT_TRUE(reconcilor->AreAllRefreshTokensChecked());
450 ASSERT_FALSE(reconcilor->is_reconcile_started_); 480 ASSERT_FALSE(reconcilor->is_reconcile_started_);
481
482 histogram_helper()->Fetch();
483 histogram_helper()->ExpectTotalCount(
484 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
485 histogram_helper()->ExpectUniqueSample(
486 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
451 } 487 }
452 488
453 TEST_F(AccountReconcilorTest, StartReconcileAddToCookie) { 489 TEST_P(AccountReconcilorTest, StartReconcileAddToCookie) {
454 signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 490 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
455 token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 491 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
456 token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 492 token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
457 493
458 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 494 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
459 495
460 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 496 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
461 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 497 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
462 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 498 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
463 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(), 499 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(),
464 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 500 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
465 501
466 AccountReconcilor* reconcilor = GetMockReconcilor(); 502 AccountReconcilor* reconcilor = GetMockReconcilor();
467 reconcilor->StartReconcile(); 503 reconcilor->StartReconcile();
468 token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 504 token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
469 base::Time::Now() + base::TimeDelta::FromHours(1)); 505 base::Time::Now() + base::TimeDelta::FromHours(1));
470 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 506 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
471 base::Time::Now() + base::TimeDelta::FromHours(1)); 507 base::Time::Now() + base::TimeDelta::FromHours(1));
472 508
473 base::RunLoop().RunUntilIdle(); 509 base::RunLoop().RunUntilIdle();
474 ASSERT_TRUE(reconcilor->is_reconcile_started_); 510 ASSERT_TRUE(reconcilor->is_reconcile_started_);
475 SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 511 SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
476 GoogleServiceAuthError::AuthErrorNone()); 512 GoogleServiceAuthError::AuthErrorNone());
477 ASSERT_FALSE(reconcilor->is_reconcile_started_); 513 ASSERT_FALSE(reconcilor->is_reconcile_started_);
514
515 histogram_helper()->Fetch();
516 histogram_helper()->ExpectUniqueSample(
517 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
518 histogram_helper()->ExpectUniqueSample(
519 "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
520 histogram_helper()->ExpectUniqueSample(
521 "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
478 } 522 }
479 523
480 TEST_F(AccountReconcilorTest, StartReconcileAddToChrome) { 524 TEST_P(AccountReconcilorTest, StartReconcileAddToCookieTwice) {
525 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
526 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
527 token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
528
529 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
530 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("third@gmail.com"));
531
532 SetFakeResponse(
533 GaiaUrls::GetInstance()->list_accounts_url().spec(),
534 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
535 net::HTTP_OK,
536 net::URLRequestStatus::SUCCESS);
537 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(),
538 "{\"id\":\"foo\"}",
539 net::HTTP_OK,
540 net::URLRequestStatus::SUCCESS);
541
542 AccountReconcilor* reconcilor = GetMockReconcilor();
543 reconcilor->StartReconcile();
544 token_service()->IssueAllTokensForAccount(
545 "other@gmail.com",
546 "access_token",
547 base::Time::Now() + base::TimeDelta::FromHours(1));
548 token_service()->IssueAllTokensForAccount(
549 "user@gmail.com",
550 "access_token",
551 base::Time::Now() + base::TimeDelta::FromHours(1));
552
553 base::RunLoop().RunUntilIdle();
554 ASSERT_TRUE(reconcilor->is_reconcile_started_);
555 SimulateMergeSessionCompleted(
556 reconcilor, "other@gmail.com", GoogleServiceAuthError::AuthErrorNone());
557 ASSERT_FALSE(reconcilor->is_reconcile_started_);
558
559 histogram_helper()->Fetch();
560 histogram_helper()->ExpectUniqueSample(
561 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
562 histogram_helper()->ExpectUniqueSample(
563 "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
564 histogram_helper()->ExpectUniqueSample(
565 "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
566
567 // Do another pass after I've added a third account to the token service
568
569 SetFakeResponse(
570 GaiaUrls::GetInstance()->list_accounts_url().spec(),
571 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
572 "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
573 net::HTTP_OK,
574 net::URLRequestStatus::SUCCESS);
575 // This will cause the reconcilor to fire.
576 token_service()->UpdateCredentials("third@gmail.com", "refresh_token");
577
578 token_service()->IssueAllTokensForAccount(
579 "other@gmail.com",
580 "access_token",
581 base::Time::Now() + base::TimeDelta::FromHours(1));
582 token_service()->IssueAllTokensForAccount(
583 "user@gmail.com",
584 "access_token",
585 base::Time::Now() + base::TimeDelta::FromHours(1));
586 token_service()->IssueAllTokensForAccount(
587 "third@gmail.com",
588 "access_token",
589 base::Time::Now() + base::TimeDelta::FromHours(1));
590
591 base::RunLoop().RunUntilIdle();
592
593 ASSERT_TRUE(reconcilor->is_reconcile_started_);
594 SimulateMergeSessionCompleted(
595 reconcilor, "third@gmail.com", GoogleServiceAuthError::AuthErrorNone());
596 ASSERT_FALSE(reconcilor->is_reconcile_started_);
597
598 histogram_helper()->Fetch();
599 histogram_helper()->ExpectUniqueSample(
600 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
601 histogram_helper()->ExpectUniqueSample(
602 "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
603 histogram_helper()->ExpectUniqueSample(
604 "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
605 histogram_helper()->ExpectUniqueSample(
606 "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun", 0, 1);
607 histogram_helper()->ExpectUniqueSample(
608 "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 1, 1);
609 histogram_helper()->ExpectUniqueSample(
610 "Signin.Reconciler.AddedToChrome.SubsequentRun", 0, 1);
611 }
612
613 TEST_P(AccountReconcilorTest, StartReconcileAddToChrome) {
481 signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 614 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
482 token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 615 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
483 616
484 EXPECT_CALL(*GetMockReconcilor(), 617 EXPECT_CALL(*GetMockReconcilor(),
485 PerformAddToChromeAction("other@gmail.com", 1)); 618 PerformAddToChromeAction("other@gmail.com", 1));
486 619
487 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 620 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
488 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 621 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
489 "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 622 "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
490 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 623 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
491 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(), 624 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(),
492 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 625 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
493 626
494 AccountReconcilor* reconcilor = GetMockReconcilor(); 627 AccountReconcilor* reconcilor = GetMockReconcilor();
495 reconcilor->StartReconcile(); 628 reconcilor->StartReconcile();
496 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 629 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
497 base::Time::Now() + base::TimeDelta::FromHours(1)); 630 base::Time::Now() + base::TimeDelta::FromHours(1));
498 631
499 base::RunLoop().RunUntilIdle(); 632 base::RunLoop().RunUntilIdle();
500 ASSERT_TRUE(reconcilor->is_reconcile_started_); 633 ASSERT_TRUE(reconcilor->is_reconcile_started_);
501 SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", ""); 634 SimulateRefreshTokenFetched(reconcilor, "other@gmail.com", "");
502 ASSERT_FALSE(reconcilor->is_reconcile_started_); 635 ASSERT_FALSE(reconcilor->is_reconcile_started_);
636
637 histogram_helper()->Fetch();
638 histogram_helper()->ExpectUniqueSample(
639 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 0, 1);
640 histogram_helper()->ExpectUniqueSample(
641 "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1);
642 histogram_helper()->ExpectUniqueSample(
643 "Signin.Reconciler.AddedToChrome.FirstRun", 1, 1);
503 } 644 }
504 645
505 TEST_F(AccountReconcilorTest, StartReconcileBadPrimary) { 646 TEST_P(AccountReconcilorTest, StartReconcileBadPrimary) {
506 signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 647 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
507 token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 648 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
508 token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 649 token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
509 650
510 EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); 651 EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
511 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 652 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
512 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com")); 653 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("other@gmail.com"));
513 654
514 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 655 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
515 "[\"f\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1], " 656 "[\"f\", [[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1], "
(...skipping 10 matching lines...) Expand all
526 base::Time::Now() + base::TimeDelta::FromHours(1)); 667 base::Time::Now() + base::TimeDelta::FromHours(1));
527 668
528 base::RunLoop().RunUntilIdle(); 669 base::RunLoop().RunUntilIdle();
529 ASSERT_TRUE(reconcilor->is_reconcile_started_); 670 ASSERT_TRUE(reconcilor->is_reconcile_started_);
530 SimulateMergeSessionCompleted(reconcilor, "other@gmail.com", 671 SimulateMergeSessionCompleted(reconcilor, "other@gmail.com",
531 GoogleServiceAuthError::AuthErrorNone()); 672 GoogleServiceAuthError::AuthErrorNone());
532 ASSERT_TRUE(reconcilor->is_reconcile_started_); 673 ASSERT_TRUE(reconcilor->is_reconcile_started_);
533 SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 674 SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
534 GoogleServiceAuthError::AuthErrorNone()); 675 GoogleServiceAuthError::AuthErrorNone());
535 ASSERT_FALSE(reconcilor->is_reconcile_started_); 676 ASSERT_FALSE(reconcilor->is_reconcile_started_);
677
678 histogram_helper()->Fetch();
679 histogram_helper()->ExpectUniqueSample(
680 "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1, 1);
681 histogram_helper()->ExpectUniqueSample(
682 "Signin.Reconciler.AddedToCookieJar.FirstRun", 2, 1);
683 histogram_helper()->ExpectUniqueSample(
684 "Signin.Reconciler.AddedToChrome.FirstRun", 0, 1);
536 } 685 }
537 686
538 TEST_F(AccountReconcilorTest, StartReconcileOnlyOnce) { 687 TEST_P(AccountReconcilorTest, StartReconcileOnlyOnce) {
539 signin_manager()->SetAuthenticatedUsername(kTestEmail); 688 signin_manager()->SetAuthenticatedUsername(kTestEmail);
540 token_service()->UpdateCredentials(kTestEmail, "refresh_token"); 689 token_service()->UpdateCredentials(kTestEmail, "refresh_token");
541 690
542 AccountReconcilor* reconcilor = 691 AccountReconcilor* reconcilor =
543 AccountReconcilorFactory::GetForProfile(profile()); 692 AccountReconcilorFactory::GetForProfile(profile());
544 ASSERT_TRUE(reconcilor); 693 ASSERT_TRUE(reconcilor);
545 694
546 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 695 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
547 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 696 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
548 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 697 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
549 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(), 698 SetFakeResponse(GaiaUrls::GetInstance()->people_get_url().spec(),
550 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS); 699 "{\"id\":\"foo\"}", net::HTTP_OK, net::URLRequestStatus::SUCCESS);
551 700
552 ASSERT_FALSE(reconcilor->is_reconcile_started_); 701 ASSERT_FALSE(reconcilor->is_reconcile_started_);
553 reconcilor->StartReconcile(); 702 reconcilor->StartReconcile();
554 ASSERT_TRUE(reconcilor->is_reconcile_started_); 703 ASSERT_TRUE(reconcilor->is_reconcile_started_);
555 704
556 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 705 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
557 base::Time::Now() + base::TimeDelta::FromHours(1)); 706 base::Time::Now() + base::TimeDelta::FromHours(1));
558 707
559 base::RunLoop().RunUntilIdle(); 708 base::RunLoop().RunUntilIdle();
560 ASSERT_FALSE(reconcilor->is_reconcile_started_); 709 ASSERT_FALSE(reconcilor->is_reconcile_started_);
561 } 710 }
562 711
563 TEST_F(AccountReconcilorTest, StartReconcileWithSessionInfoExpiredDefault) { 712 TEST_P(AccountReconcilorTest, StartReconcileWithSessionInfoExpiredDefault) {
564 signin_manager()->SetAuthenticatedUsername("user@gmail.com"); 713 signin_manager()->SetAuthenticatedUsername("user@gmail.com");
565 token_service()->UpdateCredentials("user@gmail.com", "refresh_token"); 714 token_service()->UpdateCredentials("user@gmail.com", "refresh_token");
566 token_service()->UpdateCredentials("other@gmail.com", "refresh_token"); 715 token_service()->UpdateCredentials("other@gmail.com", "refresh_token");
567 716
568 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com")); 717 EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction("user@gmail.com"));
569 718
570 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(), 719 SetFakeResponse(GaiaUrls::GetInstance()->list_accounts_url().spec(),
571 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0]," 720 "[\"f\", [[\"b\", 0, \"n\", \"user@gmail.com\", \"p\", 0, 0, 0, 0, 0],"
572 "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]", 721 "[\"b\", 0, \"n\", \"other@gmail.com\", \"p\", 0, 0, 0, 0, 1]]]",
573 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 722 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
(...skipping 11 matching lines...) Expand all
585 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token", 734 token_service()->IssueAllTokensForAccount("user@gmail.com", "access_token",
586 base::Time::Now() + base::TimeDelta::FromHours(1)); 735 base::Time::Now() + base::TimeDelta::FromHours(1));
587 token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token", 736 token_service()->IssueAllTokensForAccount("other@gmail.com", "access_token",
588 base::Time::Now() + base::TimeDelta::FromHours(1)); 737 base::Time::Now() + base::TimeDelta::FromHours(1));
589 738
590 base::RunLoop().RunUntilIdle(); 739 base::RunLoop().RunUntilIdle();
591 SimulateMergeSessionCompleted(reconcilor, "user@gmail.com", 740 SimulateMergeSessionCompleted(reconcilor, "user@gmail.com",
592 GoogleServiceAuthError::AuthErrorNone()); 741 GoogleServiceAuthError::AuthErrorNone());
593 ASSERT_FALSE(reconcilor->is_reconcile_started_); 742 ASSERT_FALSE(reconcilor->is_reconcile_started_);
594 } 743 }
744
745 INSTANTIATE_TEST_CASE_P(AccountReconcilorMaybeEnabled,
746 AccountReconcilorTest,
747 testing::Bool());
OLDNEW
« no previous file with comments | « base/test/statistics_delta_reader.h ('k') | chrome/test/base/uma_histogram_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698