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 "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/test/histogram_tester.h" |
6 #include "base/test/simple_test_clock.h" | 7 #include "base/test/simple_test_clock.h" |
7 #include "base/values.h" | 8 #include "base/values.h" |
8 #include "chrome/browser/engagement/site_engagement_helper.h" | 9 #include "chrome/browser/engagement/site_engagement_helper.h" |
| 10 #include "chrome/browser/engagement/site_engagement_metrics.h" |
9 #include "chrome/browser/engagement/site_engagement_service.h" | 11 #include "chrome/browser/engagement/site_engagement_service.h" |
10 #include "chrome/browser/engagement/site_engagement_service_factory.h" | 12 #include "chrome/browser/engagement/site_engagement_service_factory.h" |
11 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
12 #include "chrome/test/base/browser_with_test_window_test.h" | 14 #include "chrome/test/base/browser_with_test_window_test.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 namespace { | 17 namespace { |
16 | 18 |
17 const int kLessAccumulationsThanNeededToMaxDailyEngagement = 2; | 19 const int kLessAccumulationsThanNeededToMaxDailyEngagement = 2; |
18 const int kMoreAccumulationsThanNeededToMaxDailyEngagement = 40; | 20 const int kMoreAccumulationsThanNeededToMaxDailyEngagement = 40; |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 EXPECT_LT(prev_score, service->GetScore(url)); | 340 EXPECT_LT(prev_score, service->GetScore(url)); |
339 prev_score = service->GetScore(url); | 341 prev_score = service->GetScore(url); |
340 | 342 |
341 NavigateAndCommitActiveTab(url); | 343 NavigateAndCommitActiveTab(url); |
342 EXPECT_LT(prev_score, service->GetScore(url)); | 344 EXPECT_LT(prev_score, service->GetScore(url)); |
343 } | 345 } |
344 | 346 |
345 // Expect that site engagement scores for several sites are correctly aggregated | 347 // Expect that site engagement scores for several sites are correctly aggregated |
346 // by GetTotalEngagementPoints(). | 348 // by GetTotalEngagementPoints(). |
347 TEST_F(SiteEngagementServiceTest, GetTotalNavigationPoints) { | 349 TEST_F(SiteEngagementServiceTest, GetTotalNavigationPoints) { |
348 SiteEngagementService* service = | 350 base::SimpleTestClock* clock = new base::SimpleTestClock(); |
349 SiteEngagementServiceFactory::GetForProfile(profile()); | 351 scoped_ptr<SiteEngagementService> service( |
350 DCHECK(service); | 352 new SiteEngagementService(profile(), make_scoped_ptr(clock))); |
| 353 |
| 354 base::Time current_day = GetReferenceTime(); |
| 355 clock->SetNow(current_day); |
| 356 |
| 357 base::HistogramTester histograms; |
| 358 |
| 359 // Histograms should start empty. |
| 360 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 361 0); |
| 362 histograms.ExpectTotalCount( |
| 363 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0); |
| 364 histograms.ExpectTotalCount( |
| 365 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0); |
351 | 366 |
352 // The https and http versions of www.google.com should be separate. | 367 // The https and http versions of www.google.com should be separate. |
353 GURL url1("https://www.google.com/"); | 368 GURL url1("https://www.google.com/"); |
354 GURL url2("http://www.google.com/"); | 369 GURL url2("http://www.google.com/"); |
355 GURL url3("http://drive.google.com/"); | 370 GURL url3("http://drive.google.com/"); |
356 | 371 |
357 EXPECT_EQ(0, service->GetScore(url1)); | 372 EXPECT_EQ(0, service->GetScore(url1)); |
358 EXPECT_EQ(0, service->GetScore(url2)); | 373 EXPECT_EQ(0, service->GetScore(url2)); |
359 EXPECT_EQ(0, service->GetScore(url3)); | 374 EXPECT_EQ(0, service->GetScore(url3)); |
360 | 375 |
361 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); | 376 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); |
362 EXPECT_EQ(0.5, service->GetScore(url1)); | 377 EXPECT_EQ(0.5, service->GetScore(url1)); |
363 EXPECT_EQ(0.5, service->GetTotalEngagementPoints()); | 378 EXPECT_EQ(0.5, service->GetTotalEngagementPoints()); |
| 379 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 380 1); |
| 381 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 382 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 1); |
| 383 histograms.ExpectTotalCount( |
| 384 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 1); |
| 385 histograms.ExpectBucketCount( |
| 386 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 1); |
| 387 histograms.ExpectTotalCount( |
| 388 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 1); |
| 389 histograms.ExpectBucketCount( |
| 390 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 1); |
| 391 |
| 392 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(59)); |
364 | 393 |
365 service->HandleNavigation(url2, ui::PAGE_TRANSITION_GENERATED); | 394 service->HandleNavigation(url2, ui::PAGE_TRANSITION_GENERATED); |
366 service->HandleNavigation(url2, ui::PAGE_TRANSITION_AUTO_TOPLEVEL); | 395 service->HandleNavigation(url2, ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
367 EXPECT_EQ(1, service->GetScore(url2)); | 396 EXPECT_EQ(1, service->GetScore(url2)); |
368 EXPECT_EQ(1.5, service->GetTotalEngagementPoints()); | 397 EXPECT_EQ(1.5, service->GetTotalEngagementPoints()); |
| 398 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 399 3); |
| 400 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 401 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 3); |
| 402 histograms.ExpectTotalCount( |
| 403 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 1); |
| 404 histograms.ExpectTotalCount( |
| 405 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 1); |
| 406 |
| 407 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(60)); |
369 | 408 |
370 service->HandleNavigation(url3, ui::PAGE_TRANSITION_TYPED); | 409 service->HandleNavigation(url3, ui::PAGE_TRANSITION_TYPED); |
371 EXPECT_EQ(0.5, service->GetScore(url3)); | 410 EXPECT_EQ(0.5, service->GetScore(url3)); |
372 EXPECT_EQ(2, service->GetTotalEngagementPoints()); | 411 EXPECT_EQ(2, service->GetTotalEngagementPoints()); |
| 412 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 413 4); |
| 414 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 415 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 4); |
| 416 histograms.ExpectTotalCount( |
| 417 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 2); |
| 418 histograms.ExpectTotalCount( |
| 419 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 2); |
373 | 420 |
374 service->HandleNavigation(url1, ui::PAGE_TRANSITION_GENERATED); | 421 service->HandleNavigation(url1, ui::PAGE_TRANSITION_GENERATED); |
375 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); | 422 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); |
376 EXPECT_EQ(1.5, service->GetScore(url1)); | 423 EXPECT_EQ(1.5, service->GetScore(url1)); |
377 EXPECT_EQ(3, service->GetTotalEngagementPoints()); | 424 EXPECT_EQ(3, service->GetTotalEngagementPoints()); |
| 425 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 426 6); |
| 427 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 428 SiteEngagementMetrics::ENGAGEMENT_NAVIGATION, 6); |
| 429 histograms.ExpectTotalCount( |
| 430 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 2); |
| 431 histograms.ExpectBucketCount( |
| 432 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 2); |
| 433 histograms.ExpectTotalCount( |
| 434 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 2); |
| 435 histograms.ExpectBucketCount( |
| 436 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 2); |
| 437 |
| 438 // Advance an origin to the max for a day and advance the clock an hour before |
| 439 // the last increment before max. Expect the histogram to be updated. |
| 440 for (int i = 0; i < 6; ++i) |
| 441 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); |
| 442 |
| 443 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(121)); |
| 444 service->HandleNavigation(url1, ui::PAGE_TRANSITION_TYPED); |
| 445 |
| 446 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 447 13); |
| 448 histograms.ExpectTotalCount( |
| 449 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 3); |
| 450 histograms.ExpectBucketCount( |
| 451 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 2); |
| 452 histograms.ExpectBucketCount( |
| 453 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 1, 1); |
| 454 histograms.ExpectTotalCount( |
| 455 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 3); |
| 456 histograms.ExpectBucketCount( |
| 457 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 3); |
378 } | 458 } |
379 | 459 |
380 TEST_F(SiteEngagementServiceTest, GetTotalUserInputPoints) { | 460 TEST_F(SiteEngagementServiceTest, GetTotalUserInputPoints) { |
381 SiteEngagementService* service = | 461 base::SimpleTestClock* clock = new base::SimpleTestClock(); |
382 SiteEngagementServiceFactory::GetForProfile(profile()); | 462 scoped_ptr<SiteEngagementService> service( |
383 DCHECK(service); | 463 new SiteEngagementService(profile(), make_scoped_ptr(clock))); |
| 464 |
| 465 base::Time current_day = GetReferenceTime(); |
| 466 clock->SetNow(current_day); |
| 467 |
| 468 base::HistogramTester histograms; |
| 469 |
| 470 // Histograms should start off empty. |
| 471 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 472 0); |
| 473 histograms.ExpectTotalCount( |
| 474 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0); |
| 475 histograms.ExpectTotalCount( |
| 476 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0); |
384 | 477 |
385 // The https and http versions of www.google.com should be separate. | 478 // The https and http versions of www.google.com should be separate. |
386 GURL url1("https://www.google.com/"); | 479 GURL url1("https://www.google.com/"); |
387 GURL url2("http://www.google.com/"); | 480 GURL url2("http://www.google.com/"); |
388 GURL url3("http://drive.google.com/"); | 481 GURL url3("http://drive.google.com/"); |
389 | 482 |
390 EXPECT_EQ(0, service->GetScore(url1)); | 483 EXPECT_EQ(0, service->GetScore(url1)); |
391 EXPECT_EQ(0, service->GetScore(url2)); | 484 EXPECT_EQ(0, service->GetScore(url2)); |
392 EXPECT_EQ(0, service->GetScore(url3)); | 485 EXPECT_EQ(0, service->GetScore(url3)); |
393 | 486 |
394 service->HandleUserInput(url1); | 487 service->HandleUserInput(url1, SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
395 EXPECT_DOUBLE_EQ(0.05, service->GetScore(url1)); | 488 EXPECT_DOUBLE_EQ(0.05, service->GetScore(url1)); |
396 EXPECT_DOUBLE_EQ(0.05, service->GetTotalEngagementPoints()); | 489 EXPECT_DOUBLE_EQ(0.05, service->GetTotalEngagementPoints()); |
| 490 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 491 1); |
| 492 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 493 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 1); |
| 494 histograms.ExpectTotalCount( |
| 495 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 1); |
| 496 histograms.ExpectBucketCount( |
| 497 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 1); |
| 498 histograms.ExpectTotalCount( |
| 499 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 1); |
| 500 histograms.ExpectBucketCount( |
| 501 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 1); |
397 | 502 |
398 service->HandleUserInput(url2); | 503 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(45)); |
399 service->HandleUserInput(url2); | 504 service->HandleUserInput(url2, SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
| 505 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(60)); |
| 506 service->HandleUserInput(url2, SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
400 EXPECT_DOUBLE_EQ(0.1, service->GetScore(url2)); | 507 EXPECT_DOUBLE_EQ(0.1, service->GetScore(url2)); |
401 EXPECT_DOUBLE_EQ(0.15, service->GetTotalEngagementPoints()); | 508 EXPECT_DOUBLE_EQ(0.15, service->GetTotalEngagementPoints()); |
| 509 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 510 3); |
| 511 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 512 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 2); |
| 513 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 514 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 1); |
| 515 histograms.ExpectTotalCount( |
| 516 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 2); |
| 517 histograms.ExpectBucketCount( |
| 518 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 2); |
| 519 histograms.ExpectTotalCount( |
| 520 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 2); |
| 521 histograms.ExpectBucketCount( |
| 522 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 2); |
402 | 523 |
403 service->HandleUserInput(url3); | 524 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(150)); |
| 525 service->HandleUserInput(url3, SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
404 EXPECT_DOUBLE_EQ(0.05, service->GetScore(url3)); | 526 EXPECT_DOUBLE_EQ(0.05, service->GetScore(url3)); |
405 EXPECT_DOUBLE_EQ(0.2, service->GetTotalEngagementPoints()); | 527 EXPECT_DOUBLE_EQ(0.2, service->GetTotalEngagementPoints()); |
| 528 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 529 4); |
| 530 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 531 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 2); |
| 532 histograms.ExpectTotalCount( |
| 533 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 3); |
| 534 histograms.ExpectBucketCount( |
| 535 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 3); |
| 536 histograms.ExpectTotalCount( |
| 537 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 3); |
| 538 histograms.ExpectBucketCount( |
| 539 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 3); |
406 | 540 |
407 service->HandleUserInput(url1); | 541 service->HandleUserInput(url1, SiteEngagementMetrics::ENGAGEMENT_KEYPRESS); |
408 service->HandleUserInput(url1); | 542 service->HandleUserInput(url1, SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
409 EXPECT_DOUBLE_EQ(0.15, service->GetScore(url1)); | 543 EXPECT_DOUBLE_EQ(0.15, service->GetScore(url1)); |
410 EXPECT_DOUBLE_EQ(0.3, service->GetTotalEngagementPoints()); | 544 EXPECT_DOUBLE_EQ(0.3, service->GetTotalEngagementPoints()); |
| 545 histograms.ExpectTotalCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 546 6); |
| 547 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 548 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 3); |
| 549 histograms.ExpectBucketCount(SiteEngagementMetrics::kEngagementTypeHistogram, |
| 550 SiteEngagementMetrics::ENGAGEMENT_KEYPRESS, 3); |
| 551 |
| 552 // Advance an origin to the max and ensure the histogram is correctly |
| 553 // incremented. |
| 554 for (int i = 0; i < 1996; ++i) |
| 555 service->HandleUserInput(url1, SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
| 556 clock->SetNow(GetReferenceTime() + base::TimeDelta::FromMinutes(210)); |
| 557 service->HandleUserInput(url1, SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
| 558 |
| 559 histograms.ExpectTotalCount( |
| 560 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 4); |
| 561 histograms.ExpectBucketCount( |
| 562 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 0, 3); |
| 563 histograms.ExpectBucketCount( |
| 564 SiteEngagementMetrics::kOriginsWithMaxDailyEngagementHistogram, 1, 1); |
| 565 histograms.ExpectTotalCount( |
| 566 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 4); |
| 567 histograms.ExpectBucketCount( |
| 568 SiteEngagementMetrics::kOriginsWithMaxEngagementHistogram, 0, 4); |
411 } | 569 } |
412 | 570 |
413 // Expect that sites that have reached zero engagement are cleaned up. | 571 // Expect that sites that have reached zero engagement are cleaned up. |
414 TEST_F(SiteEngagementServiceTest, CleanupEngagementScores) { | 572 TEST_F(SiteEngagementServiceTest, CleanupEngagementScores) { |
415 base::SimpleTestClock* clock = new base::SimpleTestClock(); | 573 base::SimpleTestClock* clock = new base::SimpleTestClock(); |
416 scoped_ptr<SiteEngagementService> service( | 574 scoped_ptr<SiteEngagementService> service( |
417 new SiteEngagementService(profile(), make_scoped_ptr(clock))); | 575 new SiteEngagementService(profile(), make_scoped_ptr(clock))); |
418 | 576 |
419 base::Time current_day = GetReferenceTime(); | 577 base::Time current_day = GetReferenceTime(); |
420 clock->SetNow(current_day); | 578 clock->SetNow(current_day); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 EXPECT_EQ(1u, score_map.size()); | 628 EXPECT_EQ(1u, score_map.size()); |
471 EXPECT_EQ(0, score_map[url1]); | 629 EXPECT_EQ(0, score_map[url1]); |
472 | 630 |
473 service->CleanupEngagementScores(); | 631 service->CleanupEngagementScores(); |
474 | 632 |
475 score_map = service->GetScoreMap(); | 633 score_map = service->GetScoreMap(); |
476 EXPECT_EQ(0u, score_map.size()); | 634 EXPECT_EQ(0u, score_map.size()); |
477 EXPECT_EQ(0, service->GetScore(url1)); | 635 EXPECT_EQ(0, service->GetScore(url1)); |
478 } | 636 } |
479 } | 637 } |
OLD | NEW |