| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/engagement/site_engagement_service.h" | 5 #include "chrome/browser/engagement/site_engagement_service.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 147 |
| 148 class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness { | 148 class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness { |
| 149 public: | 149 public: |
| 150 void SetUp() override { | 150 void SetUp() override { |
| 151 ChromeRenderViewHostTestHarness::SetUp(); | 151 ChromeRenderViewHostTestHarness::SetUp(); |
| 152 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 152 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 153 g_temp_history_dir = temp_dir_.GetPath(); | 153 g_temp_history_dir = temp_dir_.GetPath(); |
| 154 HistoryServiceFactory::GetInstance()->SetTestingFactory( | 154 HistoryServiceFactory::GetInstance()->SetTestingFactory( |
| 155 profile(), &BuildTestHistoryService); | 155 profile(), &BuildTestHistoryService); |
| 156 SiteEngagementScore::SetParamValuesForTesting(); | 156 SiteEngagementScore::SetParamValuesForTesting(); |
| 157 clock_ = new base::SimpleTestClock(); |
| 158 service_ = base::WrapUnique( |
| 159 new SiteEngagementService(profile(), base::WrapUnique(clock_))); |
| 160 } |
| 161 |
| 162 void TearDown() override { |
| 163 service_->Shutdown(); |
| 164 service_.reset(); |
| 165 ChromeRenderViewHostTestHarness::TearDown(); |
| 157 } | 166 } |
| 158 | 167 |
| 159 void NavigateWithTransitionAndExpectHigherScore( | 168 void NavigateWithTransitionAndExpectHigherScore( |
| 160 SiteEngagementService* service, | 169 SiteEngagementService* service, |
| 161 const GURL& url, | 170 const GURL& url, |
| 162 ui::PageTransition transition) { | 171 ui::PageTransition transition) { |
| 163 double prev_score = service->GetScore(url); | 172 double prev_score = service->GetScore(url); |
| 164 controller().LoadURL(url, content::Referrer(), transition, std::string()); | 173 controller().LoadURL(url, content::Referrer(), transition, std::string()); |
| 165 int pending_id = controller().GetPendingEntry()->GetUniqueID(); | 174 int pending_id = controller().GetPendingEntry()->GetUniqueID(); |
| 166 content::WebContentsTester::For(web_contents()) | 175 content::WebContentsTester::For(web_contents()) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 base::RunLoop run_loop; | 207 base::RunLoop run_loop; |
| 199 content::BrowserThread::PostTaskAndReply( | 208 content::BrowserThread::PostTaskAndReply( |
| 200 thread_id, FROM_HERE, | 209 thread_id, FROM_HERE, |
| 201 base::Bind(&SiteEngagementServiceTest::CheckScoreFromSettings, | 210 base::Bind(&SiteEngagementServiceTest::CheckScoreFromSettings, |
| 202 base::Unretained(this), settings_map, url, &score), | 211 base::Unretained(this), settings_map, url, &score), |
| 203 run_loop.QuitClosure()); | 212 run_loop.QuitClosure()); |
| 204 run_loop.Run(); | 213 run_loop.Run(); |
| 205 return score; | 214 return score; |
| 206 } | 215 } |
| 207 | 216 |
| 208 private: | 217 protected: |
| 209 void CheckScoreFromSettings(HostContentSettingsMap* settings_map, | 218 void CheckScoreFromSettings(HostContentSettingsMap* settings_map, |
| 210 const GURL& url, | 219 const GURL& url, |
| 211 double *score) { | 220 double *score) { |
| 212 *score = SiteEngagementService::GetScoreFromSettings(settings_map, url); | 221 *score = SiteEngagementService::GetScoreFromSettings(settings_map, url); |
| 213 } | 222 } |
| 214 | 223 |
| 215 base::ScopedTempDir temp_dir_; | 224 base::ScopedTempDir temp_dir_; |
| 225 std::unique_ptr<SiteEngagementService> service_; |
| 226 base::SimpleTestClock* clock_ = nullptr; // Owned by the service. |
| 216 }; | 227 }; |
| 217 | 228 |
| 218 TEST_F(SiteEngagementServiceTest, GetMedianEngagement) { | 229 TEST_F(SiteEngagementServiceTest, GetMedianEngagement) { |
| 219 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 230 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 220 ASSERT_TRUE(service); | 231 ASSERT_TRUE(service); |
| 221 | 232 |
| 222 GURL url1("http://www.google.com/"); | 233 GURL url1("http://www.google.com/"); |
| 223 GURL url2("https://www.google.com/"); | 234 GURL url2("https://www.google.com/"); |
| 224 GURL url3("https://drive.google.com/"); | 235 GURL url3("https://drive.google.com/"); |
| 225 GURL url4("https://maps.google.com/"); | 236 GURL url4("https://maps.google.com/"); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 service->HandleMediaPlaying(web_contents(), true); | 425 service->HandleMediaPlaying(web_contents(), true); |
| 415 EXPECT_EQ(0, service->GetScore(url3)); | 426 EXPECT_EQ(0, service->GetScore(url3)); |
| 416 | 427 |
| 417 NavigateAndCommit(url4); | 428 NavigateAndCommit(url4); |
| 418 service->HandleUserInput(web_contents(), | 429 service->HandleUserInput(web_contents(), |
| 419 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); | 430 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
| 420 EXPECT_EQ(0, service->GetScore(url4)); | 431 EXPECT_EQ(0, service->GetScore(url4)); |
| 421 } | 432 } |
| 422 | 433 |
| 423 TEST_F(SiteEngagementServiceTest, LastShortcutLaunch) { | 434 TEST_F(SiteEngagementServiceTest, LastShortcutLaunch) { |
| 424 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 425 std::unique_ptr<SiteEngagementService> service( | |
| 426 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 427 | |
| 428 base::HistogramTester histograms; | 435 base::HistogramTester histograms; |
| 429 | 436 |
| 430 base::Time current_day = GetReferenceTime(); | 437 base::Time current_day = GetReferenceTime(); |
| 431 clock->SetNow(current_day - base::TimeDelta::FromDays(5)); | 438 clock_->SetNow(current_day - base::TimeDelta::FromDays(5)); |
| 432 | 439 |
| 433 // The https and http versions of www.google.com should be separate. But | 440 // The https and http versions of www.google.com should be separate. But |
| 434 // different paths on the same origin should be treated the same. | 441 // different paths on the same origin should be treated the same. |
| 435 GURL url1("https://www.google.com/"); | 442 GURL url1("https://www.google.com/"); |
| 436 GURL url2("http://www.google.com/"); | 443 GURL url2("http://www.google.com/"); |
| 437 GURL url3("http://www.google.com/maps"); | 444 GURL url3("http://www.google.com/maps"); |
| 438 | 445 |
| 439 EXPECT_EQ(0, service->GetScore(url1)); | 446 EXPECT_EQ(0, service_->GetScore(url1)); |
| 440 EXPECT_EQ(0, service->GetScore(url2)); | 447 EXPECT_EQ(0, service_->GetScore(url2)); |
| 441 EXPECT_EQ(0, service->GetScore(url3)); | 448 EXPECT_EQ(0, service_->GetScore(url3)); |
| 442 | 449 |
| 443 service->SetLastShortcutLaunchTime(url2); | 450 service_->SetLastShortcutLaunchTime(url2); |
| 444 histograms.ExpectTotalCount( | 451 histograms.ExpectTotalCount( |
| 445 SiteEngagementMetrics::kDaysSinceLastShortcutLaunchHistogram, 0); | 452 SiteEngagementMetrics::kDaysSinceLastShortcutLaunchHistogram, 0); |
| 446 histograms.ExpectUniqueSample( | 453 histograms.ExpectUniqueSample( |
| 447 SiteEngagementMetrics::kEngagementTypeHistogram, | 454 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 448 SiteEngagementMetrics::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH, 1); | 455 SiteEngagementMetrics::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH, 1); |
| 449 | 456 |
| 450 service->AddPoints(url1, 2.0); | 457 service_->AddPoints(url1, 2.0); |
| 451 service->AddPoints(url2, 2.0); | 458 service_->AddPoints(url2, 2.0); |
| 452 clock->SetNow(current_day); | 459 clock_->SetNow(current_day); |
| 453 service->SetLastShortcutLaunchTime(url2); | 460 service_->SetLastShortcutLaunchTime(url2); |
| 454 | 461 |
| 455 histograms.ExpectTotalCount( | 462 histograms.ExpectTotalCount( |
| 456 SiteEngagementMetrics::kDaysSinceLastShortcutLaunchHistogram, 1); | 463 SiteEngagementMetrics::kDaysSinceLastShortcutLaunchHistogram, 1); |
| 457 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 464 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 458 4); | 465 4); |
| 459 histograms.ExpectBucketCount( | 466 histograms.ExpectBucketCount( |
| 460 SiteEngagementMetrics::kEngagementTypeHistogram, | 467 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 461 SiteEngagementMetrics::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH, 2); | 468 SiteEngagementMetrics::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH, 2); |
| 462 histograms.ExpectBucketCount( | 469 histograms.ExpectBucketCount( |
| 463 SiteEngagementMetrics::kEngagementTypeHistogram, | 470 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 464 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); | 471 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); |
| 465 | 472 |
| 466 EXPECT_DOUBLE_EQ(2.0, service->GetScore(url1)); | 473 EXPECT_DOUBLE_EQ(2.0, service_->GetScore(url1)); |
| 467 EXPECT_DOUBLE_EQ(7.0, service->GetScore(url2)); | 474 EXPECT_DOUBLE_EQ(7.0, service_->GetScore(url2)); |
| 468 | 475 |
| 469 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(1)); | 476 clock_->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(1)); |
| 470 EXPECT_DOUBLE_EQ(2.0, service->GetScore(url1)); | 477 EXPECT_DOUBLE_EQ(2.0, service_->GetScore(url1)); |
| 471 EXPECT_DOUBLE_EQ(7.0, service->GetScore(url2)); | 478 EXPECT_DOUBLE_EQ(7.0, service_->GetScore(url2)); |
| 472 | 479 |
| 473 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(7)); | 480 clock_->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(7)); |
| 474 EXPECT_DOUBLE_EQ(0.0, service->GetScore(url1)); | 481 EXPECT_DOUBLE_EQ(0.0, service_->GetScore(url1)); |
| 475 EXPECT_DOUBLE_EQ(5.0, service->GetScore(url2)); | 482 EXPECT_DOUBLE_EQ(5.0, service_->GetScore(url2)); |
| 476 | 483 |
| 477 service->AddPoints(url1, 1.0); | 484 service_->AddPoints(url1, 1.0); |
| 478 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(10)); | 485 clock_->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(10)); |
| 479 EXPECT_DOUBLE_EQ(1.0, service->GetScore(url1)); | 486 EXPECT_DOUBLE_EQ(1.0, service_->GetScore(url1)); |
| 480 EXPECT_DOUBLE_EQ(5.0, service->GetScore(url2)); | 487 EXPECT_DOUBLE_EQ(5.0, service_->GetScore(url2)); |
| 481 | 488 |
| 482 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(11)); | 489 clock_->SetNow(GetReferenceTime() + base::TimeDelta::FromDays(11)); |
| 483 EXPECT_DOUBLE_EQ(1.0, service->GetScore(url1)); | 490 EXPECT_DOUBLE_EQ(1.0, service_->GetScore(url1)); |
| 484 EXPECT_DOUBLE_EQ(0.0, service->GetScore(url2)); | 491 EXPECT_DOUBLE_EQ(0.0, service_->GetScore(url2)); |
| 485 } | 492 } |
| 486 | 493 |
| 487 TEST_F(SiteEngagementServiceTest, NotificationPermission) { | 494 TEST_F(SiteEngagementServiceTest, NotificationPermission) { |
| 488 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 489 std::unique_ptr<SiteEngagementService> service( | |
| 490 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 491 | |
| 492 GURL url1("https://www.google.com/"); | 495 GURL url1("https://www.google.com/"); |
| 493 GURL url2("http://www.google.com/"); | 496 GURL url2("http://www.google.com/"); |
| 494 GURL url3("https://drive.google.com/"); | 497 GURL url3("https://drive.google.com/"); |
| 495 clock->SetNow(GetReferenceTime()); | 498 clock_->SetNow(GetReferenceTime()); |
| 496 | 499 |
| 497 EXPECT_EQ(0, service->GetScore(url1)); | 500 EXPECT_EQ(0, service_->GetScore(url1)); |
| 498 EXPECT_EQ(0, service->GetScore(url2)); | 501 EXPECT_EQ(0, service_->GetScore(url2)); |
| 499 EXPECT_EQ(0, service->GetScore(url3)); | 502 EXPECT_EQ(0, service_->GetScore(url3)); |
| 500 | 503 |
| 501 HostContentSettingsMap* settings_map = | 504 HostContentSettingsMap* settings_map = |
| 502 HostContentSettingsMapFactory::GetForProfile(profile()); | 505 HostContentSettingsMapFactory::GetForProfile(profile()); |
| 503 | 506 |
| 504 settings_map->SetContentSettingDefaultScope( | 507 settings_map->SetContentSettingDefaultScope( |
| 505 url1, url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), | 508 url1, url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), |
| 506 CONTENT_SETTING_ALLOW); | 509 CONTENT_SETTING_ALLOW); |
| 507 | 510 |
| 508 settings_map->SetContentSettingDefaultScope( | 511 settings_map->SetContentSettingDefaultScope( |
| 509 url2, url2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), | 512 url2, url2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), |
| 510 CONTENT_SETTING_BLOCK); | 513 CONTENT_SETTING_BLOCK); |
| 511 | 514 |
| 512 settings_map->SetContentSettingDefaultScope( | 515 settings_map->SetContentSettingDefaultScope( |
| 513 url3, url3, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), | 516 url3, url3, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), |
| 514 CONTENT_SETTING_ASK); | 517 CONTENT_SETTING_ASK); |
| 515 | 518 |
| 516 EXPECT_EQ(5, service->GetScore(url1)); | 519 EXPECT_EQ(5, service_->GetScore(url1)); |
| 517 EXPECT_EQ(0, service->GetScore(url2)); | 520 EXPECT_EQ(0, service_->GetScore(url2)); |
| 518 EXPECT_EQ(0, service->GetScore(url3)); | 521 EXPECT_EQ(0, service_->GetScore(url3)); |
| 519 | 522 |
| 520 service->AddPoints(url1, 1.0); | 523 service_->AddPoints(url1, 1.0); |
| 521 service->AddPoints(url2, 3.0); | 524 service_->AddPoints(url2, 3.0); |
| 522 EXPECT_EQ(6, service->GetScore(url1)); | 525 EXPECT_EQ(6, service_->GetScore(url1)); |
| 523 EXPECT_EQ(3, service->GetScore(url2)); | 526 EXPECT_EQ(3, service_->GetScore(url2)); |
| 524 | 527 |
| 525 settings_map->SetContentSettingDefaultScope( | 528 settings_map->SetContentSettingDefaultScope( |
| 526 url1, url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), | 529 url1, url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string(), |
| 527 CONTENT_SETTING_BLOCK); | 530 CONTENT_SETTING_BLOCK); |
| 528 | 531 |
| 529 EXPECT_EQ(1, service->GetScore(url1)); | 532 EXPECT_EQ(1, service_->GetScore(url1)); |
| 530 } | 533 } |
| 531 | 534 |
| 532 TEST_F(SiteEngagementServiceTest, CheckHistograms) { | 535 TEST_F(SiteEngagementServiceTest, CheckHistograms) { |
| 533 base::HistogramTester histograms; | 536 base::HistogramTester histograms; |
| 534 | 537 |
| 535 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 536 std::unique_ptr<SiteEngagementService> service( | |
| 537 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 538 | |
| 539 base::Time current_day = GetReferenceTime(); | 538 base::Time current_day = GetReferenceTime(); |
| 540 clock->SetNow(current_day); | 539 clock_->SetNow(current_day); |
| 541 | 540 |
| 542 // Histograms should start empty as the testing SiteEngagementService | 541 // Histograms should start empty as the testing SiteEngagementService |
| 543 // constructor does not record metrics. | 542 // constructor does not record metrics. |
| 544 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, | 543 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, |
| 545 0); | 544 0); |
| 546 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0); | 545 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0); |
| 547 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, | 546 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, |
| 548 0); | 547 0); |
| 549 histograms.ExpectTotalCount(SiteEngagementMetrics::kMedianEngagementHistogram, | 548 histograms.ExpectTotalCount(SiteEngagementMetrics::kMedianEngagementHistogram, |
| 550 0); | 549 0); |
| 551 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementScoreHistogram, | 550 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementScoreHistogram, |
| 552 0); | 551 0); |
| 553 histograms.ExpectTotalCount( | 552 histograms.ExpectTotalCount( |
| 554 SiteEngagementMetrics::kEngagementScoreHistogramHTTP, 0); | 553 SiteEngagementMetrics::kEngagementScoreHistogramHTTP, 0); |
| 555 histograms.ExpectTotalCount( | 554 histograms.ExpectTotalCount( |
| 556 SiteEngagementMetrics::kEngagementScoreHistogramHTTPS, 0); | 555 SiteEngagementMetrics::kEngagementScoreHistogramHTTPS, 0); |
| 557 histograms.ExpectTotalCount( | 556 histograms.ExpectTotalCount( |
| 558 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0); | 557 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0); |
| 559 histograms.ExpectTotalCount( | 558 histograms.ExpectTotalCount( |
| 560 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0); | 559 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0); |
| 561 histograms.ExpectTotalCount( | 560 histograms.ExpectTotalCount( |
| 562 SiteEngagementMetrics::kPercentOriginsWithMaxEngagementHistogram, 0); | 561 SiteEngagementMetrics::kPercentOriginsWithMaxEngagementHistogram, 0); |
| 563 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 562 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 564 0); | 563 0); |
| 565 | 564 |
| 566 // Record metrics for an empty engagement system. | 565 // Record metrics for an empty engagement system. |
| 567 service->RecordMetrics(); | 566 service_->RecordMetrics(); |
| 568 | 567 |
| 569 histograms.ExpectUniqueSample( | 568 histograms.ExpectUniqueSample( |
| 570 SiteEngagementMetrics::kTotalEngagementHistogram, 0, 1); | 569 SiteEngagementMetrics::kTotalEngagementHistogram, 0, 1); |
| 571 histograms.ExpectUniqueSample(SiteEngagementMetrics::kTotalOriginsHistogram, | 570 histograms.ExpectUniqueSample(SiteEngagementMetrics::kTotalOriginsHistogram, |
| 572 0, 1); | 571 0, 1); |
| 573 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementScoreHistogram, | 572 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementScoreHistogram, |
| 574 0); | 573 0); |
| 575 histograms.ExpectTotalCount( | 574 histograms.ExpectTotalCount( |
| 576 SiteEngagementMetrics::kEngagementScoreHistogramHTTP, 0); | 575 SiteEngagementMetrics::kEngagementScoreHistogramHTTP, 0); |
| 577 histograms.ExpectTotalCount( | 576 histograms.ExpectTotalCount( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 588 SiteEngagementMetrics::kPercentOriginsWithMaxEngagementHistogram, 0, 1); | 587 SiteEngagementMetrics::kPercentOriginsWithMaxEngagementHistogram, 0, 1); |
| 589 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 588 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 590 0); | 589 0); |
| 591 | 590 |
| 592 const std::vector<std::string> engagement_bucket_histogram_names = | 591 const std::vector<std::string> engagement_bucket_histogram_names = |
| 593 SiteEngagementMetrics::GetEngagementBucketHistogramNames(); | 592 SiteEngagementMetrics::GetEngagementBucketHistogramNames(); |
| 594 | 593 |
| 595 for (const std::string& histogram_name : engagement_bucket_histogram_names) | 594 for (const std::string& histogram_name : engagement_bucket_histogram_names) |
| 596 histograms.ExpectTotalCount(histogram_name, 0); | 595 histograms.ExpectTotalCount(histogram_name, 0); |
| 597 | 596 |
| 598 clock->SetNow(clock->Now() + base::TimeDelta::FromMinutes(60)); | 597 clock_->SetNow(clock_->Now() + base::TimeDelta::FromMinutes(60)); |
| 599 | 598 |
| 600 // The https and http versions of www.google.com should be separate. | 599 // The https and http versions of www.google.com should be separate. |
| 601 GURL url1("https://www.google.com/"); | 600 GURL url1("https://www.google.com/"); |
| 602 GURL url2("http://www.google.com/"); | 601 GURL url2("http://www.google.com/"); |
| 603 GURL url3("http://drive.google.com/"); | 602 GURL url3("http://drive.google.com/"); |
| 604 | 603 |
| 605 NavigateAndCommit(url1); | 604 NavigateAndCommit(url1); |
| 606 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); | 605 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
| 607 service->HandleUserInput(web_contents(), | 606 service_->HandleUserInput(web_contents(), |
| 608 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); | 607 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
| 609 service->HandleUserInput(web_contents(), | 608 service_->HandleUserInput(web_contents(), |
| 610 SiteEngagementMetrics::ENGAGEMENT_MOUSE); | 609 SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
| 611 NavigateAndCommit(url2); | 610 NavigateAndCommit(url2); |
| 612 service->HandleMediaPlaying(web_contents(), true); | 611 service_->HandleMediaPlaying(web_contents(), true); |
| 613 | 612 |
| 614 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, | 613 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, |
| 615 2); | 614 2); |
| 616 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalOriginsHistogram, 2); | 615 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalOriginsHistogram, 2); |
| 617 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, | 616 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, |
| 618 1); | 617 1); |
| 619 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, | 618 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, |
| 620 1); | 619 1); |
| 621 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, | 620 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, |
| 622 2); | 621 2); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 646 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 645 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 647 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 1); | 646 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 1); |
| 648 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 647 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 649 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, | 648 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, |
| 650 1); | 649 1); |
| 651 histograms.ExpectBucketCount( | 650 histograms.ExpectBucketCount( |
| 652 SiteEngagementMetrics::kEngagementTypeHistogram, | 651 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 653 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); | 652 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); |
| 654 | 653 |
| 655 // Navigations are still logged within the 1 hour refresh period | 654 // Navigations are still logged within the 1 hour refresh period |
| 656 clock->SetNow(clock->Now() + base::TimeDelta::FromMinutes(59)); | 655 clock_->SetNow(clock_->Now() + base::TimeDelta::FromMinutes(59)); |
| 657 | 656 |
| 658 NavigateAndCommit(url2); | 657 NavigateAndCommit(url2); |
| 659 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_GENERATED); | 658 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_GENERATED); |
| 660 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_AUTO_BOOKMARK); | 659 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_AUTO_BOOKMARK); |
| 661 | 660 |
| 662 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 661 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 663 8); | 662 8); |
| 664 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 663 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 665 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 3); | 664 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 3); |
| 666 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 665 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 667 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 1); | 666 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 1); |
| 668 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 667 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 669 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 1); | 668 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 1); |
| 670 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 669 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 671 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, | 670 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, |
| 672 1); | 671 1); |
| 673 histograms.ExpectBucketCount( | 672 histograms.ExpectBucketCount( |
| 674 SiteEngagementMetrics::kEngagementTypeHistogram, | 673 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 675 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); | 674 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 2); |
| 676 | 675 |
| 677 // Update the hourly histograms again. | 676 // Update the hourly histograms again. |
| 678 clock->SetNow(clock->Now() + base::TimeDelta::FromMinutes(1)); | 677 clock_->SetNow(clock_->Now() + base::TimeDelta::FromMinutes(1)); |
| 679 | 678 |
| 680 NavigateAndCommit(url3); | 679 NavigateAndCommit(url3); |
| 681 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); | 680 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
| 682 service->HandleMediaPlaying(web_contents(), false); | 681 service_->HandleMediaPlaying(web_contents(), false); |
| 683 NavigateAndCommit(url2); | 682 NavigateAndCommit(url2); |
| 684 service->HandleUserInput(web_contents(), | 683 service_->HandleUserInput(web_contents(), |
| 685 SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE); | 684 SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE); |
| 686 | 685 |
| 687 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, | 686 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, |
| 688 3); | 687 3); |
| 689 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, | 688 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, |
| 690 1); | 689 1); |
| 691 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, | 690 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, |
| 692 1); | 691 1); |
| 693 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 3, | 692 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 3, |
| 694 1); | 693 1); |
| 695 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, | 694 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 726 SiteEngagementMetrics::ENGAGEMENT_MEDIA_VISIBLE, | 725 SiteEngagementMetrics::ENGAGEMENT_MEDIA_VISIBLE, |
| 727 1); | 726 1); |
| 728 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 727 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 729 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, | 728 SiteEngagementMetrics::ENGAGEMENT_MEDIA_HIDDEN, |
| 730 1); | 729 1); |
| 731 histograms.ExpectBucketCount( | 730 histograms.ExpectBucketCount( |
| 732 SiteEngagementMetrics::kEngagementTypeHistogram, | 731 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 733 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 3); | 732 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 3); |
| 734 | 733 |
| 735 NavigateAndCommit(url1); | 734 NavigateAndCommit(url1); |
| 736 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_GENERATED); | 735 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_GENERATED); |
| 737 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); | 736 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
| 738 NavigateAndCommit(url2); | 737 NavigateAndCommit(url2); |
| 739 service->HandleUserInput(web_contents(), | 738 service_->HandleUserInput(web_contents(), |
| 740 SiteEngagementMetrics::ENGAGEMENT_SCROLL); | 739 SiteEngagementMetrics::ENGAGEMENT_SCROLL); |
| 741 NavigateAndCommit(url1); | 740 NavigateAndCommit(url1); |
| 742 service->HandleUserInput(web_contents(), | 741 service_->HandleUserInput(web_contents(), |
| 743 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); | 742 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
| 744 NavigateAndCommit(url3); | 743 NavigateAndCommit(url3); |
| 745 service->HandleUserInput(web_contents(), | 744 service_->HandleUserInput(web_contents(), |
| 746 SiteEngagementMetrics::ENGAGEMENT_MOUSE); | 745 SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
| 747 | 746 |
| 748 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 747 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 749 17); | 748 17); |
| 750 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 749 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 751 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 6); | 750 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 6); |
| 752 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 751 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 753 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 2); | 752 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 2); |
| 754 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 753 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 755 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 2); | 754 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 2); |
| 756 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 755 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 757 SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE, | 756 SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE, |
| 758 1); | 757 1); |
| 759 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, | 758 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 760 SiteEngagementMetrics::ENGAGEMENT_SCROLL, 1); | 759 SiteEngagementMetrics::ENGAGEMENT_SCROLL, 1); |
| 761 histograms.ExpectBucketCount( | 760 histograms.ExpectBucketCount( |
| 762 SiteEngagementMetrics::kEngagementTypeHistogram, | 761 SiteEngagementMetrics::kEngagementTypeHistogram, |
| 763 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 3); | 762 SiteEngagementMetrics::ENGAGEMENT_FIRST_DAILY_ENGAGEMENT, 3); |
| 764 | 763 |
| 765 // Advance an origin to the max for a day and advance the clock an hour before | 764 // Advance an origin to the max for a day and advance the clock an hour before |
| 766 // the last increment before max. Expect the histogram to be updated. | 765 // the last increment before max. Expect the histogram to be updated. |
| 767 NavigateAndCommit(url1); | 766 NavigateAndCommit(url1); |
| 768 for (int i = 0; i < 6; ++i) | 767 for (int i = 0; i < 6; ++i) |
| 769 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); | 768 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
| 770 | 769 |
| 771 clock->SetNow(clock->Now() + base::TimeDelta::FromMinutes(60)); | 770 clock_->SetNow(clock_->Now() + base::TimeDelta::FromMinutes(60)); |
| 772 service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); | 771 service_->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
| 773 | 772 |
| 774 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, | 773 histograms.ExpectTotalCount(SiteEngagementMetrics::kTotalEngagementHistogram, |
| 775 4); | 774 4); |
| 776 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, | 775 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 0, |
| 777 1); | 776 1); |
| 778 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, | 777 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 1, |
| 779 1); | 778 1); |
| 780 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 3, | 779 histograms.ExpectBucketCount(SiteEngagementMetrics::kTotalOriginsHistogram, 3, |
| 781 2); | 780 2); |
| 782 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, | 781 histograms.ExpectTotalCount(SiteEngagementMetrics::kMeanEngagementHistogram, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 histograms.ExpectBucketCount(engagement_bucket_histogram_names[0], 33, 1); | 814 histograms.ExpectBucketCount(engagement_bucket_histogram_names[0], 33, 1); |
| 816 histograms.ExpectBucketCount(engagement_bucket_histogram_names[0], 66, 1); | 815 histograms.ExpectBucketCount(engagement_bucket_histogram_names[0], 66, 1); |
| 817 histograms.ExpectBucketCount(engagement_bucket_histogram_names[1], 33, 1); | 816 histograms.ExpectBucketCount(engagement_bucket_histogram_names[1], 33, 1); |
| 818 histograms.ExpectBucketCount(engagement_bucket_histogram_names[1], 66, 1); | 817 histograms.ExpectBucketCount(engagement_bucket_histogram_names[1], 66, 1); |
| 819 } | 818 } |
| 820 | 819 |
| 821 // Expect that sites that have reached zero engagement are cleaned up. Expect | 820 // Expect that sites that have reached zero engagement are cleaned up. Expect |
| 822 // engagement times to be reset if too much time has passed since the last | 821 // engagement times to be reset if too much time has passed since the last |
| 823 // engagement. | 822 // engagement. |
| 824 TEST_F(SiteEngagementServiceTest, CleanupEngagementScores) { | 823 TEST_F(SiteEngagementServiceTest, CleanupEngagementScores) { |
| 825 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 826 std::unique_ptr<SiteEngagementService> service( | |
| 827 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 828 | |
| 829 // Set the base time to be 3 weeks past the stale period in the past. | 824 // Set the base time to be 3 weeks past the stale period in the past. |
| 830 // Use a 1 second offset to make sure scores don't yet decay. | 825 // Use a 1 second offset to make sure scores don't yet decay. |
| 831 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); | 826 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); |
| 832 base::TimeDelta one_day = base::TimeDelta::FromDays(1); | 827 base::TimeDelta one_day = base::TimeDelta::FromDays(1); |
| 833 base::TimeDelta decay_period = | 828 base::TimeDelta decay_period = |
| 834 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours()); | 829 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours()); |
| 835 base::TimeDelta shorter_than_decay_period = decay_period - one_second; | 830 base::TimeDelta shorter_than_decay_period = decay_period - one_second; |
| 836 | 831 |
| 837 base::Time max_decay_time = GetReferenceTime() - service->GetMaxDecayPeriod(); | 832 base::Time max_decay_time = |
| 838 base::Time stale_time = GetReferenceTime() - service->GetStalePeriod(); | 833 GetReferenceTime() - service_->GetMaxDecayPeriod(); |
| 834 base::Time stale_time = GetReferenceTime() - service_->GetStalePeriod(); |
| 839 base::Time base_time = stale_time - shorter_than_decay_period * 4; | 835 base::Time base_time = stale_time - shorter_than_decay_period * 4; |
| 840 clock->SetNow(base_time); | 836 clock_->SetNow(base_time); |
| 841 | 837 |
| 842 // The https and http versions of www.google.com should be separate. | 838 // The https and http versions of www.google.com should be separate. |
| 843 GURL url1("https://www.google.com/"); | 839 GURL url1("https://www.google.com/"); |
| 844 GURL url2("http://www.google.com/"); | 840 GURL url2("http://www.google.com/"); |
| 845 GURL url3("http://maps.google.com/"); | 841 GURL url3("http://maps.google.com/"); |
| 846 GURL url4("http://drive.google.com/"); | 842 GURL url4("http://drive.google.com/"); |
| 847 | 843 |
| 848 EXPECT_EQ(0, service->GetScore(url1)); | 844 EXPECT_EQ(0, service_->GetScore(url1)); |
| 849 EXPECT_EQ(0, service->GetScore(url2)); | 845 EXPECT_EQ(0, service_->GetScore(url2)); |
| 850 EXPECT_EQ(0, service->GetScore(url3)); | 846 EXPECT_EQ(0, service_->GetScore(url3)); |
| 851 EXPECT_EQ(0, service->GetScore(url4)); | 847 EXPECT_EQ(0, service_->GetScore(url4)); |
| 852 | 848 |
| 853 // Add some points | 849 // Add some points |
| 854 service->AddPoints(url1, 1.0); | 850 service_->AddPoints(url1, 1.0); |
| 855 service->AddPoints(url2, 5.0); | 851 service_->AddPoints(url2, 5.0); |
| 856 EXPECT_EQ(1.0, service->GetScore(url1)); | 852 EXPECT_EQ(1.0, service_->GetScore(url1)); |
| 857 EXPECT_EQ(5.0, service->GetScore(url2)); | 853 EXPECT_EQ(5.0, service_->GetScore(url2)); |
| 858 | 854 |
| 859 // Add more to url2 over the next few days. Leave it completely alone after | 855 // Add more to url2 over the next few days. Leave it completely alone after |
| 860 // this. | 856 // this. |
| 861 clock->SetNow(base_time + one_day); | 857 clock_->SetNow(base_time + one_day); |
| 862 service->AddPoints(url2, 5.0); | 858 service_->AddPoints(url2, 5.0); |
| 863 EXPECT_EQ(10.0, service->GetScore(url2)); | 859 EXPECT_EQ(10.0, service_->GetScore(url2)); |
| 864 | 860 |
| 865 clock->SetNow(base_time + 2 * one_day); | 861 clock_->SetNow(base_time + 2 * one_day); |
| 866 service->AddPoints(url2, 5.0); | 862 service_->AddPoints(url2, 5.0); |
| 867 EXPECT_EQ(15.0, service->GetScore(url2)); | 863 EXPECT_EQ(15.0, service_->GetScore(url2)); |
| 868 | 864 |
| 869 clock->SetNow(base_time + 3 * one_day); | 865 clock_->SetNow(base_time + 3 * one_day); |
| 870 service->AddPoints(url2, 2.0); | 866 service_->AddPoints(url2, 2.0); |
| 871 EXPECT_EQ(17.0, service->GetScore(url2)); | 867 EXPECT_EQ(17.0, service_->GetScore(url2)); |
| 872 base::Time url2_last_modified = clock->Now(); | 868 base::Time url2_last_modified = clock_->Now(); |
| 873 | 869 |
| 874 // Move to (3 * shorter_than_decay_period) before the stale period. | 870 // Move to (3 * shorter_than_decay_period) before the stale period. |
| 875 base_time += shorter_than_decay_period; | 871 base_time += shorter_than_decay_period; |
| 876 clock->SetNow(base_time); | 872 clock_->SetNow(base_time); |
| 877 service->AddPoints(url1, 1.0); | 873 service_->AddPoints(url1, 1.0); |
| 878 service->AddPoints(url3, 5.0); | 874 service_->AddPoints(url3, 5.0); |
| 879 EXPECT_EQ(2.0, service->GetScore(url1)); | 875 EXPECT_EQ(2.0, service_->GetScore(url1)); |
| 880 EXPECT_EQ(5.0, service->GetScore(url3)); | 876 EXPECT_EQ(5.0, service_->GetScore(url3)); |
| 881 | 877 |
| 882 // Add more to url3, and then leave it alone. | 878 // Add more to url3, and then leave it alone. |
| 883 clock->SetNow(base_time + one_day); | 879 clock_->SetNow(base_time + one_day); |
| 884 service->AddPoints(url1, 5.0); | 880 service_->AddPoints(url1, 5.0); |
| 885 service->AddPoints(url3, 5.0); | 881 service_->AddPoints(url3, 5.0); |
| 886 EXPECT_EQ(7.0, service->GetScore(url1)); | 882 EXPECT_EQ(7.0, service_->GetScore(url1)); |
| 887 EXPECT_EQ(10.0, service->GetScore(url3)); | 883 EXPECT_EQ(10.0, service_->GetScore(url3)); |
| 888 | 884 |
| 889 // Move to (2 * shorter_than_decay_period) before the stale period. | 885 // Move to (2 * shorter_than_decay_period) before the stale period. |
| 890 base_time += shorter_than_decay_period; | 886 base_time += shorter_than_decay_period; |
| 891 clock->SetNow(base_time); | 887 clock_->SetNow(base_time); |
| 892 service->AddPoints(url1, 5.0); | 888 service_->AddPoints(url1, 5.0); |
| 893 service->AddPoints(url4, 5.0); | 889 service_->AddPoints(url4, 5.0); |
| 894 EXPECT_EQ(12.0, service->GetScore(url1)); | 890 EXPECT_EQ(12.0, service_->GetScore(url1)); |
| 895 EXPECT_EQ(5.0, service->GetScore(url4)); | 891 EXPECT_EQ(5.0, service_->GetScore(url4)); |
| 896 | 892 |
| 897 // Move to shorter_than_decay_period before the stale period. | 893 // Move to shorter_than_decay_period before the stale period. |
| 898 base_time += shorter_than_decay_period; | 894 base_time += shorter_than_decay_period; |
| 899 clock->SetNow(base_time); | 895 clock_->SetNow(base_time); |
| 900 service->AddPoints(url1, 1.5); | 896 service_->AddPoints(url1, 1.5); |
| 901 service->AddPoints(url4, 2.0); | 897 service_->AddPoints(url4, 2.0); |
| 902 EXPECT_EQ(13.5, service->GetScore(url1)); | 898 EXPECT_EQ(13.5, service_->GetScore(url1)); |
| 903 EXPECT_EQ(7.0, service->GetScore(url4)); | 899 EXPECT_EQ(7.0, service_->GetScore(url4)); |
| 904 | 900 |
| 905 // After cleanup, url2 should be last modified offset to max_decay_time by the | 901 // After cleanup, url2 should be last modified offset to max_decay_time by the |
| 906 // current offset to now. | 902 // current offset to now. |
| 907 url2_last_modified = max_decay_time - (clock->Now() - url2_last_modified); | 903 url2_last_modified = max_decay_time - (clock_->Now() - url2_last_modified); |
| 908 base_time = GetReferenceTime(); | 904 base_time = GetReferenceTime(); |
| 909 | 905 |
| 910 { | 906 { |
| 911 clock->SetNow(base_time); | 907 clock_->SetNow(base_time); |
| 912 ASSERT_TRUE(service->IsLastEngagementStale()); | 908 ASSERT_TRUE(service_->IsLastEngagementStale()); |
| 913 | 909 |
| 914 // Run a cleanup. Last engagement times will be reset relative to | 910 // Run a cleanup. Last engagement times will be reset relative to |
| 915 // max_decay_time. After the reset, url2 will go through 3 decays, url3 | 911 // max_decay_time. After the reset, url2 will go through 3 decays, url3 |
| 916 // will go through 2 decays, and url1/url4 will go through 1 decay. This | 912 // will go through 2 decays, and url1/url4 will go through 1 decay. This |
| 917 // decay is uncommitted! | 913 // decay is uncommitted! |
| 918 service->CleanupEngagementScores(true); | 914 service_->CleanupEngagementScores(true); |
| 919 ASSERT_FALSE(service->IsLastEngagementStale()); | 915 ASSERT_FALSE(service_->IsLastEngagementStale()); |
| 920 | 916 |
| 921 std::map<GURL, double> score_map = service->GetScoreMap(); | 917 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 922 EXPECT_EQ(3u, score_map.size()); | 918 EXPECT_EQ(3u, score_map.size()); |
| 923 EXPECT_EQ(8.5, score_map[url1]); | 919 EXPECT_EQ(8.5, score_map[url1]); |
| 924 EXPECT_EQ(2.0, score_map[url2]); | 920 EXPECT_EQ(2.0, score_map[url2]); |
| 925 EXPECT_EQ(2.0, score_map[url4]); | 921 EXPECT_EQ(2.0, score_map[url4]); |
| 926 EXPECT_EQ(0, service->GetScore(url3)); | 922 EXPECT_EQ(0, service_->GetScore(url3)); |
| 927 | 923 |
| 928 EXPECT_EQ(max_decay_time, | 924 EXPECT_EQ(max_decay_time, |
| 929 service->CreateEngagementScore(url1).last_engagement_time()); | 925 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 930 EXPECT_EQ(url2_last_modified, | 926 EXPECT_EQ(url2_last_modified, |
| 931 service->CreateEngagementScore(url2).last_engagement_time()); | 927 service_->CreateEngagementScore(url2).last_engagement_time()); |
| 932 EXPECT_EQ(max_decay_time, | 928 EXPECT_EQ(max_decay_time, |
| 933 service->CreateEngagementScore(url4).last_engagement_time()); | 929 service_->CreateEngagementScore(url4).last_engagement_time()); |
| 934 EXPECT_EQ(max_decay_time, service->GetLastEngagementTime()); | 930 EXPECT_EQ(max_decay_time, service_->GetLastEngagementTime()); |
| 935 } | 931 } |
| 936 | 932 |
| 937 { | 933 { |
| 938 // Advance time by the stale period. Nothing should happen in the cleanup. | 934 // Advance time by the stale period. Nothing should happen in the cleanup. |
| 939 // Last engagement times are now relative to max_decay_time + stale period | 935 // Last engagement times are now relative to max_decay_time + stale period |
| 940 base_time += service->GetStalePeriod(); | 936 base_time += service_->GetStalePeriod(); |
| 941 clock->SetNow(base_time); | 937 clock_->SetNow(base_time); |
| 942 ASSERT_TRUE(service->IsLastEngagementStale()); | 938 ASSERT_TRUE(service_->IsLastEngagementStale()); |
| 943 | 939 |
| 944 std::map<GURL, double> score_map = service->GetScoreMap(); | 940 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 945 EXPECT_EQ(3u, score_map.size()); | 941 EXPECT_EQ(3u, score_map.size()); |
| 946 EXPECT_EQ(8.5, score_map[url1]); | 942 EXPECT_EQ(8.5, score_map[url1]); |
| 947 EXPECT_EQ(2.0, score_map[url2]); | 943 EXPECT_EQ(2.0, score_map[url2]); |
| 948 EXPECT_EQ(2.0, score_map[url4]); | 944 EXPECT_EQ(2.0, score_map[url4]); |
| 949 | 945 |
| 950 EXPECT_EQ(max_decay_time + service->GetStalePeriod(), | 946 EXPECT_EQ(max_decay_time + service_->GetStalePeriod(), |
| 951 service->CreateEngagementScore(url1).last_engagement_time()); | 947 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 952 EXPECT_EQ(url2_last_modified + service->GetStalePeriod(), | 948 EXPECT_EQ(url2_last_modified + service_->GetStalePeriod(), |
| 953 service->CreateEngagementScore(url2).last_engagement_time()); | 949 service_->CreateEngagementScore(url2).last_engagement_time()); |
| 954 EXPECT_EQ(max_decay_time + service->GetStalePeriod(), | 950 EXPECT_EQ(max_decay_time + service_->GetStalePeriod(), |
| 955 service->CreateEngagementScore(url4).last_engagement_time()); | 951 service_->CreateEngagementScore(url4).last_engagement_time()); |
| 956 EXPECT_EQ(max_decay_time + service->GetStalePeriod(), | 952 EXPECT_EQ(max_decay_time + service_->GetStalePeriod(), |
| 957 service->GetLastEngagementTime()); | 953 service_->GetLastEngagementTime()); |
| 958 } | 954 } |
| 959 | 955 |
| 960 { | 956 { |
| 961 // Add points to commit the decay. | 957 // Add points to commit the decay. |
| 962 service->AddPoints(url1, 0.5); | 958 service_->AddPoints(url1, 0.5); |
| 963 service->AddPoints(url2, 0.5); | 959 service_->AddPoints(url2, 0.5); |
| 964 service->AddPoints(url4, 1); | 960 service_->AddPoints(url4, 1); |
| 965 | 961 |
| 966 std::map<GURL, double> score_map = service->GetScoreMap(); | 962 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 967 EXPECT_EQ(3u, score_map.size()); | 963 EXPECT_EQ(3u, score_map.size()); |
| 968 EXPECT_EQ(9.0, score_map[url1]); | 964 EXPECT_EQ(9.0, score_map[url1]); |
| 969 EXPECT_EQ(2.5, score_map[url2]); | 965 EXPECT_EQ(2.5, score_map[url2]); |
| 970 EXPECT_EQ(3.0, score_map[url4]); | 966 EXPECT_EQ(3.0, score_map[url4]); |
| 971 EXPECT_EQ(clock->Now(), | 967 EXPECT_EQ(clock_->Now(), |
| 972 service->CreateEngagementScore(url1).last_engagement_time()); | 968 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 973 EXPECT_EQ(clock->Now(), | 969 EXPECT_EQ(clock_->Now(), |
| 974 service->CreateEngagementScore(url2).last_engagement_time()); | 970 service_->CreateEngagementScore(url2).last_engagement_time()); |
| 975 EXPECT_EQ(clock->Now(), | 971 EXPECT_EQ(clock_->Now(), |
| 976 service->CreateEngagementScore(url4).last_engagement_time()); | 972 service_->CreateEngagementScore(url4).last_engagement_time()); |
| 977 EXPECT_EQ(clock->Now(), service->GetLastEngagementTime()); | 973 EXPECT_EQ(clock_->Now(), service_->GetLastEngagementTime()); |
| 978 } | 974 } |
| 979 | 975 |
| 980 { | 976 { |
| 981 // Advance time by a decay period after the current last engagement time. | 977 // Advance time by a decay period after the current last engagement time. |
| 982 // Expect url2/url4 to be decayed to zero and url1 to decay once. | 978 // Expect url2/url4 to be decayed to zero and url1 to decay once. |
| 983 base_time = clock->Now() + decay_period; | 979 base_time = clock_->Now() + decay_period; |
| 984 clock->SetNow(base_time); | 980 clock_->SetNow(base_time); |
| 985 ASSERT_FALSE(service->IsLastEngagementStale()); | 981 ASSERT_FALSE(service_->IsLastEngagementStale()); |
| 986 | 982 |
| 987 std::map<GURL, double> score_map = service->GetScoreMap(); | 983 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 988 EXPECT_EQ(3u, score_map.size()); | 984 EXPECT_EQ(3u, score_map.size()); |
| 989 EXPECT_EQ(4, score_map[url1]); | 985 EXPECT_EQ(4, score_map[url1]); |
| 990 EXPECT_EQ(0, score_map[url2]); | 986 EXPECT_EQ(0, score_map[url2]); |
| 991 EXPECT_EQ(0, score_map[url4]); | 987 EXPECT_EQ(0, score_map[url4]); |
| 992 | 988 |
| 993 service->CleanupEngagementScores(false); | 989 service_->CleanupEngagementScores(false); |
| 994 ASSERT_FALSE(service->IsLastEngagementStale()); | 990 ASSERT_FALSE(service_->IsLastEngagementStale()); |
| 995 | 991 |
| 996 score_map = service->GetScoreMap(); | 992 score_map = service_->GetScoreMap(); |
| 997 EXPECT_EQ(1u, score_map.size()); | 993 EXPECT_EQ(1u, score_map.size()); |
| 998 EXPECT_EQ(4, score_map[url1]); | 994 EXPECT_EQ(4, score_map[url1]); |
| 999 EXPECT_EQ(0, service->GetScore(url2)); | 995 EXPECT_EQ(0, service_->GetScore(url2)); |
| 1000 EXPECT_EQ(0, service->GetScore(url4)); | 996 EXPECT_EQ(0, service_->GetScore(url4)); |
| 1001 EXPECT_EQ(clock->Now() - decay_period, | 997 EXPECT_EQ(clock_->Now() - decay_period, |
| 1002 service->CreateEngagementScore(url1).last_engagement_time()); | 998 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 1003 EXPECT_EQ(clock->Now() - decay_period, service->GetLastEngagementTime()); | 999 EXPECT_EQ(clock_->Now() - decay_period, service_->GetLastEngagementTime()); |
| 1004 } | 1000 } |
| 1005 | 1001 |
| 1006 { | 1002 { |
| 1007 // Add points to commit the decay. | 1003 // Add points to commit the decay. |
| 1008 service->AddPoints(url1, 0.5); | 1004 service_->AddPoints(url1, 0.5); |
| 1009 | 1005 |
| 1010 std::map<GURL, double> score_map = service->GetScoreMap(); | 1006 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 1011 EXPECT_EQ(1u, score_map.size()); | 1007 EXPECT_EQ(1u, score_map.size()); |
| 1012 EXPECT_EQ(4.5, score_map[url1]); | 1008 EXPECT_EQ(4.5, score_map[url1]); |
| 1013 EXPECT_EQ(clock->Now(), | 1009 EXPECT_EQ(clock_->Now(), |
| 1014 service->CreateEngagementScore(url1).last_engagement_time()); | 1010 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 1015 EXPECT_EQ(clock->Now(), service->GetLastEngagementTime()); | 1011 EXPECT_EQ(clock_->Now(), service_->GetLastEngagementTime()); |
| 1016 } | 1012 } |
| 1017 | 1013 |
| 1018 { | 1014 { |
| 1019 // Another decay period will decay url1 to zero. | 1015 // Another decay period will decay url1 to zero. |
| 1020 clock->SetNow(clock->Now() + decay_period); | 1016 clock_->SetNow(clock_->Now() + decay_period); |
| 1021 ASSERT_FALSE(service->IsLastEngagementStale()); | 1017 ASSERT_FALSE(service_->IsLastEngagementStale()); |
| 1022 | 1018 |
| 1023 std::map<GURL, double> score_map = service->GetScoreMap(); | 1019 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 1024 EXPECT_EQ(1u, score_map.size()); | 1020 EXPECT_EQ(1u, score_map.size()); |
| 1025 EXPECT_EQ(0, score_map[url1]); | 1021 EXPECT_EQ(0, score_map[url1]); |
| 1026 EXPECT_EQ(clock->Now() - decay_period, | 1022 EXPECT_EQ(clock_->Now() - decay_period, |
| 1027 service->CreateEngagementScore(url1).last_engagement_time()); | 1023 service_->CreateEngagementScore(url1).last_engagement_time()); |
| 1028 EXPECT_EQ(clock->Now() - decay_period, service->GetLastEngagementTime()); | 1024 EXPECT_EQ(clock_->Now() - decay_period, service_->GetLastEngagementTime()); |
| 1029 | 1025 |
| 1030 service->CleanupEngagementScores(false); | 1026 service_->CleanupEngagementScores(false); |
| 1031 ASSERT_FALSE(service->IsLastEngagementStale()); | 1027 ASSERT_FALSE(service_->IsLastEngagementStale()); |
| 1032 | 1028 |
| 1033 score_map = service->GetScoreMap(); | 1029 score_map = service_->GetScoreMap(); |
| 1034 EXPECT_EQ(0u, score_map.size()); | 1030 EXPECT_EQ(0u, score_map.size()); |
| 1035 EXPECT_EQ(0, service->GetScore(url1)); | 1031 EXPECT_EQ(0, service_->GetScore(url1)); |
| 1036 EXPECT_EQ(clock->Now() - decay_period, service->GetLastEngagementTime()); | 1032 EXPECT_EQ(clock_->Now() - decay_period, service_->GetLastEngagementTime()); |
| 1037 } | 1033 } |
| 1038 } | 1034 } |
| 1039 | 1035 |
| 1040 TEST_F(SiteEngagementServiceTest, CleanupEngagementScoresProportional) { | 1036 TEST_F(SiteEngagementServiceTest, CleanupEngagementScoresProportional) { |
| 1041 SetParamValue(SiteEngagementScore::DECAY_PROPORTION, 0.5); | 1037 SetParamValue(SiteEngagementScore::DECAY_PROPORTION, 0.5); |
| 1042 SetParamValue(SiteEngagementScore::DECAY_POINTS, 0); | 1038 SetParamValue(SiteEngagementScore::DECAY_POINTS, 0); |
| 1043 SetParamValue(SiteEngagementScore::SCORE_CLEANUP_THRESHOLD, 0.5); | 1039 SetParamValue(SiteEngagementScore::SCORE_CLEANUP_THRESHOLD, 0.5); |
| 1044 | 1040 |
| 1045 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1046 std::unique_ptr<SiteEngagementService> service( | |
| 1047 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1048 | |
| 1049 base::Time current_day = GetReferenceTime(); | 1041 base::Time current_day = GetReferenceTime(); |
| 1050 clock->SetNow(current_day); | 1042 clock_->SetNow(current_day); |
| 1051 | 1043 |
| 1052 GURL url1("https://www.google.com/"); | 1044 GURL url1("https://www.google.com/"); |
| 1053 GURL url2("https://www.somewhereelse.com/"); | 1045 GURL url2("https://www.somewhereelse.com/"); |
| 1054 | 1046 |
| 1055 service->AddPoints(url1, 1.0); | 1047 service_->AddPoints(url1, 1.0); |
| 1056 service->AddPoints(url2, 1.2); | 1048 service_->AddPoints(url2, 1.2); |
| 1057 | 1049 |
| 1058 current_day += base::TimeDelta::FromDays(7); | 1050 current_day += base::TimeDelta::FromDays(7); |
| 1059 clock->SetNow(current_day); | 1051 clock_->SetNow(current_day); |
| 1060 std::map<GURL, double> score_map = service->GetScoreMap(); | 1052 std::map<GURL, double> score_map = service_->GetScoreMap(); |
| 1061 EXPECT_EQ(2u, score_map.size()); | 1053 EXPECT_EQ(2u, score_map.size()); |
| 1062 AssertInRange(0.5, service->GetScore(url1)); | 1054 AssertInRange(0.5, service_->GetScore(url1)); |
| 1063 AssertInRange(0.6, service->GetScore(url2)); | 1055 AssertInRange(0.6, service_->GetScore(url2)); |
| 1064 | 1056 |
| 1065 service->CleanupEngagementScores(false); | 1057 service_->CleanupEngagementScores(false); |
| 1066 score_map = service->GetScoreMap(); | 1058 score_map = service_->GetScoreMap(); |
| 1067 EXPECT_EQ(1u, score_map.size()); | 1059 EXPECT_EQ(1u, score_map.size()); |
| 1068 EXPECT_EQ(0, service->GetScore(url1)); | 1060 EXPECT_EQ(0, service_->GetScore(url1)); |
| 1069 AssertInRange(0.6, service->GetScore(url2)); | 1061 AssertInRange(0.6, service_->GetScore(url2)); |
| 1070 } | 1062 } |
| 1071 | 1063 |
| 1072 TEST_F(SiteEngagementServiceTest, NavigationAccumulation) { | 1064 TEST_F(SiteEngagementServiceTest, NavigationAccumulation) { |
| 1073 GURL url("https://www.google.com/"); | 1065 GURL url("https://www.google.com/"); |
| 1074 | 1066 |
| 1075 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 1067 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 1076 ASSERT_TRUE(service); | 1068 ASSERT_TRUE(service); |
| 1077 | 1069 |
| 1078 // Create the helper manually since it isn't present when a tab isn't created. | 1070 // Create the helper manually since it isn't present when a tab isn't created. |
| 1079 SiteEngagementService::Helper::CreateForWebContents(web_contents()); | 1071 SiteEngagementService::Helper::CreateForWebContents(web_contents()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1093 ui::PAGE_TRANSITION_AUTO_TOPLEVEL); | 1085 ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
| 1094 NavigateWithTransitionAndExpectEqualScore(service, url, | 1086 NavigateWithTransitionAndExpectEqualScore(service, url, |
| 1095 ui::PAGE_TRANSITION_LINK); | 1087 ui::PAGE_TRANSITION_LINK); |
| 1096 NavigateWithTransitionAndExpectEqualScore(service, url, | 1088 NavigateWithTransitionAndExpectEqualScore(service, url, |
| 1097 ui::PAGE_TRANSITION_RELOAD); | 1089 ui::PAGE_TRANSITION_RELOAD); |
| 1098 NavigateWithTransitionAndExpectEqualScore(service, url, | 1090 NavigateWithTransitionAndExpectEqualScore(service, url, |
| 1099 ui::PAGE_TRANSITION_FORM_SUBMIT); | 1091 ui::PAGE_TRANSITION_FORM_SUBMIT); |
| 1100 } | 1092 } |
| 1101 | 1093 |
| 1102 TEST_F(SiteEngagementServiceTest, IsBootstrapped) { | 1094 TEST_F(SiteEngagementServiceTest, IsBootstrapped) { |
| 1103 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1104 std::unique_ptr<SiteEngagementService> service( | |
| 1105 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1106 | |
| 1107 base::Time current_day = GetReferenceTime(); | 1095 base::Time current_day = GetReferenceTime(); |
| 1108 clock->SetNow(current_day); | 1096 clock_->SetNow(current_day); |
| 1109 | 1097 |
| 1110 GURL url1("https://www.google.com/"); | 1098 GURL url1("https://www.google.com/"); |
| 1111 GURL url2("https://www.somewhereelse.com/"); | 1099 GURL url2("https://www.somewhereelse.com/"); |
| 1112 | 1100 |
| 1113 EXPECT_FALSE(service->IsBootstrapped()); | 1101 EXPECT_FALSE(service_->IsBootstrapped()); |
| 1114 | 1102 |
| 1115 service->AddPoints(url1, 5.0); | 1103 service_->AddPoints(url1, 5.0); |
| 1116 EXPECT_FALSE(service->IsBootstrapped()); | 1104 EXPECT_FALSE(service_->IsBootstrapped()); |
| 1117 | 1105 |
| 1118 service->AddPoints(url2, 5.0); | 1106 service_->AddPoints(url2, 5.0); |
| 1119 EXPECT_TRUE(service->IsBootstrapped()); | 1107 EXPECT_TRUE(service_->IsBootstrapped()); |
| 1120 | 1108 |
| 1121 clock->SetNow(current_day + base::TimeDelta::FromDays(8)); | 1109 clock_->SetNow(current_day + base::TimeDelta::FromDays(8)); |
| 1122 EXPECT_FALSE(service->IsBootstrapped()); | 1110 EXPECT_FALSE(service_->IsBootstrapped()); |
| 1123 } | 1111 } |
| 1124 | 1112 |
| 1125 TEST_F(SiteEngagementServiceTest, CleanupOriginsOnHistoryDeletion) { | 1113 TEST_F(SiteEngagementServiceTest, CleanupOriginsOnHistoryDeletion) { |
| 1126 // Enable proportional decay to ensure that the undecay that happens to | 1114 // Enable proportional decay to ensure that the undecay that happens to |
| 1127 // balance out history deletion also accounts for the proportional decay. | 1115 // balance out history deletion also accounts for the proportional decay. |
| 1128 SetParamValue(SiteEngagementScore::DECAY_PROPORTION, 0.5); | 1116 SetParamValue(SiteEngagementScore::DECAY_PROPORTION, 0.5); |
| 1129 | 1117 |
| 1130 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1131 std::unique_ptr<SiteEngagementService> engagement( | |
| 1132 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1133 ASSERT_TRUE(engagement.get()); | |
| 1134 | |
| 1135 GURL origin1("http://www.google.com/"); | 1118 GURL origin1("http://www.google.com/"); |
| 1136 GURL origin1a("http://www.google.com/search?q=asdf"); | 1119 GURL origin1a("http://www.google.com/search?q=asdf"); |
| 1137 GURL origin1b("http://www.google.com/maps/search?q=asdf"); | 1120 GURL origin1b("http://www.google.com/maps/search?q=asdf"); |
| 1138 GURL origin2("https://drive.google.com/"); | 1121 GURL origin2("https://drive.google.com/"); |
| 1139 GURL origin2a("https://drive.google.com/somedoc"); | 1122 GURL origin2a("https://drive.google.com/somedoc"); |
| 1140 GURL origin3("http://notdeleted.com/"); | 1123 GURL origin3("http://notdeleted.com/"); |
| 1141 GURL origin4("http://decayed.com/"); | 1124 GURL origin4("http://decayed.com/"); |
| 1142 GURL origin4a("http://decayed.com/index.html"); | 1125 GURL origin4a("http://decayed.com/index.html"); |
| 1143 | 1126 |
| 1144 base::Time today = GetReferenceTime(); | 1127 base::Time today = GetReferenceTime(); |
| 1145 base::Time yesterday = GetReferenceTime() - base::TimeDelta::FromDays(1); | 1128 base::Time yesterday = GetReferenceTime() - base::TimeDelta::FromDays(1); |
| 1146 base::Time yesterday_afternoon = GetReferenceTime() - | 1129 base::Time yesterday_afternoon = GetReferenceTime() - |
| 1147 base::TimeDelta::FromDays(1) + | 1130 base::TimeDelta::FromDays(1) + |
| 1148 base::TimeDelta::FromHours(4); | 1131 base::TimeDelta::FromHours(4); |
| 1149 base::Time yesterday_week = GetReferenceTime() - base::TimeDelta::FromDays(8); | 1132 base::Time yesterday_week = GetReferenceTime() - base::TimeDelta::FromDays(8); |
| 1150 clock->SetNow(today); | 1133 clock_->SetNow(today); |
| 1151 | 1134 |
| 1152 history::HistoryService* history = HistoryServiceFactory::GetForProfile( | 1135 history::HistoryService* history = HistoryServiceFactory::GetForProfile( |
| 1153 profile(), ServiceAccessType::IMPLICIT_ACCESS); | 1136 profile(), ServiceAccessType::IMPLICIT_ACCESS); |
| 1154 | 1137 |
| 1155 history->AddPage(origin1, yesterday_afternoon, history::SOURCE_BROWSED); | 1138 history->AddPage(origin1, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1156 history->AddPage(origin1a, yesterday_week, history::SOURCE_BROWSED); | 1139 history->AddPage(origin1a, yesterday_week, history::SOURCE_BROWSED); |
| 1157 history->AddPage(origin1b, today, history::SOURCE_BROWSED); | 1140 history->AddPage(origin1b, today, history::SOURCE_BROWSED); |
| 1158 engagement->AddPoints(origin1, 3.0); | 1141 service_->AddPoints(origin1, 3.0); |
| 1159 | 1142 |
| 1160 history->AddPage(origin2, yesterday_afternoon, history::SOURCE_BROWSED); | 1143 history->AddPage(origin2, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1161 history->AddPage(origin2a, yesterday_afternoon, history::SOURCE_BROWSED); | 1144 history->AddPage(origin2a, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1162 engagement->AddPoints(origin2, 5.0); | 1145 service_->AddPoints(origin2, 5.0); |
| 1163 | 1146 |
| 1164 history->AddPage(origin3, today, history::SOURCE_BROWSED); | 1147 history->AddPage(origin3, today, history::SOURCE_BROWSED); |
| 1165 engagement->AddPoints(origin3, 5.0); | 1148 service_->AddPoints(origin3, 5.0); |
| 1166 | 1149 |
| 1167 history->AddPage(origin4, yesterday_week, history::SOURCE_BROWSED); | 1150 history->AddPage(origin4, yesterday_week, history::SOURCE_BROWSED); |
| 1168 history->AddPage(origin4a, yesterday_afternoon, history::SOURCE_BROWSED); | 1151 history->AddPage(origin4a, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1169 engagement->AddPoints(origin4, 5.0); | 1152 service_->AddPoints(origin4, 5.0); |
| 1170 | 1153 |
| 1171 AssertInRange(3.0, engagement->GetScore(origin1)); | 1154 AssertInRange(3.0, service_->GetScore(origin1)); |
| 1172 AssertInRange(5.0, engagement->GetScore(origin2)); | 1155 AssertInRange(5.0, service_->GetScore(origin2)); |
| 1173 AssertInRange(5.0, engagement->GetScore(origin3)); | 1156 AssertInRange(5.0, service_->GetScore(origin3)); |
| 1174 AssertInRange(5.0, engagement->GetScore(origin4)); | 1157 AssertInRange(5.0, service_->GetScore(origin4)); |
| 1175 | 1158 |
| 1176 { | 1159 { |
| 1177 SiteEngagementChangeWaiter waiter(profile()); | 1160 SiteEngagementChangeWaiter waiter(profile()); |
| 1178 | 1161 |
| 1179 base::CancelableTaskTracker task_tracker; | 1162 base::CancelableTaskTracker task_tracker; |
| 1180 // Expire origin1, origin2, origin2a, and origin4's most recent visit. | 1163 // Expire origin1, origin2, origin2a, and origin4's most recent visit. |
| 1181 history->ExpireHistoryBetween(std::set<GURL>(), yesterday, today, | 1164 history->ExpireHistoryBetween(std::set<GURL>(), yesterday, today, |
| 1182 base::Bind(&base::DoNothing), &task_tracker); | 1165 base::Bind(&base::DoNothing), &task_tracker); |
| 1183 waiter.Wait(); | 1166 waiter.Wait(); |
| 1184 | 1167 |
| 1185 // origin2 is cleaned up because all its urls are deleted. origin1a and | 1168 // origin2 is cleaned up because all its urls are deleted. origin1a and |
| 1186 // origin1b are still in history, but 33% of urls have been deleted, thus | 1169 // origin1b are still in history, but 33% of urls have been deleted, thus |
| 1187 // cutting origin1's score by 1/3. origin3 is untouched. origin4 has 1 URL | 1170 // cutting origin1's score by 1/3. origin3 is untouched. origin4 has 1 URL |
| 1188 // deleted and 1 remaining, but its most recent visit is more than 1 week in | 1171 // deleted and 1 remaining, but its most recent visit is more than 1 week in |
| 1189 // the past. Ensure that its scored is halved, and not decayed further. | 1172 // the past. Ensure that its scored is halved, and not decayed further. |
| 1190 AssertInRange(2, engagement->GetScore(origin1)); | 1173 AssertInRange(2, service_->GetScore(origin1)); |
| 1191 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1174 EXPECT_EQ(0, service_->GetScore(origin2)); |
| 1192 AssertInRange(5.0, engagement->GetScore(origin3)); | 1175 AssertInRange(5.0, service_->GetScore(origin3)); |
| 1193 AssertInRange(2.5, engagement->GetScore(origin4)); | 1176 AssertInRange(2.5, service_->GetScore(origin4)); |
| 1194 AssertInRange(9.5, engagement->GetTotalEngagementPoints()); | 1177 AssertInRange(9.5, service_->GetTotalEngagementPoints()); |
| 1195 } | 1178 } |
| 1196 | 1179 |
| 1197 { | 1180 { |
| 1198 SiteEngagementChangeWaiter waiter(profile()); | 1181 SiteEngagementChangeWaiter waiter(profile()); |
| 1199 | 1182 |
| 1200 // Expire origin1a. | 1183 // Expire origin1a. |
| 1201 std::vector<history::ExpireHistoryArgs> expire_list; | 1184 std::vector<history::ExpireHistoryArgs> expire_list; |
| 1202 history::ExpireHistoryArgs args; | 1185 history::ExpireHistoryArgs args; |
| 1203 args.urls.insert(origin1a); | 1186 args.urls.insert(origin1a); |
| 1204 args.SetTimeRangeForOneDay(yesterday_week); | 1187 args.SetTimeRangeForOneDay(yesterday_week); |
| 1205 expire_list.push_back(args); | 1188 expire_list.push_back(args); |
| 1206 | 1189 |
| 1207 base::CancelableTaskTracker task_tracker; | 1190 base::CancelableTaskTracker task_tracker; |
| 1208 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), | 1191 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), |
| 1209 &task_tracker); | 1192 &task_tracker); |
| 1210 waiter.Wait(); | 1193 waiter.Wait(); |
| 1211 | 1194 |
| 1212 // origin1's score should be halved again. origin3 and origin4 remain | 1195 // origin1's score should be halved again. origin3 and origin4 remain |
| 1213 // untouched. | 1196 // untouched. |
| 1214 AssertInRange(1, engagement->GetScore(origin1)); | 1197 AssertInRange(1, service_->GetScore(origin1)); |
| 1215 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1198 EXPECT_EQ(0, service_->GetScore(origin2)); |
| 1216 AssertInRange(5.0, engagement->GetScore(origin3)); | 1199 AssertInRange(5.0, service_->GetScore(origin3)); |
| 1217 AssertInRange(2.5, engagement->GetScore(origin4)); | 1200 AssertInRange(2.5, service_->GetScore(origin4)); |
| 1218 AssertInRange(8.5, engagement->GetTotalEngagementPoints()); | 1201 AssertInRange(8.5, service_->GetTotalEngagementPoints()); |
| 1219 } | 1202 } |
| 1220 | 1203 |
| 1221 { | 1204 { |
| 1222 SiteEngagementChangeWaiter waiter(profile()); | 1205 SiteEngagementChangeWaiter waiter(profile()); |
| 1223 | 1206 |
| 1224 // Expire origin1b. | 1207 // Expire origin1b. |
| 1225 std::vector<history::ExpireHistoryArgs> expire_list; | 1208 std::vector<history::ExpireHistoryArgs> expire_list; |
| 1226 history::ExpireHistoryArgs args; | 1209 history::ExpireHistoryArgs args; |
| 1227 args.urls.insert(origin1b); | 1210 args.urls.insert(origin1b); |
| 1228 args.SetTimeRangeForOneDay(today); | 1211 args.SetTimeRangeForOneDay(today); |
| 1229 expire_list.push_back(args); | 1212 expire_list.push_back(args); |
| 1230 | 1213 |
| 1231 base::CancelableTaskTracker task_tracker; | 1214 base::CancelableTaskTracker task_tracker; |
| 1232 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), | 1215 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), |
| 1233 &task_tracker); | 1216 &task_tracker); |
| 1234 waiter.Wait(); | 1217 waiter.Wait(); |
| 1235 | 1218 |
| 1236 // origin1 should be removed. origin3 and origin4 remain untouched. | 1219 // origin1 should be removed. origin3 and origin4 remain untouched. |
| 1237 EXPECT_EQ(0, engagement->GetScore(origin1)); | 1220 EXPECT_EQ(0, service_->GetScore(origin1)); |
| 1238 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1221 EXPECT_EQ(0, service_->GetScore(origin2)); |
| 1239 AssertInRange(5.0, engagement->GetScore(origin3)); | 1222 AssertInRange(5.0, service_->GetScore(origin3)); |
| 1240 AssertInRange(2.5, engagement->GetScore(origin4)); | 1223 AssertInRange(2.5, service_->GetScore(origin4)); |
| 1241 AssertInRange(7.5, engagement->GetTotalEngagementPoints()); | 1224 AssertInRange(7.5, service_->GetTotalEngagementPoints()); |
| 1242 } | 1225 } |
| 1243 } | 1226 } |
| 1244 | 1227 |
| 1245 TEST_F(SiteEngagementServiceTest, EngagementLevel) { | 1228 TEST_F(SiteEngagementServiceTest, EngagementLevel) { |
| 1246 static_assert(blink::mojom::EngagementLevel::NONE != | 1229 static_assert(blink::mojom::EngagementLevel::NONE != |
| 1247 blink::mojom::EngagementLevel::LOW, | 1230 blink::mojom::EngagementLevel::LOW, |
| 1248 "enum values should not be equal"); | 1231 "enum values should not be equal"); |
| 1249 static_assert(blink::mojom::EngagementLevel::LOW != | 1232 static_assert(blink::mojom::EngagementLevel::LOW != |
| 1250 blink::mojom::EngagementLevel::MEDIUM, | 1233 blink::mojom::EngagementLevel::MEDIUM, |
| 1251 "enum values should not be equal"); | 1234 "enum values should not be equal"); |
| 1252 static_assert(blink::mojom::EngagementLevel::MEDIUM != | 1235 static_assert(blink::mojom::EngagementLevel::MEDIUM != |
| 1253 blink::mojom::EngagementLevel::HIGH, | 1236 blink::mojom::EngagementLevel::HIGH, |
| 1254 "enum values should not be equal"); | 1237 "enum values should not be equal"); |
| 1255 static_assert(blink::mojom::EngagementLevel::HIGH != | 1238 static_assert(blink::mojom::EngagementLevel::HIGH != |
| 1256 blink::mojom::EngagementLevel::MAX, | 1239 blink::mojom::EngagementLevel::MAX, |
| 1257 "enum values should not be equal"); | 1240 "enum values should not be equal"); |
| 1258 | 1241 |
| 1259 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1260 std::unique_ptr<SiteEngagementService> service( | |
| 1261 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1262 | |
| 1263 base::Time current_day = GetReferenceTime(); | 1242 base::Time current_day = GetReferenceTime(); |
| 1264 clock->SetNow(current_day); | 1243 clock_->SetNow(current_day); |
| 1265 | 1244 |
| 1266 GURL url1("https://www.google.com/"); | 1245 GURL url1("https://www.google.com/"); |
| 1267 GURL url2("http://www.google.com/"); | 1246 GURL url2("http://www.google.com/"); |
| 1268 | 1247 |
| 1269 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, | 1248 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, |
| 1270 service->GetEngagementLevel(url1)); | 1249 service_->GetEngagementLevel(url1)); |
| 1271 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, | 1250 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, |
| 1272 service->GetEngagementLevel(url2)); | 1251 service_->GetEngagementLevel(url2)); |
| 1273 EXPECT_TRUE( | 1252 EXPECT_TRUE( |
| 1274 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::NONE)); | 1253 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::NONE)); |
| 1275 EXPECT_FALSE(service->IsEngagementAtLeast( | 1254 EXPECT_FALSE(service_->IsEngagementAtLeast( |
| 1276 url1, blink::mojom::EngagementLevel::MINIMAL)); | 1255 url1, blink::mojom::EngagementLevel::MINIMAL)); |
| 1277 EXPECT_FALSE( | 1256 EXPECT_FALSE( |
| 1278 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::LOW)); | 1257 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::LOW)); |
| 1279 EXPECT_FALSE(service->IsEngagementAtLeast( | 1258 EXPECT_FALSE(service_->IsEngagementAtLeast( |
| 1280 url1, blink::mojom::EngagementLevel::MEDIUM)); | 1259 url1, blink::mojom::EngagementLevel::MEDIUM)); |
| 1281 EXPECT_FALSE( | 1260 EXPECT_FALSE( |
| 1282 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::HIGH)); | 1261 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::HIGH)); |
| 1283 EXPECT_FALSE( | 1262 EXPECT_FALSE( |
| 1284 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::MAX)); | 1263 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::MAX)); |
| 1285 | 1264 |
| 1286 // Bring url2 to MINIMAL engagement. | 1265 // Bring url2 to MINIMAL engagement. |
| 1287 service->AddPoints(url2, 0.5); | 1266 service_->AddPoints(url2, 0.5); |
| 1288 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, | 1267 EXPECT_EQ(blink::mojom::EngagementLevel::NONE, |
| 1289 service->GetEngagementLevel(url1)); | 1268 service_->GetEngagementLevel(url1)); |
| 1290 EXPECT_EQ(blink::mojom::EngagementLevel::MINIMAL, | 1269 EXPECT_EQ(blink::mojom::EngagementLevel::MINIMAL, |
| 1291 service->GetEngagementLevel(url2)); | 1270 service_->GetEngagementLevel(url2)); |
| 1292 EXPECT_TRUE( | 1271 EXPECT_TRUE( |
| 1293 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); | 1272 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); |
| 1294 EXPECT_TRUE(service->IsEngagementAtLeast( | 1273 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1295 url2, blink::mojom::EngagementLevel::MINIMAL)); | 1274 url2, blink::mojom::EngagementLevel::MINIMAL)); |
| 1296 EXPECT_FALSE( | 1275 EXPECT_FALSE( |
| 1297 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); | 1276 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); |
| 1298 EXPECT_FALSE(service->IsEngagementAtLeast( | 1277 EXPECT_FALSE(service_->IsEngagementAtLeast( |
| 1299 url2, blink::mojom::EngagementLevel::MEDIUM)); | 1278 url2, blink::mojom::EngagementLevel::MEDIUM)); |
| 1300 EXPECT_FALSE( | 1279 EXPECT_FALSE( |
| 1301 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); | 1280 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); |
| 1302 EXPECT_FALSE( | 1281 EXPECT_FALSE( |
| 1303 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); | 1282 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); |
| 1304 | 1283 |
| 1305 // Bring url1 to LOW engagement. | 1284 // Bring url1 to LOW engagement. |
| 1306 service->AddPoints(url1, 1.0); | 1285 service_->AddPoints(url1, 1.0); |
| 1307 EXPECT_EQ(blink::mojom::EngagementLevel::LOW, | 1286 EXPECT_EQ(blink::mojom::EngagementLevel::LOW, |
| 1308 service->GetEngagementLevel(url1)); | 1287 service_->GetEngagementLevel(url1)); |
| 1309 EXPECT_EQ(blink::mojom::EngagementLevel::MINIMAL, | 1288 EXPECT_EQ(blink::mojom::EngagementLevel::MINIMAL, |
| 1310 service->GetEngagementLevel(url2)); | 1289 service_->GetEngagementLevel(url2)); |
| 1311 EXPECT_TRUE( | 1290 EXPECT_TRUE( |
| 1312 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::NONE)); | 1291 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::NONE)); |
| 1313 EXPECT_TRUE(service->IsEngagementAtLeast( | 1292 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1314 url1, blink::mojom::EngagementLevel::MINIMAL)); | 1293 url1, blink::mojom::EngagementLevel::MINIMAL)); |
| 1315 EXPECT_TRUE( | 1294 EXPECT_TRUE( |
| 1316 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::LOW)); | 1295 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::LOW)); |
| 1317 EXPECT_FALSE(service->IsEngagementAtLeast( | 1296 EXPECT_FALSE(service_->IsEngagementAtLeast( |
| 1318 url1, blink::mojom::EngagementLevel::MEDIUM)); | 1297 url1, blink::mojom::EngagementLevel::MEDIUM)); |
| 1319 EXPECT_FALSE( | 1298 EXPECT_FALSE( |
| 1320 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::HIGH)); | 1299 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::HIGH)); |
| 1321 EXPECT_FALSE( | 1300 EXPECT_FALSE( |
| 1322 service->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::MAX)); | 1301 service_->IsEngagementAtLeast(url1, blink::mojom::EngagementLevel::MAX)); |
| 1323 | 1302 |
| 1324 // Bring url2 to MEDIUM engagement. | 1303 // Bring url2 to MEDIUM engagement. |
| 1325 service->AddPoints(url2, 4.5); | 1304 service_->AddPoints(url2, 4.5); |
| 1326 EXPECT_EQ(blink::mojom::EngagementLevel::LOW, | 1305 EXPECT_EQ(blink::mojom::EngagementLevel::LOW, |
| 1327 service->GetEngagementLevel(url1)); | 1306 service_->GetEngagementLevel(url1)); |
| 1328 EXPECT_EQ(blink::mojom::EngagementLevel::MEDIUM, | 1307 EXPECT_EQ(blink::mojom::EngagementLevel::MEDIUM, |
| 1329 service->GetEngagementLevel(url2)); | 1308 service_->GetEngagementLevel(url2)); |
| 1330 EXPECT_TRUE( | 1309 EXPECT_TRUE( |
| 1331 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); | 1310 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); |
| 1332 EXPECT_TRUE(service->IsEngagementAtLeast( | 1311 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1333 url2, blink::mojom::EngagementLevel::MINIMAL)); | 1312 url2, blink::mojom::EngagementLevel::MINIMAL)); |
| 1334 EXPECT_TRUE( | 1313 EXPECT_TRUE( |
| 1335 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); | 1314 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); |
| 1336 EXPECT_TRUE(service->IsEngagementAtLeast( | 1315 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1337 url2, blink::mojom::EngagementLevel::MEDIUM)); | 1316 url2, blink::mojom::EngagementLevel::MEDIUM)); |
| 1338 EXPECT_FALSE( | 1317 EXPECT_FALSE( |
| 1339 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); | 1318 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); |
| 1340 EXPECT_FALSE( | 1319 EXPECT_FALSE( |
| 1341 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); | 1320 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); |
| 1342 | 1321 |
| 1343 // Bring url2 to HIGH engagement. | 1322 // Bring url2 to HIGH engagement. |
| 1344 for (int i = 0; i < 9; ++i) { | 1323 for (int i = 0; i < 9; ++i) { |
| 1345 current_day += base::TimeDelta::FromDays(1); | 1324 current_day += base::TimeDelta::FromDays(1); |
| 1346 clock->SetNow(current_day); | 1325 clock_->SetNow(current_day); |
| 1347 service->AddPoints(url2, 5.0); | 1326 service_->AddPoints(url2, 5.0); |
| 1348 } | 1327 } |
| 1349 EXPECT_EQ(blink::mojom::EngagementLevel::HIGH, | 1328 EXPECT_EQ(blink::mojom::EngagementLevel::HIGH, |
| 1350 service->GetEngagementLevel(url2)); | 1329 service_->GetEngagementLevel(url2)); |
| 1351 | 1330 |
| 1352 EXPECT_TRUE( | 1331 EXPECT_TRUE( |
| 1353 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); | 1332 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); |
| 1354 EXPECT_TRUE(service->IsEngagementAtLeast( | 1333 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1355 url2, blink::mojom::EngagementLevel::MINIMAL)); | 1334 url2, blink::mojom::EngagementLevel::MINIMAL)); |
| 1356 EXPECT_TRUE( | 1335 EXPECT_TRUE( |
| 1357 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); | 1336 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); |
| 1358 EXPECT_TRUE(service->IsEngagementAtLeast( | 1337 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1359 url2, blink::mojom::EngagementLevel::MEDIUM)); | 1338 url2, blink::mojom::EngagementLevel::MEDIUM)); |
| 1360 EXPECT_TRUE( | 1339 EXPECT_TRUE( |
| 1361 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); | 1340 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); |
| 1362 EXPECT_FALSE( | 1341 EXPECT_FALSE( |
| 1363 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); | 1342 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); |
| 1364 | 1343 |
| 1365 // Bring url2 to MAX engagement. | 1344 // Bring url2 to MAX engagement. |
| 1366 for (int i = 0; i < 10; ++i) { | 1345 for (int i = 0; i < 10; ++i) { |
| 1367 current_day += base::TimeDelta::FromDays(1); | 1346 current_day += base::TimeDelta::FromDays(1); |
| 1368 clock->SetNow(current_day); | 1347 clock_->SetNow(current_day); |
| 1369 service->AddPoints(url2, 5.0); | 1348 service_->AddPoints(url2, 5.0); |
| 1370 } | 1349 } |
| 1371 EXPECT_EQ(blink::mojom::EngagementLevel::MAX, | 1350 EXPECT_EQ(blink::mojom::EngagementLevel::MAX, |
| 1372 service->GetEngagementLevel(url2)); | 1351 service_->GetEngagementLevel(url2)); |
| 1373 EXPECT_TRUE( | 1352 EXPECT_TRUE( |
| 1374 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); | 1353 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::NONE)); |
| 1375 EXPECT_TRUE(service->IsEngagementAtLeast( | 1354 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1376 url2, blink::mojom::EngagementLevel::MINIMAL)); | 1355 url2, blink::mojom::EngagementLevel::MINIMAL)); |
| 1377 EXPECT_TRUE( | 1356 EXPECT_TRUE( |
| 1378 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); | 1357 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::LOW)); |
| 1379 EXPECT_TRUE(service->IsEngagementAtLeast( | 1358 EXPECT_TRUE(service_->IsEngagementAtLeast( |
| 1380 url2, blink::mojom::EngagementLevel::MEDIUM)); | 1359 url2, blink::mojom::EngagementLevel::MEDIUM)); |
| 1381 EXPECT_TRUE( | 1360 EXPECT_TRUE( |
| 1382 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); | 1361 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::HIGH)); |
| 1383 EXPECT_TRUE( | 1362 EXPECT_TRUE( |
| 1384 service->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); | 1363 service_->IsEngagementAtLeast(url2, blink::mojom::EngagementLevel::MAX)); |
| 1385 } | 1364 } |
| 1386 | 1365 |
| 1387 TEST_F(SiteEngagementServiceTest, Observers) { | 1366 TEST_F(SiteEngagementServiceTest, Observers) { |
| 1388 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 1367 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 1389 | 1368 |
| 1390 GURL url_score_1("http://www.google.com/maps"); | 1369 GURL url_score_1("http://www.google.com/maps"); |
| 1391 GURL url_score_2("http://www.google.com/drive"); | 1370 GURL url_score_2("http://www.google.com/drive"); |
| 1392 GURL url_score_3("http://www.google.com/"); | 1371 GURL url_score_3("http://www.google.com/"); |
| 1393 GURL url_not_called("https://www.google.com/"); | 1372 GURL url_not_called("https://www.google.com/"); |
| 1394 | 1373 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 service->HandleMediaPlaying(web_contents(), true); | 1420 service->HandleMediaPlaying(web_contents(), true); |
| 1442 tester.Wait(); | 1421 tester.Wait(); |
| 1443 | 1422 |
| 1444 EXPECT_TRUE(tester.callback_called()); | 1423 EXPECT_TRUE(tester.callback_called()); |
| 1445 EXPECT_FALSE(tester_not_called.callback_called()); | 1424 EXPECT_FALSE(tester_not_called.callback_called()); |
| 1446 tester.Observe(nullptr); | 1425 tester.Observe(nullptr); |
| 1447 } | 1426 } |
| 1448 } | 1427 } |
| 1449 | 1428 |
| 1450 TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) { | 1429 TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) { |
| 1451 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1452 std::unique_ptr<SiteEngagementService> service( | |
| 1453 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1454 | |
| 1455 base::Time current_day = GetReferenceTime(); | 1430 base::Time current_day = GetReferenceTime(); |
| 1456 clock->SetNow(current_day); | 1431 clock_->SetNow(current_day); |
| 1457 base::HistogramTester histograms; | 1432 base::HistogramTester histograms; |
| 1458 GURL origin1("http://www.google.com/"); | 1433 GURL origin1("http://www.google.com/"); |
| 1459 GURL origin2("http://drive.google.com/"); | 1434 GURL origin2("http://drive.google.com/"); |
| 1460 | 1435 |
| 1461 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1436 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1462 0); | 1437 0); |
| 1463 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1438 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1464 0); | 1439 0); |
| 1465 | 1440 |
| 1466 service->AddPoints(origin2, SiteEngagementScore::GetNavigationPoints()); | 1441 service_->AddPoints(origin2, SiteEngagementScore::GetNavigationPoints()); |
| 1467 | 1442 |
| 1468 // Max the score for origin1. | 1443 // Max the score for origin1. |
| 1469 for (int i = 0; i < kMoreDaysThanNeededToMaxTotalEngagement; ++i) { | 1444 for (int i = 0; i < kMoreDaysThanNeededToMaxTotalEngagement; ++i) { |
| 1470 current_day += base::TimeDelta::FromDays(1); | 1445 current_day += base::TimeDelta::FromDays(1); |
| 1471 clock->SetNow(current_day); | 1446 clock_->SetNow(current_day); |
| 1472 | 1447 |
| 1473 for (int j = 0; j < kMoreAccumulationsThanNeededToMaxDailyEngagement; ++j) | 1448 for (int j = 0; j < kMoreAccumulationsThanNeededToMaxDailyEngagement; ++j) |
| 1474 service->AddPoints(origin1, SiteEngagementScore::GetNavigationPoints()); | 1449 service_->AddPoints(origin1, SiteEngagementScore::GetNavigationPoints()); |
| 1475 } | 1450 } |
| 1476 | 1451 |
| 1477 EXPECT_EQ(SiteEngagementScore::kMaxPoints, service->GetScore(origin1)); | 1452 EXPECT_EQ(SiteEngagementScore::kMaxPoints, service_->GetScore(origin1)); |
| 1478 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1453 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1479 0); | 1454 0); |
| 1480 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1455 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1481 0); | 1456 0); |
| 1482 | 1457 |
| 1483 // Check histograms after one decay period. | 1458 // Check histograms after one decay period. |
| 1484 clock->SetNow( | 1459 clock_->SetNow( |
| 1485 current_day + | 1460 current_day + |
| 1486 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours())); | 1461 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours())); |
| 1487 | 1462 |
| 1488 // Trigger decay and histogram hit. | 1463 // Trigger decay and histogram hit. |
| 1489 service->AddPoints(origin1, 0.01); | 1464 service_->AddPoints(origin1, 0.01); |
| 1490 histograms.ExpectUniqueSample( | 1465 histograms.ExpectUniqueSample( |
| 1491 SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1466 SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1492 SiteEngagementScore::kMaxPoints, 1); | 1467 SiteEngagementScore::kMaxPoints, 1); |
| 1493 histograms.ExpectUniqueSample( | 1468 histograms.ExpectUniqueSample( |
| 1494 SiteEngagementMetrics::kScoreDecayedToHistogram, | 1469 SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1495 SiteEngagementScore::kMaxPoints - SiteEngagementScore::GetDecayPoints(), | 1470 SiteEngagementScore::kMaxPoints - SiteEngagementScore::GetDecayPoints(), |
| 1496 1); | 1471 1); |
| 1497 | 1472 |
| 1498 // Check histograms after another decay period. | 1473 // Check histograms after another decay period. |
| 1499 clock->SetNow(current_day + | 1474 clock_->SetNow(current_day + |
| 1500 base::TimeDelta::FromHours( | 1475 base::TimeDelta::FromHours( |
| 1501 2 * SiteEngagementScore::GetDecayPeriodInHours())); | 1476 2 * SiteEngagementScore::GetDecayPeriodInHours())); |
| 1502 // Trigger decay and histogram hit. | 1477 // Trigger decay and histogram hit. |
| 1503 service->AddPoints(origin1, 0.01); | 1478 service_->AddPoints(origin1, 0.01); |
| 1504 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1479 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1505 2); | 1480 2); |
| 1506 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1481 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1507 2); | 1482 2); |
| 1508 | 1483 |
| 1509 // Check decay to zero. Start at the 3rd decay period (we have had two | 1484 // Check decay to zero. Start at the 3rd decay period (we have had two |
| 1510 // already). This will be 40 decays in total. | 1485 // already). This will be 40 decays in total. |
| 1511 for (int i = 3; i <= kMorePeriodsThanNeededToDecayMaxScore; ++i) { | 1486 for (int i = 3; i <= kMorePeriodsThanNeededToDecayMaxScore; ++i) { |
| 1512 clock->SetNow(current_day + | 1487 clock_->SetNow(current_day + |
| 1513 base::TimeDelta::FromHours( | 1488 base::TimeDelta::FromHours( |
| 1514 i * SiteEngagementScore::GetDecayPeriodInHours())); | 1489 i * SiteEngagementScore::GetDecayPeriodInHours())); |
| 1515 // Trigger decay and histogram hit. | 1490 // Trigger decay and histogram hit. |
| 1516 service->AddPoints(origin1, 0.01); | 1491 service_->AddPoints(origin1, 0.01); |
| 1517 } | 1492 } |
| 1518 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1493 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1519 kMorePeriodsThanNeededToDecayMaxScore); | 1494 kMorePeriodsThanNeededToDecayMaxScore); |
| 1520 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1495 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1521 kMorePeriodsThanNeededToDecayMaxScore); | 1496 kMorePeriodsThanNeededToDecayMaxScore); |
| 1522 // It should have taken (20 - 3) = 17 of the 38 decays to get to zero, since | 1497 // It should have taken (20 - 3) = 17 of the 38 decays to get to zero, since |
| 1523 // we started from 95. Expect the remaining 21 decays to be to bucket 0 (and | 1498 // we started from 95. Expect the remaining 21 decays to be to bucket 0 (and |
| 1524 // hence 20 from bucket 0). | 1499 // hence 20 from bucket 0). |
| 1525 histograms.ExpectBucketCount( | 1500 histograms.ExpectBucketCount( |
| 1526 SiteEngagementMetrics::kScoreDecayedFromHistogram, 0, 20); | 1501 SiteEngagementMetrics::kScoreDecayedFromHistogram, 0, 20); |
| 1527 histograms.ExpectBucketCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1502 histograms.ExpectBucketCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1528 0, 21); | 1503 0, 21); |
| 1529 // Trigger decay and histogram hit for origin2, checking an independent decay. | 1504 // Trigger decay and histogram hit for origin2, checking an independent decay. |
| 1530 service->AddPoints(origin2, 0.01); | 1505 service_->AddPoints(origin2, 0.01); |
| 1531 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1506 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1532 kMorePeriodsThanNeededToDecayMaxScore + 1); | 1507 kMorePeriodsThanNeededToDecayMaxScore + 1); |
| 1533 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1508 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1534 kMorePeriodsThanNeededToDecayMaxScore + 1); | 1509 kMorePeriodsThanNeededToDecayMaxScore + 1); |
| 1535 histograms.ExpectBucketCount( | 1510 histograms.ExpectBucketCount( |
| 1536 SiteEngagementMetrics::kScoreDecayedFromHistogram, 0, 21); | 1511 SiteEngagementMetrics::kScoreDecayedFromHistogram, 0, 21); |
| 1537 histograms.ExpectBucketCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1512 histograms.ExpectBucketCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1538 0, 22); | 1513 0, 22); |
| 1539 | 1514 |
| 1540 // Add more points and ensure no more samples are present. | 1515 // Add more points and ensure no more samples are present. |
| 1541 service->AddPoints(origin1, 0.01); | 1516 service_->AddPoints(origin1, 0.01); |
| 1542 service->AddPoints(origin2, 0.01); | 1517 service_->AddPoints(origin2, 0.01); |
| 1543 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, | 1518 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, |
| 1544 kMorePeriodsThanNeededToDecayMaxScore + 1); | 1519 kMorePeriodsThanNeededToDecayMaxScore + 1); |
| 1545 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, | 1520 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, |
| 1546 kMorePeriodsThanNeededToDecayMaxScore + 1); | 1521 kMorePeriodsThanNeededToDecayMaxScore + 1); |
| 1547 } | 1522 } |
| 1548 | 1523 |
| 1549 TEST_F(SiteEngagementServiceTest, LastEngagementTime) { | 1524 TEST_F(SiteEngagementServiceTest, LastEngagementTime) { |
| 1550 // The last engagement time should start off null in prefs and in the service. | 1525 // The last engagement time should start off null in prefs and in the service. |
| 1551 base::Time last_engagement_time = base::Time::FromInternalValue( | 1526 base::Time last_engagement_time = base::Time::FromInternalValue( |
| 1552 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1527 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1553 | 1528 |
| 1554 ASSERT_TRUE(last_engagement_time.is_null()); | 1529 ASSERT_TRUE(last_engagement_time.is_null()); |
| 1555 | 1530 ASSERT_TRUE(service_->GetLastEngagementTime().is_null()); |
| 1556 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1557 std::unique_ptr<SiteEngagementService> service( | |
| 1558 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1559 | |
| 1560 ASSERT_TRUE(service->GetLastEngagementTime().is_null()); | |
| 1561 | 1531 |
| 1562 base::Time current_day = GetReferenceTime(); | 1532 base::Time current_day = GetReferenceTime(); |
| 1563 clock->SetNow(current_day); | 1533 clock_->SetNow(current_day); |
| 1564 | 1534 |
| 1565 // Add points should set the last engagement time in the service, and persist | 1535 // Add points should set the last engagement time in the service, and persist |
| 1566 // it to disk. | 1536 // it to disk. |
| 1567 GURL origin("http://www.google.com/"); | 1537 GURL origin("http://www.google.com/"); |
| 1568 service->AddPoints(origin, 1); | 1538 service_->AddPoints(origin, 1); |
| 1569 | 1539 |
| 1570 last_engagement_time = base::Time::FromInternalValue( | 1540 last_engagement_time = base::Time::FromInternalValue( |
| 1571 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1541 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1572 | 1542 |
| 1573 EXPECT_EQ(current_day, service->GetLastEngagementTime()); | 1543 EXPECT_EQ(current_day, service_->GetLastEngagementTime()); |
| 1574 EXPECT_EQ(current_day, last_engagement_time); | 1544 EXPECT_EQ(current_day, last_engagement_time); |
| 1575 | 1545 |
| 1576 // Running a cleanup and updating last engagement times should persist the | 1546 // Running a cleanup and updating last engagement times should persist the |
| 1577 // last engagement time to disk. | 1547 // last engagement time to disk. |
| 1578 current_day += service->GetStalePeriod(); | 1548 current_day += service_->GetStalePeriod(); |
| 1579 base::Time rebased_time = current_day - service->GetMaxDecayPeriod(); | 1549 base::Time rebased_time = current_day - service_->GetMaxDecayPeriod(); |
| 1580 clock->SetNow(current_day); | 1550 clock_->SetNow(current_day); |
| 1581 service->CleanupEngagementScores(true); | 1551 service_->CleanupEngagementScores(true); |
| 1582 | 1552 |
| 1583 last_engagement_time = base::Time::FromInternalValue( | 1553 last_engagement_time = base::Time::FromInternalValue( |
| 1584 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1554 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1585 | 1555 |
| 1586 EXPECT_EQ(rebased_time, last_engagement_time); | 1556 EXPECT_EQ(rebased_time, last_engagement_time); |
| 1587 EXPECT_EQ(rebased_time, service->GetLastEngagementTime()); | 1557 EXPECT_EQ(rebased_time, service_->GetLastEngagementTime()); |
| 1588 | 1558 |
| 1589 // Adding 0 points shouldn't update the last engagement time. | 1559 // Adding 0 points shouldn't update the last engagement time. |
| 1590 base::Time later_in_day = current_day + base::TimeDelta::FromSeconds(30); | 1560 base::Time later_in_day = current_day + base::TimeDelta::FromSeconds(30); |
| 1591 clock->SetNow(later_in_day); | 1561 clock_->SetNow(later_in_day); |
| 1592 service->AddPoints(origin, 0); | 1562 service_->AddPoints(origin, 0); |
| 1593 | 1563 |
| 1594 last_engagement_time = base::Time::FromInternalValue( | 1564 last_engagement_time = base::Time::FromInternalValue( |
| 1595 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1565 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1596 EXPECT_EQ(rebased_time, last_engagement_time); | 1566 EXPECT_EQ(rebased_time, last_engagement_time); |
| 1597 EXPECT_EQ(rebased_time, service->GetLastEngagementTime()); | 1567 EXPECT_EQ(rebased_time, service_->GetLastEngagementTime()); |
| 1598 | 1568 |
| 1599 // Add some more points and ensure the value is persisted. | 1569 // Add some more points and ensure the value is persisted. |
| 1600 service->AddPoints(origin, 3); | 1570 service_->AddPoints(origin, 3); |
| 1601 | 1571 |
| 1602 last_engagement_time = base::Time::FromInternalValue( | 1572 last_engagement_time = base::Time::FromInternalValue( |
| 1603 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1573 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1604 | 1574 |
| 1605 EXPECT_EQ(later_in_day, last_engagement_time); | 1575 EXPECT_EQ(later_in_day, last_engagement_time); |
| 1606 EXPECT_EQ(later_in_day, service->GetLastEngagementTime()); | 1576 EXPECT_EQ(later_in_day, service_->GetLastEngagementTime()); |
| 1607 } | 1577 } |
| 1608 | 1578 |
| 1609 TEST_F(SiteEngagementServiceTest, CleanupMovesScoreBackToNow) { | 1579 TEST_F(SiteEngagementServiceTest, CleanupMovesScoreBackToNow) { |
| 1610 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1611 std::unique_ptr<SiteEngagementService> service( | |
| 1612 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1613 base::Time last_engagement_time; | 1580 base::Time last_engagement_time; |
| 1614 | 1581 |
| 1615 base::Time current_day = GetReferenceTime(); | 1582 base::Time current_day = GetReferenceTime(); |
| 1616 clock->SetNow(current_day); | 1583 clock_->SetNow(current_day); |
| 1617 | 1584 |
| 1618 GURL origin("http://www.google.com/"); | 1585 GURL origin("http://www.google.com/"); |
| 1619 service->AddPoints(origin, 1); | 1586 service_->AddPoints(origin, 1); |
| 1620 EXPECT_EQ(1, service->GetScore(origin)); | 1587 EXPECT_EQ(1, service_->GetScore(origin)); |
| 1621 EXPECT_EQ(current_day, service->GetLastEngagementTime()); | 1588 EXPECT_EQ(current_day, service_->GetLastEngagementTime()); |
| 1622 | 1589 |
| 1623 // Send the clock back in time before the stale period and add engagement for | 1590 // Send the clock back in time before the stale period and add engagement for |
| 1624 // a new origin. Ensure that the original origin has its last engagement time | 1591 // a new origin. Ensure that the original origin has its last engagement time |
| 1625 // updated to now as a result. | 1592 // updated to now as a result. |
| 1626 base::Time before_stale_period = | 1593 base::Time before_stale_period = clock_->Now() - service_->GetStalePeriod() - |
| 1627 clock->Now() - service->GetStalePeriod() - service->GetMaxDecayPeriod(); | 1594 service_->GetMaxDecayPeriod(); |
| 1628 clock->SetNow(before_stale_period); | 1595 clock_->SetNow(before_stale_period); |
| 1629 | 1596 |
| 1630 GURL origin1("http://maps.google.com/"); | 1597 GURL origin1("http://maps.google.com/"); |
| 1631 service->AddPoints(origin1, 1); | 1598 service_->AddPoints(origin1, 1); |
| 1632 | 1599 |
| 1633 EXPECT_EQ(before_stale_period, | 1600 EXPECT_EQ(before_stale_period, |
| 1634 service->CreateEngagementScore(origin).last_engagement_time()); | 1601 service_->CreateEngagementScore(origin).last_engagement_time()); |
| 1635 EXPECT_EQ(before_stale_period, service->GetLastEngagementTime()); | 1602 EXPECT_EQ(before_stale_period, service_->GetLastEngagementTime()); |
| 1636 EXPECT_EQ(1, service->GetScore(origin)); | 1603 EXPECT_EQ(1, service_->GetScore(origin)); |
| 1637 EXPECT_EQ(1, service->GetScore(origin1)); | 1604 EXPECT_EQ(1, service_->GetScore(origin1)); |
| 1638 | 1605 |
| 1639 // Advance within a decay period and add points. | 1606 // Advance within a decay period and add points. |
| 1640 base::TimeDelta less_than_decay_period = | 1607 base::TimeDelta less_than_decay_period = |
| 1641 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours()) - | 1608 base::TimeDelta::FromHours(SiteEngagementScore::GetDecayPeriodInHours()) - |
| 1642 base::TimeDelta::FromSeconds(30); | 1609 base::TimeDelta::FromSeconds(30); |
| 1643 base::Time origin1_last_updated = clock->Now() + less_than_decay_period; | 1610 base::Time origin1_last_updated = clock_->Now() + less_than_decay_period; |
| 1644 clock->SetNow(origin1_last_updated); | 1611 clock_->SetNow(origin1_last_updated); |
| 1645 service->AddPoints(origin, 1); | 1612 service_->AddPoints(origin, 1); |
| 1646 service->AddPoints(origin1, 5); | 1613 service_->AddPoints(origin1, 5); |
| 1647 EXPECT_EQ(2, service->GetScore(origin)); | 1614 EXPECT_EQ(2, service_->GetScore(origin)); |
| 1648 EXPECT_EQ(6, service->GetScore(origin1)); | 1615 EXPECT_EQ(6, service_->GetScore(origin1)); |
| 1649 | 1616 |
| 1650 clock->SetNow(clock->Now() + less_than_decay_period); | 1617 clock_->SetNow(clock_->Now() + less_than_decay_period); |
| 1651 service->AddPoints(origin, 5); | 1618 service_->AddPoints(origin, 5); |
| 1652 EXPECT_EQ(7, service->GetScore(origin)); | 1619 EXPECT_EQ(7, service_->GetScore(origin)); |
| 1653 | 1620 |
| 1654 // Move forward to the max number of decays per score. This is within the | 1621 // Move forward to the max number of decays per score. This is within the |
| 1655 // stale period so no cleanup should be run. | 1622 // stale period so no cleanup should be run. |
| 1656 for (int i = 0; i < SiteEngagementScore::GetMaxDecaysPerScore(); ++i) { | 1623 for (int i = 0; i < SiteEngagementScore::GetMaxDecaysPerScore(); ++i) { |
| 1657 clock->SetNow(clock->Now() + less_than_decay_period); | 1624 clock_->SetNow(clock_->Now() + less_than_decay_period); |
| 1658 service->AddPoints(origin, 5); | 1625 service_->AddPoints(origin, 5); |
| 1659 EXPECT_EQ(clock->Now(), service->GetLastEngagementTime()); | 1626 EXPECT_EQ(clock_->Now(), service_->GetLastEngagementTime()); |
| 1660 } | 1627 } |
| 1661 EXPECT_EQ(12, service->GetScore(origin)); | 1628 EXPECT_EQ(12, service_->GetScore(origin)); |
| 1662 EXPECT_EQ(clock->Now(), service->GetLastEngagementTime()); | 1629 EXPECT_EQ(clock_->Now(), service_->GetLastEngagementTime()); |
| 1663 | 1630 |
| 1664 // Move the clock back to precisely 1 decay period after origin1's last | 1631 // Move the clock back to precisely 1 decay period after origin1's last |
| 1665 // updated time. |last_engagement_time| is in the future, so AddPoints | 1632 // updated time. |last_engagement_time| is in the future, so AddPoints |
| 1666 // triggers a cleanup. Ensure that |last_engagement_time| is moved back | 1633 // triggers a cleanup. Ensure that |last_engagement_time| is moved back |
| 1667 // appropriately, while origin1 is decayed correctly (once). | 1634 // appropriately, while origin1 is decayed correctly (once). |
| 1668 clock->SetNow(origin1_last_updated + less_than_decay_period + | 1635 clock_->SetNow(origin1_last_updated + less_than_decay_period + |
| 1669 base::TimeDelta::FromSeconds(30)); | 1636 base::TimeDelta::FromSeconds(30)); |
| 1670 service->AddPoints(origin1, 1); | 1637 service_->AddPoints(origin1, 1); |
| 1671 | 1638 |
| 1672 EXPECT_EQ(clock->Now(), | 1639 EXPECT_EQ(clock_->Now(), |
| 1673 service->CreateEngagementScore(origin).last_engagement_time()); | 1640 service_->CreateEngagementScore(origin).last_engagement_time()); |
| 1674 EXPECT_EQ(clock->Now(), service->GetLastEngagementTime()); | 1641 EXPECT_EQ(clock_->Now(), service_->GetLastEngagementTime()); |
| 1675 EXPECT_EQ(12, service->GetScore(origin)); | 1642 EXPECT_EQ(12, service_->GetScore(origin)); |
| 1676 EXPECT_EQ(1, service->GetScore(origin1)); | 1643 EXPECT_EQ(1, service_->GetScore(origin1)); |
| 1677 } | 1644 } |
| 1678 | 1645 |
| 1679 TEST_F(SiteEngagementServiceTest, CleanupMovesScoreBackToRebase) { | 1646 TEST_F(SiteEngagementServiceTest, CleanupMovesScoreBackToRebase) { |
| 1680 base::SimpleTestClock* clock = new base::SimpleTestClock(); | |
| 1681 std::unique_ptr<SiteEngagementService> service( | |
| 1682 new SiteEngagementService(profile(), base::WrapUnique(clock))); | |
| 1683 base::Time last_engagement_time; | 1647 base::Time last_engagement_time; |
| 1684 | 1648 |
| 1685 base::Time current_day = GetReferenceTime(); | 1649 base::Time current_day = GetReferenceTime(); |
| 1686 clock->SetNow(current_day); | 1650 clock_->SetNow(current_day); |
| 1687 | 1651 |
| 1688 GURL origin("http://www.google.com/"); | 1652 GURL origin("http://www.google.com/"); |
| 1689 service->ResetBaseScoreForURL(origin, 5); | 1653 service_->ResetBaseScoreForURL(origin, 5); |
| 1690 service->AddPoints(origin, 5); | 1654 service_->AddPoints(origin, 5); |
| 1691 EXPECT_EQ(10, service->GetScore(origin)); | 1655 EXPECT_EQ(10, service_->GetScore(origin)); |
| 1692 EXPECT_EQ(current_day, service->GetLastEngagementTime()); | 1656 EXPECT_EQ(current_day, service_->GetLastEngagementTime()); |
| 1693 | 1657 |
| 1694 // Send the clock back in time before the stale period and add engagement for | 1658 // Send the clock back in time before the stale period and add engagement for |
| 1695 // a new origin. | 1659 // a new origin. |
| 1696 base::Time before_stale_period = | 1660 base::Time before_stale_period = clock_->Now() - service_->GetStalePeriod() - |
| 1697 clock->Now() - service->GetStalePeriod() - service->GetMaxDecayPeriod(); | 1661 service_->GetMaxDecayPeriod(); |
| 1698 clock->SetNow(before_stale_period); | 1662 clock_->SetNow(before_stale_period); |
| 1699 | 1663 |
| 1700 GURL origin1("http://maps.google.com/"); | 1664 GURL origin1("http://maps.google.com/"); |
| 1701 service->AddPoints(origin1, 1); | 1665 service_->AddPoints(origin1, 1); |
| 1702 | 1666 |
| 1703 EXPECT_EQ(before_stale_period, service->GetLastEngagementTime()); | 1667 EXPECT_EQ(before_stale_period, service_->GetLastEngagementTime()); |
| 1704 | 1668 |
| 1705 // Set the clock such that |origin|'s last engagement time is between | 1669 // Set the clock such that |origin|'s last engagement time is between |
| 1706 // last_engagement_time and rebase_time. | 1670 // last_engagement_time and rebase_time. |
| 1707 clock->SetNow(current_day + service->GetStalePeriod() + | 1671 clock_->SetNow(current_day + service_->GetStalePeriod() + |
| 1708 service->GetMaxDecayPeriod() - | 1672 service_->GetMaxDecayPeriod() - |
| 1709 base::TimeDelta::FromSeconds((30))); | 1673 base::TimeDelta::FromSeconds((30))); |
| 1710 base::Time rebased_time = clock->Now() - service->GetMaxDecayPeriod(); | 1674 base::Time rebased_time = clock_->Now() - service_->GetMaxDecayPeriod(); |
| 1711 service->CleanupEngagementScores(true); | 1675 service_->CleanupEngagementScores(true); |
| 1712 | 1676 |
| 1713 // Ensure that the original origin has its last engagement time updated to | 1677 // Ensure that the original origin has its last engagement time updated to |
| 1714 // rebase_time, and it has decayed when we access the score. | 1678 // rebase_time, and it has decayed when we access the score. |
| 1715 EXPECT_EQ(rebased_time, | 1679 EXPECT_EQ(rebased_time, |
| 1716 service->CreateEngagementScore(origin).last_engagement_time()); | 1680 service_->CreateEngagementScore(origin).last_engagement_time()); |
| 1717 EXPECT_EQ(rebased_time, service->GetLastEngagementTime()); | 1681 EXPECT_EQ(rebased_time, service_->GetLastEngagementTime()); |
| 1718 EXPECT_EQ(5, service->GetScore(origin)); | 1682 EXPECT_EQ(5, service_->GetScore(origin)); |
| 1719 EXPECT_EQ(0, service->GetScore(origin1)); | 1683 EXPECT_EQ(0, service_->GetScore(origin1)); |
| 1720 } | 1684 } |
| 1721 | 1685 |
| 1722 TEST_F(SiteEngagementServiceTest, IncognitoEngagementService) { | 1686 TEST_F(SiteEngagementServiceTest, IncognitoEngagementService) { |
| 1723 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 1687 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 1724 ASSERT_TRUE(service); | 1688 ASSERT_TRUE(service); |
| 1725 | 1689 |
| 1726 GURL url1("http://www.google.com/"); | 1690 GURL url1("http://www.google.com/"); |
| 1727 GURL url2("https://www.google.com/"); | 1691 GURL url2("https://www.google.com/"); |
| 1728 GURL url3("https://drive.google.com/"); | 1692 GURL url3("https://drive.google.com/"); |
| 1729 GURL url4("https://maps.google.com/"); | 1693 GURL url4("https://maps.google.com/"); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1809 | 1773 |
| 1810 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::IO, | 1774 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::IO, |
| 1811 settings_map, url1)); | 1775 settings_map, url1)); |
| 1812 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::FILE, | 1776 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::FILE, |
| 1813 settings_map, url2)); | 1777 settings_map, url2)); |
| 1814 EXPECT_EQ(4, CheckScoreFromSettingsOnThread(content::BrowserThread::FILE, | 1778 EXPECT_EQ(4, CheckScoreFromSettingsOnThread(content::BrowserThread::FILE, |
| 1815 incognito_settings_map, url1)); | 1779 incognito_settings_map, url1)); |
| 1816 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::IO, | 1780 EXPECT_EQ(3, CheckScoreFromSettingsOnThread(content::BrowserThread::IO, |
| 1817 incognito_settings_map, url2)); | 1781 incognito_settings_map, url2)); |
| 1818 } | 1782 } |
| OLD | NEW |