From 4cc3db726db2719720d4bbb376edfca6b44fc633 Mon Sep 17 00:00:00 2001 From: Terry Mancey Date: Sun, 28 Feb 2021 14:48:37 +0000 Subject: [PATCH] Change default ads per hour via variations service --- build/rust/Cargo.lock | 8 +- components/brave_ads/browser/ads_service.cc | 3 +- .../brave_ads/browser/ads_service_impl.cc | 15 ++- components/brave_ads/test/BUILD.gn | 1 + components/speedreader/rust/ffi/Cargo.lock | 8 +- vendor/bat-native-ads/BUILD.gn | 2 + .../include/bat/ads/pref_names.h | 4 +- .../ad_notification_serving.cc | 6 +- .../ad_serving/ad_serving_features.cc | 11 ++ .../features/ad_serving/ad_serving_features.h | 1 + .../ad_serving_features_unittest.cc | 65 ++++++++++ .../ads_per_day_frequency_cap_unittest.cc | 1 - .../ads_per_hour_frequency_cap.cc | 6 +- .../ads_per_hour_frequency_cap_unittest.cc | 30 ++--- .../minimum_wait_time_frequency_cap.cc | 6 +- ...page_ads_per_day_frequency_cap_unittest.cc | 1 - ...age_ads_per_hour_frequency_cap_unittest.cc | 1 - ...tent_ads_per_day_frequency_cap_unittest.cc | 1 - ...ent_ads_per_hour_frequency_cap_unittest.cc | 1 - .../src/bat/ads/internal/settings/settings.cc | 31 +++++ .../src/bat/ads/internal/settings/settings.h | 19 +++ .../internal/settings/settings_unittest.cc | 118 ++++++++++++++++++ .../src/bat/ads/internal/unittest_util.cc | 2 +- 23 files changed, 294 insertions(+), 47 deletions(-) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/settings/settings.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/settings/settings.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/settings/settings_unittest.cc diff --git a/build/rust/Cargo.lock b/build/rust/Cargo.lock index 2a2b28c1e00..d621ffc0903 100644 --- a/build/rust/Cargo.lock +++ b/build/rust/Cargo.lock @@ -1554,18 +1554,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2 1.0.24", "quote 1.0.7", diff --git a/components/brave_ads/browser/ads_service.cc b/components/brave_ads/browser/ads_service.cc index 6a4ffcaa29a..24e920beb38 100644 --- a/components/brave_ads/browser/ads_service.cc +++ b/components/brave_ads/browser/ads_service.cc @@ -44,8 +44,7 @@ void AdsService::RegisterProfilePrefs( registry->RegisterBooleanPref(ads::prefs::kShouldAllowConversionTracking, true); - registry->RegisterUint64Pref(ads::prefs::kAdsPerHour, - ads::kDefaultAdNotificationsPerHour); + registry->RegisterUint64Pref(ads::prefs::kAdsPerHour, 0); registry->RegisterIntegerPref(ads::prefs::kIdleTimeThreshold, 15); diff --git a/components/brave_ads/browser/ads_service_impl.cc b/components/brave_ads/browser/ads_service_impl.cc index 74ad1948d22..f48fefc063a 100644 --- a/components/brave_ads/browser/ads_service_impl.cc +++ b/components/brave_ads/browser/ads_service_impl.cc @@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/containers/flat_map.h" +#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/important_file_writer.h" @@ -20,6 +21,7 @@ #include "base/json/json_reader.h" #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "base/metrics/field_trial_params.h" #include "base/numerics/ranges.h" #include "base/path_service.h" #include "base/sequenced_task_runner.h" @@ -491,9 +493,18 @@ bool AdsServiceImpl::IsEnabled() const { } uint64_t AdsServiceImpl::GetAdsPerHour() const { + uint64_t ads_per_hour = GetUint64Pref(ads::prefs::kAdsPerHour); + if (ads_per_hour == 0) { + const base::Feature kAdServing{"AdServing", + base::FEATURE_ENABLED_BY_DEFAULT}; + + ads_per_hour = base::GetFieldTrialParamByFeatureAsInt( + kAdServing, "default_ad_notifications_per_hour", + ads::kDefaultAdNotificationsPerHour); + } + return base::ClampToRange( - GetUint64Pref(ads::prefs::kAdsPerHour), - static_cast(ads::kMinimumAdNotificationsPerHour), + ads_per_hour, static_cast(ads::kMinimumAdNotificationsPerHour), static_cast(ads::kMaximumAdNotificationsPerHour)); } diff --git a/components/brave_ads/test/BUILD.gn b/components/brave_ads/test/BUILD.gn index a80bf605818..017bb42b16c 100644 --- a/components/brave_ads/test/BUILD.gn +++ b/components/brave_ads/test/BUILD.gn @@ -115,6 +115,7 @@ source_set("brave_ads_unit_tests") { "//brave/vendor/bat-native-ads/src/bat/ads/internal/server/confirmations_server_util_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/server/rewards_server_util_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/server/via_header_util_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/settings/settings_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/string_util_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_delegate_mock.cc", diff --git a/components/speedreader/rust/ffi/Cargo.lock b/components/speedreader/rust/ffi/Cargo.lock index e924a653c28..bca5c8a5138 100644 --- a/components/speedreader/rust/ffi/Cargo.lock +++ b/components/speedreader/rust/ffi/Cargo.lock @@ -1356,18 +1356,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2 1.0.24", "quote 1.0.7", diff --git a/vendor/bat-native-ads/BUILD.gn b/vendor/bat-native-ads/BUILD.gn index f4504a3b420..4631c87ce3e 100644 --- a/vendor/bat-native-ads/BUILD.gn +++ b/vendor/bat-native-ads/BUILD.gn @@ -524,6 +524,8 @@ source_set("ads") { "src/bat/ads/internal/server/url_request_builder.h", "src/bat/ads/internal/server/via_header_util.cc", "src/bat/ads/internal/server/via_header_util.h", + "src/bat/ads/internal/settings/settings.cc", + "src/bat/ads/internal/settings/settings.h", "src/bat/ads/internal/string_util.cc", "src/bat/ads/internal/string_util.h", "src/bat/ads/internal/tab_manager/tab_info.cc", diff --git a/vendor/bat-native-ads/include/bat/ads/pref_names.h b/vendor/bat-native-ads/include/bat/ads/pref_names.h index be34173bb68..c7b1f8a555d 100644 --- a/vendor/bat-native-ads/include/bat/ads/pref_names.h +++ b/vendor/bat-native-ads/include/bat/ads/pref_names.h @@ -10,10 +10,10 @@ namespace ads { -// Ads per hour are user configurable with the brave://rewards ads UI +// Ads per hour are user configurable within the brave://rewards ads UI const uint64_t kMinimumAdNotificationsPerHour = 1; const uint64_t kMaximumAdNotificationsPerHour = 5; -const uint64_t kDefaultAdNotificationsPerHour = 2; +const uint64_t kDefaultAdNotificationsPerHour = 5; namespace prefs { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.cc index c6c69a7a860..01aff3621dc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.cc @@ -19,7 +19,6 @@ #include "bat/ads/internal/ad_serving/ad_targeting/models/contextual/text_classification/text_classification_model.h" #include "bat/ads/internal/ad_targeting/ad_targeting_segment_util.h" #include "bat/ads/internal/ad_targeting/ad_targeting_values.h" -#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" #include "bat/ads/internal/database/tables/creative_ad_notifications_database_table.h" @@ -29,8 +28,8 @@ #include "bat/ads/internal/p2a/p2a.h" #include "bat/ads/internal/p2a/p2a_util.h" #include "bat/ads/internal/platform/platform_helper.h" +#include "bat/ads/internal/settings/settings.h" #include "bat/ads/internal/time_formatting_util.h" -#include "bat/ads/pref_names.h" namespace ads { namespace ad_notifications { @@ -315,8 +314,7 @@ void AdServing::DeliveredAd() { } const int64_t seconds = - base::Time::kSecondsPerHour / - AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); + base::Time::kSecondsPerHour / settings::GetAdsPerHour(); const base::TimeDelta delay = base::TimeDelta::FromSeconds(seconds); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.cc b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.cc index 66b5293174c..76b86dcb803 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.cc @@ -6,6 +6,7 @@ #include "bat/ads/internal/features/ad_serving/ad_serving_features.h" #include "base/metrics/field_trial_params.h" +#include "bat/ads/pref_names.h" namespace ads { namespace features { @@ -14,6 +15,10 @@ namespace { const char kFeatureName[] = "AdServing"; +const char kFieldTrialParameterDefaultAdNotificationsPerHour[] = + "default_ad_notifications_per_hour"; +const int kDefaultDefaultAdNotificationsPerHour = + kDefaultAdNotificationsPerHour; const char kFieldTrialParameterMaximumAdNotificationsPerDay[] = "maximum_ad_notifications_per_day"; const int kDefaultMaximumAdNotificationsPerDay = 40; @@ -40,6 +45,12 @@ bool IsAdServingEnabled() { return base::FeatureList::IsEnabled(kAdServing); } +int GetDefaultAdNotificationsPerHour() { + return GetFieldTrialParamByFeatureAsInt( + kAdServing, kFieldTrialParameterDefaultAdNotificationsPerHour, + kDefaultDefaultAdNotificationsPerHour); +} + int GetMaximumAdNotificationsPerDay() { return GetFieldTrialParamByFeatureAsInt( kAdServing, kFieldTrialParameterMaximumAdNotificationsPerDay, diff --git a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.h b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.h index 6633773e7c5..75fa9855a36 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features.h @@ -15,6 +15,7 @@ extern const base::Feature kAdServing; bool IsAdServingEnabled(); +int GetDefaultAdNotificationsPerHour(); int GetMaximumAdNotificationsPerDay(); int GetMaximumNewTabPageAdsPerHour(); int GetMaximumNewTabPageAdsPerDay(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features_unittest.cc index 6fc0e2c3abb..dd82c003de7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/features/ad_serving/ad_serving_features_unittest.cc @@ -44,6 +44,71 @@ TEST(BatAdsAdServingFeaturesTest, AdServingDisabled) { EXPECT_FALSE(is_enabled); } +TEST(BatAdsAdServingFeaturesTest, DefaultAdNotificationsPerHour) { + // Arrange + std::vector enabled_features; + base::FieldTrialParams kAdServingParameters; + kAdServingParameters["default_ad_notifications_per_hour"] = "2"; + enabled_features.push_back({features::kAdServing, kAdServingParameters}); + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + // Act + const int default_ad_notifications_per_hour = + features::GetDefaultAdNotificationsPerHour(); + + // Assert + const int expected_default_ad_notifications_per_hour = 2; + EXPECT_EQ(expected_default_ad_notifications_per_hour, + default_ad_notifications_per_hour); +} + +TEST(BatAdsAdServingFeaturesTest, DefaultDefaultAdNotificationsPerHour) { + // Arrange + const std::vector + enabled_features; + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + // Act + const int default_ad_notifications_per_hour = + features::GetDefaultAdNotificationsPerHour(); + + // Assert + const int expected_default_ad_notifications_per_hour = 5; + EXPECT_EQ(expected_default_ad_notifications_per_hour, + default_ad_notifications_per_hour); +} + +TEST(BatAdsAdServingFeaturesTest, DisabledDefaultAdNotificationsPerHour) { + // Arrange + const std::vector + enabled_features; + + std::vector disabled_features; + disabled_features.push_back(features::kAdServing); + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + // Act + const int default_ad_notifications_per_hour = + features::GetDefaultAdNotificationsPerHour(); + + // Assert + const int expected_default_ad_notifications_per_hour = 5; + EXPECT_EQ(expected_default_ad_notifications_per_hour, + default_ad_notifications_per_hour); +} + TEST(BatAdsAdServingFeaturesTest, MaximumAdNotificationsPerDay) { // Arrange std::vector enabled_features; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap_unittest.cc index a641e9b7e70..c1e3aad9f41 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap_unittest.cc @@ -13,7 +13,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.cc index b55edb19784..f59a749069c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.cc @@ -10,10 +10,9 @@ #include #include "base/time/time.h" -#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/platform/platform_helper.h" -#include "bat/ads/pref_names.h" +#include "bat/ads/internal/settings/settings.h" namespace ads { @@ -46,8 +45,7 @@ bool AdsPerHourFrequencyCap::DoesRespectCap(const AdEventList& ad_events) { const uint64_t time_constraint = base::Time::kSecondsPerHour; - const uint64_t cap = - AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); + const uint64_t cap = settings::GetAdsPerHour(); return DoesHistoryRespectCapForRollingTimeConstraint(history, time_constraint, cap); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap_unittest.cc index 7aeb3ac2b34..d0fc47d37a0 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap_unittest.cc @@ -8,7 +8,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* @@ -44,10 +43,12 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, AlwaysAllowAdOnAndroid) { CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; + const uint64_t ads_per_hour = 5; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, ConfirmationType::kViewed); - const AdEventList ad_events(kDefaultAdNotificationsPerHour, ad_event); + const AdEventList ad_events(ads_per_hour, ad_event); // Act AdsPerHourFrequencyCap frequency_cap(ad_events); @@ -64,10 +65,12 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, AlwaysAllowAdOnIOS) { CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; + const uint64_t ads_per_hour = 5; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, ConfirmationType::kViewed); - const AdEventList ad_events(kDefaultAdNotificationsPerHour, ad_event); + const AdEventList ad_events(ads_per_hour, ad_event); // Act AdsPerHourFrequencyCap frequency_cap(ad_events); @@ -82,10 +85,12 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCap) { CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; + const uint64_t ads_per_hour = 5; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, ConfirmationType::kViewed); - const AdEventList ad_events(kDefaultAdNotificationsPerHour - 1, ad_event); + const AdEventList ad_events(ads_per_hour - 1, ad_event); // Act AdsPerHourFrequencyCap frequency_cap(ad_events); @@ -100,10 +105,12 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCapAfter1Hour) { CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; + const uint64_t ads_per_hour = 5; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, ConfirmationType::kViewed); - const AdEventList ad_events(kDefaultAdNotificationsPerHour, ad_event); + const AdEventList ad_events(ads_per_hour, ad_event); FastForwardClockBy(base::TimeDelta::FromHours(1)); @@ -120,10 +127,12 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Hour) { CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; + const uint64_t ads_per_hour = 5; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, ConfirmationType::kViewed); - const AdEventList ad_events(kDefaultAdNotificationsPerHour, ad_event); + const AdEventList ad_events(ads_per_hour, ad_event); FastForwardClockBy(base::TimeDelta::FromMinutes(59)); @@ -135,13 +144,4 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Hour) { EXPECT_FALSE(is_allowed); } -TEST_F(BatAdsAdsPerHourFrequencyCapTest, DefaultAdsPerHour) { - // Arrange - - // Act - - // Assert - EXPECT_EQ(2UL, kDefaultAdNotificationsPerHour); -} - } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.cc index 5e7db76ab9e..fd0f03487fc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.cc @@ -10,10 +10,9 @@ #include #include "base/time/time.h" -#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/platform/platform_helper.h" -#include "bat/ads/pref_names.h" +#include "bat/ads/internal/settings/settings.h" namespace ads { @@ -49,8 +48,7 @@ bool MinimumWaitTimeFrequencyCap::DoesRespectCap(const AdEventList& ad_events) { const std::deque history = GetTimestampHistoryForAdEvents(ad_events); - const uint64_t ads_per_hour = - AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); + const uint64_t ads_per_hour = settings::GetAdsPerHour(); const uint64_t time_constraint = base::Time::kSecondsPerHour / ads_per_hour; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap_unittest.cc index da5efe5e761..681f02dfb47 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap_unittest.cc @@ -13,7 +13,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap_unittest.cc index 00422f07a1f..2dc42277b4b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap_unittest.cc @@ -13,7 +13,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_day_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_day_frequency_cap_unittest.cc index 8c4b391d69a..9e0dbca7239 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_day_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_day_frequency_cap_unittest.cc @@ -13,7 +13,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_hour_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_hour_frequency_cap_unittest.cc index b1e81a31b67..f7881273899 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_hour_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/promoted_content_ads_per_hour_frequency_cap_unittest.cc @@ -13,7 +13,6 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/pref_names.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.cc b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.cc new file mode 100644 index 00000000000..7bb2b01ca6d --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.cc @@ -0,0 +1,31 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ads/internal/settings/settings.h" + +#include "base/numerics/ranges.h" +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/internal/features/ad_serving/ad_serving_features.h" +#include "bat/ads/pref_names.h" + +namespace ads { +namespace settings { + +uint64_t GetAdsPerHour() { + uint64_t ads_per_hour = + AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); + + if (ads_per_hour == 0) { + ads_per_hour = + static_cast(features::GetDefaultAdNotificationsPerHour()); + } + + return base::ClampToRange( + ads_per_hour, static_cast(kMinimumAdNotificationsPerHour), + static_cast(kMaximumAdNotificationsPerHour)); +} + +} // namespace settings +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.h b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.h new file mode 100644 index 00000000000..737149cbde1 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings.h @@ -0,0 +1,19 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_VENDOR_BAT_NATIVE_ADS_SRC_BAT_ADS_INTERNAL_SETTINGS_SETTINGS_H_ +#define BRAVE_VENDOR_BAT_NATIVE_ADS_SRC_BAT_ADS_INTERNAL_SETTINGS_SETTINGS_H_ + +#include + +namespace ads { +namespace settings { + +uint64_t GetAdsPerHour(); + +} // namespace settings +} // namespace ads + +#endif // BRAVE_VENDOR_BAT_NATIVE_ADS_SRC_BAT_ADS_INTERNAL_SETTINGS_SETTINGS_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/settings/settings_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings_unittest.cc new file mode 100644 index 00000000000..5a4c6f0ce1e --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/settings/settings_unittest.cc @@ -0,0 +1,118 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ads/internal/settings/settings.h" + +#include + +#include "base/feature_list.h" +#include "base/test/scoped_feature_list.h" +#include "bat/ads/internal/features/ad_serving/ad_serving_features.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" +#include "bat/ads/pref_names.h" + +// npm run test -- brave_unit_tests --filter=BatAds* + +namespace ads { + +class BatAdsSettingsTest : public UnitTestBase { + protected: + BatAdsSettingsTest() = default; + + ~BatAdsSettingsTest() override = default; +}; + +TEST_F(BatAdsSettingsTest, AdsPerHourWhenUserHasChangedDefaultSetting) { + // Arrange + std::vector enabled_features; + base::FieldTrialParams kParameters; + kParameters["default_ad_notifications_per_hour"] = "2"; + enabled_features.push_back({features::kAdServing, kParameters}); + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 3); + + // Act + const uint64_t ads_per_hour = settings::GetAdsPerHour(); + + // Assert + const uint64_t expected_ads_per_hour = 3; + + EXPECT_EQ(expected_ads_per_hour, ads_per_hour); +} + +TEST_F(BatAdsSettingsTest, AdsPerHourWhenUserHasNotChangedDefaultSetting) { + // Arrange + std::vector enabled_features; + base::FieldTrialParams kParameters; + kParameters["default_ad_notifications_per_hour"] = "2"; + enabled_features.push_back({features::kAdServing, kParameters}); + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + // Act + const uint64_t ads_per_hour = settings::GetAdsPerHour(); + + // Assert + const uint64_t expected_ads_per_hour = 2; + + EXPECT_EQ(expected_ads_per_hour, ads_per_hour); +} + +TEST_F(BatAdsSettingsTest, ClampMinAdsPerHour) { + // Arrange + std::vector enabled_features; + base::FieldTrialParams kParameters; + kParameters["default_ad_notifications_per_hour"] = "0"; + enabled_features.push_back({features::kAdServing, kParameters}); + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + // Act + const uint64_t ads_per_hour = settings::GetAdsPerHour(); + + // Assert + const uint64_t expected_ads_per_hour = 1; + + EXPECT_EQ(expected_ads_per_hour, ads_per_hour); +} + +TEST_F(BatAdsSettingsTest, ClampMaxAdsPerHour) { + // Arrange + std::vector enabled_features; + base::FieldTrialParams kParameters; + kParameters["default_ad_notifications_per_hour"] = "6"; + enabled_features.push_back({features::kAdServing, kParameters}); + + const std::vector disabled_features; + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + + // Act + const uint64_t ads_per_hour = settings::GetAdsPerHour(); + + // Assert + const uint64_t expected_ads_per_hour = 5; + + EXPECT_EQ(expected_ads_per_hour, ads_per_hour); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.cc index f3a1a1556b2..9e7065e1b45 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.cc @@ -385,7 +385,7 @@ void MockClearPref(const std::unique_ptr& mock) { void MockDefaultPrefs(const std::unique_ptr& mock) { mock->SetBooleanPref(prefs::kEnabled, true); - mock->SetUint64Pref(prefs::kAdsPerHour, kDefaultAdNotificationsPerHour); + mock->SetUint64Pref(prefs::kAdsPerHour, 0); mock->SetIntegerPref(prefs::kIdleTimeThreshold, 15);