| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <vector> |
| |
| #include "base/command_line.h" |
| #include "chrome/browser/banners/app_banner_metrics.h" |
| #include "chrome/browser/banners/app_banner_settings_helper.h" |
| #include "chrome/browser/engagement/site_engagement_service.h" |
| #include "chrome/browser/installable/installable_logging.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "ui/base/page_transition_types.h" |
| |
| namespace { |
| |
| const char kTestURL[] = "https://www.google.com"; |
| const char kSameOriginTestURL[] = "https://www.google.com/foo.html"; |
| const char kDifferentOriginTestURL[] = "https://www.example.com"; |
| const char kTestPackageName[] = "test.package"; |
| |
| base::Time GetReferenceTime() { |
| base::Time::Exploded exploded_reference_time; |
| exploded_reference_time.year = 2015; |
| exploded_reference_time.month = 1; |
| exploded_reference_time.day_of_month = 30; |
| exploded_reference_time.day_of_week = 5; |
| exploded_reference_time.hour = 11; |
| exploded_reference_time.minute = 0; |
| exploded_reference_time.second = 0; |
| exploded_reference_time.millisecond = 0; |
| |
| base::Time out_time; |
| EXPECT_TRUE( |
| base::Time::FromLocalExploded(exploded_reference_time, &out_time)); |
| return out_time; |
| } |
| |
| bool IsWithinDay(base::Time time1, base::Time time2) { |
| return time1 - time2 < base::TimeDelta::FromDays(1) || |
| time2 - time1 < base::TimeDelta::FromDays(1); |
| } |
| |
| bool IsWithinHour(base::Time time1, base::Time time2) { |
| return time1 - time2 < base::TimeDelta::FromHours(1) || |
| time2 - time1 < base::TimeDelta::FromHours(1); |
| } |
| |
| class AppBannerSettingsHelperTest : public ChromeRenderViewHostTestHarness { |
| void SetUp() override { |
| ChromeRenderViewHostTestHarness::SetUp(); |
| AppBannerSettingsHelper::SetDefaultParameters(); |
| } |
| }; |
| |
| } // namespace |
| |
| TEST_F(AppBannerSettingsHelperTest, BucketTimeToResolutionInvalid) { |
| base::Time reference_time = GetReferenceTime(); |
| |
| // Test null, 1 day, and greater than 1 day cases. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 0), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 1440), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 2880), |
| reference_time.LocalMidnight()); |
| |
| // Test number of minutes in 1 day + 1. |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 1441), |
| reference_time.LocalMidnight()); |
| |
| // Test minutes which are not divisible by 1440 (minutes in a day). |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 7), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 13), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 21), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 35), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 42), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 50), |
| reference_time.LocalMidnight()); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 59), |
| reference_time.LocalMidnight()); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, BucketTimeToResolutionValid) { |
| // 11:00 |
| base::Time reference_time = GetReferenceTime(); |
| // 13:44 |
| base::Time same_day_later = |
| reference_time + base::TimeDelta::FromMinutes(164); |
| // 10:18 |
| base::Time same_day_earlier = |
| reference_time - base::TimeDelta::FromMinutes(42); |
| base::Time midnight = reference_time.LocalMidnight(); |
| base::Time bucketed_hour = midnight + base::TimeDelta::FromHours(11); |
| base::Time bucketed_hour_later = midnight + base::TimeDelta::FromHours(13); |
| base::Time bucketed_hour_earlier = midnight + base::TimeDelta::FromHours(10); |
| |
| // Resolution of 1 minute: 11:00, 13:44, 10:18. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 1), |
| bucketed_hour); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 1), |
| bucketed_hour_later + base::TimeDelta::FromMinutes(44)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 1), |
| bucketed_hour_earlier + base::TimeDelta::FromMinutes(18)); |
| |
| // Resolution of 3 minutes: 11:00, 13:43, 10:18. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 3), |
| bucketed_hour); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 3), |
| bucketed_hour_later + base::TimeDelta::FromMinutes(42)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 3), |
| bucketed_hour_earlier + base::TimeDelta::FromMinutes(18)); |
| |
| // Resolution of 10 minutes: 11:00, 13:40, 10:10. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 10), |
| bucketed_hour); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 10), |
| bucketed_hour_later + base::TimeDelta::FromMinutes(40)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 10), |
| bucketed_hour_earlier + base::TimeDelta::FromMinutes(10)); |
| |
| // Resolution of 20 minutes: 11:00, 13:40, 10:00. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 20), |
| bucketed_hour); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 20), |
| bucketed_hour_later + base::TimeDelta::FromMinutes(40)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 20), |
| bucketed_hour_earlier); |
| |
| // Resolution of 60 minutes: 11:00, 13:00, 10:00. |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 60), |
| bucketed_hour); |
| EXPECT_EQ(AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 60), |
| bucketed_hour_later); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 60), |
| bucketed_hour_earlier); |
| |
| // Resolution of 120 minutes: 10:00, 12:00, 10:00. |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 120), |
| bucketed_hour_earlier); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 120), |
| bucketed_hour_later - base::TimeDelta::FromHours(1)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 120), |
| bucketed_hour_earlier); |
| |
| // Resolution of 180 minutes: 9:00, 12:00, 9:00. |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 180), |
| bucketed_hour_earlier - base::TimeDelta::FromHours(1)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 180), |
| bucketed_hour_later - base::TimeDelta::FromHours(1)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 180), |
| bucketed_hour_earlier - base::TimeDelta::FromHours(1)); |
| |
| // Resolution of 240 minutes: 8:00, 12:00, 8:00. |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 240), |
| midnight + base::TimeDelta::FromHours(8)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 240), |
| midnight + base::TimeDelta::FromHours(12)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 240), |
| midnight + base::TimeDelta::FromHours(8)); |
| |
| // Resolution of 360 minutes: 6:00, 12:00, 6:00 |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 360), |
| midnight + base::TimeDelta::FromHours(6)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 360), |
| midnight + base::TimeDelta::FromHours(12)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 360), |
| midnight + base::TimeDelta::FromHours(6)); |
| |
| // Resolution of 720 minutes: 0:00, 12:00, 0:00 |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 720), |
| midnight); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 720), |
| midnight + base::TimeDelta::FromHours(12)); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 720), |
| midnight); |
| |
| // Resolution of 1440 minutes: 0:00, 0:00, 0:00 |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(reference_time, 1440), |
| midnight); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_later, 1440), |
| midnight); |
| EXPECT_EQ( |
| AppBannerSettingsHelper::BucketTimeToResolution(same_day_earlier, 1440), |
| midnight); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, CouldShowEvents) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| // Check that by default, there are no events recorded. |
| std::vector<AppBannerSettingsHelper::BannerEvent> events = |
| AppBannerSettingsHelper::GetCouldShowBannerEvents(web_contents(), url, |
| kTestPackageName); |
| EXPECT_TRUE(events.empty()); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time same_day = reference_time + base::TimeDelta::FromHours(2); |
| base::Time three_days_prior = reference_time - base::TimeDelta::FromDays(3); |
| base::Time previous_fortnight = |
| reference_time - base::TimeDelta::FromDays(14); |
| |
| // Test adding the first date. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, previous_fortnight, |
| ui::PAGE_TRANSITION_TYPED); |
| |
| // It should be the only date recorded. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, previous_fortnight)); |
| EXPECT_EQ(events[0].engagement, 1); |
| |
| // Now add the next date. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, three_days_prior, |
| ui::PAGE_TRANSITION_GENERATED); |
| |
| // Now there should be two events. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, previous_fortnight)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, three_days_prior)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| |
| // Now add the reference date. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_LINK); |
| |
| // Now there should still be two events, but the first date should have been |
| // removed. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, three_days_prior)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, reference_time)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| |
| // Now add the the other date on the reference day. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, same_day, |
| ui::PAGE_TRANSITION_RELOAD); |
| |
| // Now there should still be the same two dates. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, three_days_prior)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, reference_time)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, CouldShowEventsDifferentResolution) { |
| AppBannerSettingsHelper::SetMinimumMinutesBetweenVisits(20); |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| // Check that by default, there are no events recorded. |
| std::vector<AppBannerSettingsHelper::BannerEvent> events = |
| AppBannerSettingsHelper::GetCouldShowBannerEvents(web_contents(), url, |
| kTestPackageName); |
| EXPECT_TRUE(events.empty()); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time same_day_ignored_i = |
| reference_time + base::TimeDelta::FromMinutes(10); |
| base::Time same_day_counted_i = |
| reference_time + base::TimeDelta::FromMinutes(20); |
| base::Time same_day_counted_ii = |
| reference_time + base::TimeDelta::FromMinutes(45); |
| base::Time same_day_ignored_ii = |
| reference_time + base::TimeDelta::FromMinutes(59); |
| |
| // Add the reference date. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_LINK); |
| |
| // There should be one event recorded |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, reference_time)); |
| EXPECT_EQ(events[0].engagement, 1); |
| |
| // Now add the the ignored date on the reference day. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, same_day_ignored_i, |
| ui::PAGE_TRANSITION_RELOAD); |
| |
| // Now there should still one event. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, reference_time)); |
| EXPECT_EQ(events[0].engagement, 1); |
| |
| // Now add the the first counted date on the reference day. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, same_day_counted_i, |
| ui::PAGE_TRANSITION_TYPED); |
| |
| // Now there should be two events. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, reference_time)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, same_day_counted_i)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| |
| // Now add the the second counted date on the reference day. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, same_day_counted_ii, |
| ui::PAGE_TRANSITION_GENERATED); |
| |
| // Now there should be three events. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(3u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, reference_time)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, same_day_counted_i)); |
| EXPECT_TRUE(IsWithinDay(events[2].time, same_day_counted_ii)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| EXPECT_EQ(events[2].engagement, 1); |
| |
| // Now add the the second ignored date on the reference day. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, same_day_ignored_ii, |
| ui::PAGE_TRANSITION_LINK); |
| |
| // Now there should still be three events. |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| EXPECT_EQ(3u, events.size()); |
| EXPECT_TRUE(IsWithinDay(events[0].time, reference_time)); |
| EXPECT_TRUE(IsWithinDay(events[1].time, same_day_counted_i)); |
| EXPECT_TRUE(IsWithinDay(events[2].time, same_day_counted_ii)); |
| EXPECT_EQ(events[0].engagement, 1); |
| EXPECT_EQ(events[1].engagement, 1); |
| EXPECT_EQ(events[2].engagement, 1); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, SingleEvents) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time other_time = reference_time - base::TimeDelta::FromDays(3); |
| for (int event = AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW; |
| event < AppBannerSettingsHelper::APP_BANNER_EVENT_NUM_EVENTS; ++event) { |
| // Check that by default, there is no event. |
| base::Time event_time = AppBannerSettingsHelper::GetSingleBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::AppBannerEvent(event)); |
| EXPECT_TRUE(event_time.is_null()); |
| |
| // Check that a time can be recorded. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::AppBannerEvent(event), reference_time); |
| |
| event_time = AppBannerSettingsHelper::GetSingleBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::AppBannerEvent(event)); |
| EXPECT_EQ(reference_time, event_time); |
| |
| // Check that another time can be recorded. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::AppBannerEvent(event), other_time); |
| |
| event_time = AppBannerSettingsHelper::GetSingleBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::AppBannerEvent(event)); |
| EXPECT_EQ(other_time, event_time); |
| } |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, CouldShowEventReplacedWithHigherWeight) { |
| // Set direct engagement to be worth 4 and indirect to be worth 2. |
| AppBannerSettingsHelper::SetEngagementWeights(4, 2); |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time later_same_day = reference_time + base::TimeDelta::FromHours(2); |
| base::Time later_again_same_day = |
| reference_time + base::TimeDelta::FromHours(6); |
| base::Time next_day = reference_time + base::TimeDelta::FromDays(1); |
| base::Time later_next_day = next_day + base::TimeDelta::FromHours(3); |
| |
| // Ensure there are no events recorded by default. |
| std::vector<AppBannerSettingsHelper::BannerEvent> events = |
| AppBannerSettingsHelper::GetCouldShowBannerEvents(web_contents(), url, |
| kTestPackageName); |
| EXPECT_TRUE(events.empty()); |
| |
| // Record an indirect engagement type. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_LINK); |
| |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinHour(events[0].time, reference_time)); |
| EXPECT_EQ(2, events[0].engagement); |
| |
| // Record a direct engagement type. This should override the previous value. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, later_same_day, |
| ui::PAGE_TRANSITION_TYPED); |
| |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinHour(events[0].time, later_same_day)); |
| EXPECT_EQ(4, events[0].engagement); |
| |
| // Record an indirect engagement type. This should be ignored. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, later_again_same_day, |
| ui::PAGE_TRANSITION_RELOAD); |
| |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| |
| EXPECT_EQ(1u, events.size()); |
| EXPECT_TRUE(IsWithinHour(events[0].time, later_same_day)); |
| EXPECT_EQ(4, events[0].engagement); |
| |
| // Record an indirect engagement type one day later. This should appear. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, next_day, |
| ui::PAGE_TRANSITION_AUTO_BOOKMARK); |
| |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinHour(events[0].time, later_same_day)); |
| EXPECT_EQ(4, events[0].engagement); |
| EXPECT_TRUE(IsWithinHour(events[1].time, next_day)); |
| EXPECT_EQ(2, events[1].engagement); |
| |
| // Record a direct engagement type later on the next day. This should override |
| // the previous value. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, later_next_day, |
| ui::PAGE_TRANSITION_GENERATED); |
| |
| events = AppBannerSettingsHelper::GetCouldShowBannerEvents( |
| web_contents(), url, kTestPackageName); |
| |
| EXPECT_EQ(2u, events.size()); |
| EXPECT_TRUE(IsWithinHour(events[0].time, later_same_day)); |
| EXPECT_EQ(4, events[0].engagement); |
| EXPECT_TRUE(IsWithinHour(events[1].time, later_next_day)); |
| EXPECT_EQ(4, events[1].engagement); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, IndirectEngagementWithLowerWeight) { |
| AppBannerSettingsHelper::SetEngagementWeights(2, 0.5); |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time second_day = reference_time + base::TimeDelta::FromDays(1); |
| base::Time third_day = reference_time + base::TimeDelta::FromDays(2); |
| base::Time fourth_day = reference_time + base::TimeDelta::FromDays(3); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // It should take four indirect visits with a weight of 0.5 to trigger the |
| // banner. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_LINK); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, second_day, |
| ui::PAGE_TRANSITION_LINK); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, second_day)); |
| |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, third_day, |
| ui::PAGE_TRANSITION_FORM_SUBMIT); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, third_day)); |
| |
| // Visit the site again; now it should be shown. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, fourth_day, |
| ui::PAGE_TRANSITION_MANUAL_SUBFRAME); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, fourth_day)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, DirectEngagementWithHigherWeight) { |
| AppBannerSettingsHelper::SetEngagementWeights(2, 0.5); |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // It should take one direct visit with a weight of 2 to trigger the banner. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, ShouldShowFromEngagement) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time one_day_ago = reference_time - base::TimeDelta::FromDays(1); |
| base::Time one_year_ago = reference_time - base::TimeDelta::FromDays(366); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Visit the site once, it still should not be shown. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_year_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Visit the site again after a long delay, it still should not be shown. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_day_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Visit the site again; now it should be shown. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, ShouldNotShowAfterBlocking) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time one_day_ago = reference_time - base::TimeDelta::FromDays(1); |
| base::Time two_months_ago = reference_time - base::TimeDelta::FromDays(60); |
| base::Time one_year_ago = reference_time - base::TimeDelta::FromDays(366); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Record events such that the banner should show. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_day_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Block the site a long time ago. It should still be shown. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK, one_year_ago); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Block the site more recently. Now it should not be shown. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK, two_months_ago); |
| EXPECT_EQ(PREVIOUSLY_BLOCKED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Change the number of days enforced. |
| AppBannerSettingsHelper::SetDaysAfterDismissAndIgnoreToTrigger(59, 14); |
| |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, ShouldNotShowAfterShowing) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time one_day_ago = reference_time - base::TimeDelta::FromDays(1); |
| base::Time one_week_ago = reference_time - base::TimeDelta::FromDays(7); |
| base::Time one_year_ago = reference_time - base::TimeDelta::FromDays(366); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Record events such that the banner should show. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_day_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Show the banner a long time ago. It should still be shown. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_year_ago); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Show the site more recently. Now it should not be shown. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_week_ago); |
| EXPECT_EQ(PREVIOUSLY_IGNORED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Change the number of days enforced. |
| AppBannerSettingsHelper::SetDaysAfterDismissAndIgnoreToTrigger(90, 6); |
| |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, ShouldNotShowAfterAdding) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time one_day_ago = reference_time - base::TimeDelta::FromDays(1); |
| base::Time one_year_ago = reference_time - base::TimeDelta::FromDays(366); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Record events such that the banner should show. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_day_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Add the site a long time ago. It should not be shown. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, |
| one_year_ago); |
| EXPECT_EQ(ALREADY_INSTALLED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, OperatesOnOrigins) { |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time one_day_ago = reference_time - base::TimeDelta::FromDays(1); |
| |
| // By default the banner should not be shown. |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Record events such that the banner should show. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, one_day_ago, |
| ui::PAGE_TRANSITION_TYPED); |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_TYPED); |
| |
| // Navigate to another page on the same origin. |
| url = GURL(kSameOriginTestURL); |
| NavigateAndCommit(url); |
| |
| // The banner should show as settings are per-origin. |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, ShouldShowWithHigherTotal) { |
| AppBannerSettingsHelper::SetTotalEngagementToTrigger(5); |
| GURL url(kTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time second_day = reference_time + base::TimeDelta::FromDays(1); |
| base::Time third_day = reference_time + base::TimeDelta::FromDays(2); |
| base::Time fourth_day = reference_time + base::TimeDelta::FromDays(3); |
| base::Time fifth_day = reference_time + base::TimeDelta::FromDays(4); |
| |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // It should take five visits to trigger the banner. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, reference_time, |
| ui::PAGE_TRANSITION_LINK); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, second_day, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, third_day, |
| ui::PAGE_TRANSITION_GENERATED); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, fourth_day, |
| ui::PAGE_TRANSITION_LINK); |
| EXPECT_EQ(INSUFFICIENT_ENGAGEMENT, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| |
| // Visit the site again; now it should be shown. |
| AppBannerSettingsHelper::RecordBannerCouldShowEvent( |
| web_contents(), url, kTestPackageName, fifth_day, |
| ui::PAGE_TRANSITION_TYPED); |
| EXPECT_EQ(NO_ERROR_DETECTED, |
| AppBannerSettingsHelper::ShouldShowBanner( |
| web_contents(), url, kTestPackageName, reference_time)); |
| } |
| |
| TEST_F(AppBannerSettingsHelperTest, WasLaunchedRecently) { |
| GURL url(kTestURL); |
| GURL url_same_origin(kSameOriginTestURL); |
| GURL url2(kDifferentOriginTestURL); |
| NavigateAndCommit(url); |
| |
| base::Time reference_time = GetReferenceTime(); |
| base::Time first_day = reference_time + base::TimeDelta::FromDays(1); |
| base::Time ninth_day = reference_time + base::TimeDelta::FromDays(9); |
| base::Time tenth_day = reference_time + base::TimeDelta::FromDays(10); |
| base::Time eleventh_day = reference_time + base::TimeDelta::FromDays(11); |
| |
| EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, |
| reference_time)); |
| |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, |
| reference_time); |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, |
| reference_time)); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, first_day)); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, ninth_day)); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, tenth_day)); |
| EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, |
| eleventh_day)); |
| |
| // Make sure a different path under the same origin also returns true. |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently( |
| profile(), url_same_origin, reference_time)); |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently( |
| profile(), url_same_origin, first_day)); |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently( |
| profile(), url_same_origin, ninth_day)); |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently( |
| profile(), url_same_origin, tenth_day)); |
| EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently( |
| profile(), url_same_origin, eleventh_day)); |
| |
| // Check a different event type. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url2, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, reference_time); |
| |
| EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2, |
| reference_time)); |
| EXPECT_FALSE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2, first_day)); |
| EXPECT_FALSE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2, ninth_day)); |
| |
| // Make sure that the most recent time the event is recorded is used. |
| AppBannerSettingsHelper::RecordBannerEvent( |
| web_contents(), url, kTestPackageName, |
| AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, |
| first_day); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, first_day)); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, ninth_day)); |
| EXPECT_TRUE( |
| AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, tenth_day)); |
| EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, |
| eleventh_day)); |
| } |