From 0c4bb5f382b1242a6676db0d6b2dc6c76ddd2a79 Mon Sep 17 00:00:00 2001 From: Terry Mancey Date: Fri, 13 Nov 2020 15:04:29 +0000 Subject: [PATCH] Refactor Brave Ads to reduce tight coupling --- components/brave_ads/browser/ads_service.cc | 9 + components/brave_ads/browser/ads_service.h | 14 +- .../browser/ads_service_browsertest.cc | 16 +- .../brave_ads/browser/ads_service_impl.cc | 6 +- .../brave_ads/browser/ads_service_impl.h | 70 +-- components/brave_ads/test/BUILD.gn | 12 +- components/services/bat_ads/bat_ads_impl.h | 2 +- .../public/cpp/ads_client_mojo_bridge.cc | 2 +- .../bat_ads/public/interfaces/bat_ads.mojom | 8 +- vendor/bat-native-ads/BUILD.gn | 71 +-- .../data/test/ad_conversions.json | 2 +- .../data/test/empty_catalog.json | 17 - .../data/test/notifications.json | 2 +- .../kkjipiepeooghlclkedllogndmohhnhi | 2 +- .../bat-native-ads/include/bat/ads/ad_type.h | 2 +- vendor/bat-native-ads/include/bat/ads/ads.h | 94 ++-- .../include/bat/ads/ads_client.h | 72 +-- .../include/bat/ads/confirmation_type.h | 2 +- .../bat-native-ads/include/bat/ads/database.h | 4 +- .../include/bat/ads/pref_names.h | 5 + .../include/bat/ads/statement_info.h | 5 + .../src/bat/ads/ad_history_info.cc | 7 +- vendor/bat-native-ads/src/bat/ads/database.cc | 6 +- .../src/bat/ads/internal/account/account.cc | 201 +++++++++ .../src/bat/ads/internal/account/account.h | 97 ++++ .../ads/internal/account/account_observer.h | 43 ++ .../ad_rewards/ad_grants/ad_grants.cc | 2 +- .../ad_rewards/ad_grants/ad_grants.h | 0 .../ad_grants/ad_grants_unittest.cc | 2 +- .../ad_grants_url_request_builder.cc | 2 +- .../ad_grants/ad_grants_url_request_builder.h | 2 +- .../{ => account}/ad_rewards/ad_rewards.cc | 184 ++++---- .../{ => account}/ad_rewards/ad_rewards.h | 30 +- .../account/ad_rewards/ad_rewards_delegate.h | 22 + .../ad_rewards/ad_rewards_delegate_mock.cc | 14 + .../ad_rewards/ad_rewards_delegate_mock.h | 30 ++ .../ad_rewards/payments/payment_info.h | 0 .../ad_rewards/payments/payments.cc | 3 +- .../ad_rewards/payments/payments.h | 4 +- .../ad_rewards/payments/payments_unittest.cc | 41 +- .../payments/payments_url_request_builder.cc | 2 +- .../payments/payments_url_request_builder.h | 2 +- .../account/{ => statement}/statement.cc | 24 +- .../account/{ => statement}/statement.h | 12 +- .../bat/ads/internal/account/transactions.h | 36 -- .../{ => transactions}/transactions.cc | 50 ++- .../account/transactions/transactions.h | 32 ++ .../internal/account/{ => wallet}/wallet.cc | 18 +- .../internal/account/{ => wallet}/wallet.h | 15 +- .../account/{ => wallet}/wallet_info.cc | 2 +- .../account/{ => wallet}/wallet_info.h | 6 +- .../ad_notification_delivery.cc | 19 +- .../ad_notification_delivery.h | 6 +- .../src/bat/ads/internal/ad_events/ad_event.h | 2 +- .../bat/ads/internal/ad_events/ad_events.cc | 29 +- .../bat/ads/internal/ad_events/ad_events.h | 36 +- .../ad_notification_event_clicked.cc | 27 +- .../ad_notification_event_clicked.h | 9 +- .../ad_notification_event_dismissed.cc | 24 +- .../ad_notification_event_dismissed.h | 9 +- .../ad_notification_event_factory.cc | 12 +- .../ad_notification_event_factory.h | 2 - .../ad_notification_event_timed_out.cc | 11 +- .../ad_notification_event_timed_out.h | 9 +- .../ad_notification_event_viewed.cc | 22 +- .../ad_notification_event_viewed.h | 9 +- .../new_tab_page_ad_event_clicked.cc | 22 +- .../new_tab_page_ad_event_clicked.h | 9 +- .../new_tab_page_ad_event_factory.cc | 8 +- .../new_tab_page_ad_event_factory.h | 2 - .../new_tab_page_ad_event_viewed.cc | 25 +- .../new_tab_page_ad_event_viewed.h | 8 +- .../ad_notification_pacing_unittest.cc | 204 +++------ .../bat/ads/internal/ad_server/ad_server.cc | 160 ++++--- .../bat/ads/internal/ad_server/ad_server.h | 42 +- .../internal/ad_server/ad_server_observer.h | 30 ++ .../ad_notification_serving.cc | 55 +-- .../ad_notification_serving.h | 16 +- .../ads/internal/ad_targeting/ad_targeting.cc | 41 +- .../ads/internal/ad_targeting/ad_targeting.h | 26 +- .../purchase_intent_classifier.cc | 63 ++- .../purchase_intent_classifier.h | 15 +- .../purchase_intent_classifier_unittest.cc | 109 ++--- .../page_classifier/page_classifier.cc | 25 +- .../page_classifier/page_classifier.h | 7 +- .../page_classifier_unittest.cc | 140 ++---- .../subdivision/subdivision_targeting.cc | 44 +- .../subdivision/subdivision_targeting.h | 5 +- .../ads/internal/ad_transfer/ad_transfer.cc | 70 ++- .../ads/internal/ad_transfer/ad_transfer.h | 29 +- .../ad_transfer/ad_transfer_observer.h | 31 ++ .../ad_transfer/ad_transfer_unittest.cc | 197 ++++++++ .../ads/ad_notifications/ad_notification.cc | 97 +++- .../ads/ad_notifications/ad_notification.h | 37 +- .../ad_notification_observer.h | 47 ++ .../ads/ad_notifications/ad_notifications.cc | 106 +++-- .../ads/ad_notifications/ad_notifications.h | 16 +- .../ads/new_tab_page_ads/new_tab_page_ad.cc | 78 +++- .../ads/new_tab_page_ads/new_tab_page_ad.h | 34 +- .../new_tab_page_ad_observer.h | 40 ++ .../src/bat/ads/internal/ads_client_helper.cc | 39 ++ .../src/bat/ads/internal/ads_client_helper.h | 27 ++ .../src/bat/ads/internal/ads_client_mock.h | 25 +- .../ads/internal/ads_history/ads_history.cc | 29 +- .../ads/internal/ads_history/ads_history.h | 35 +- ...ds_history_confirmation_filter_unittest.cc | 3 - .../ads_history_date_range_filter_unittest.cc | 4 - .../sorts/ads_history_sort_unittest.cc | 2 - .../src/bat/ads/internal/ads_impl.cc | 318 +++++++------ .../src/bat/ads/internal/ads_impl.h | 236 ++++------ .../src/bat/ads/internal/backoff_timer.h | 2 +- .../src/bat/ads/internal/bundle/bundle.cc | 422 ++++++++---------- .../src/bat/ads/internal/bundle/bundle.h | 63 +-- .../bat/ads/internal/bundle/bundle_state.h | 9 - .../internal/bundle/creative_daypart_info.h | 2 +- .../src/bat/ads/internal/catalog/catalog.cc | 42 +- .../src/bat/ads/internal/catalog/catalog.h | 21 +- .../internal/catalog/catalog_daypart_info.h | 2 +- .../internal/catalog/catalog_issuers_info.cc | 15 +- .../internal/catalog/catalog_issuers_info.h | 3 +- .../bat/ads/internal/catalog/catalog_state.cc | 11 +- .../bat/ads/internal/catalog/catalog_state.h | 4 +- .../bat/ads/internal/catalog/catalog_util.cc | 39 ++ .../bat/ads/internal/catalog/catalog_util.h | 19 + .../src/bat/ads/internal/client/client.cc | 44 +- .../src/bat/ads/internal/client/client.h | 13 +- .../bat/ads/internal/client/client_info.cc | 2 +- .../internal/confirmations/confirmations.cc | 271 +++++------ .../internal/confirmations/confirmations.h | 92 ++-- .../confirmations/confirmations_observer.h | 32 ++ .../confirmations/confirmations_state.cc | 284 ++++++++---- .../confirmations/confirmations_state.h | 53 ++- .../ads/internal/conversions/conversions.cc | 94 ++-- .../ads/internal/conversions/conversions.h | 22 +- .../conversions/conversions_observer.h | 31 ++ .../conversions/conversions_unittest.cc | 173 +++---- .../sorts/conversions_sort_unittest.cc | 2 + .../internal/database/database_initialize.cc | 17 +- .../internal/database/database_initialize.h | 5 +- .../internal/database/database_migration.cc | 32 +- .../internal/database/database_migration.h | 6 +- .../tables/ad_events_database_table.cc | 25 +- .../tables/ad_events_database_table.h | 7 +- .../tables/campaigns_database_table.cc | 14 +- .../tables/campaigns_database_table.h | 7 +- .../tables/categories_database_table.cc | 14 +- .../tables/categories_database_table.h | 7 +- .../tables/conversions_database_table.cc | 30 +- .../tables/conversions_database_table.h | 7 +- .../tables/conversions_database_table_test.cc | 56 +++ .../conversions_database_table_unittest.cc | 159 +------ ...reative_ad_notifications_database_table.cc | 45 +- ...creative_ad_notifications_database_table.h | 7 +- ...ve_ad_notifications_database_table_test.cc | 63 +++ ...d_notifications_database_table_unittest.cc | 184 +------- .../tables/creative_ads_database_table.cc | 14 +- .../tables/creative_ads_database_table.h | 7 +- ...reative_new_tab_page_ads_database_table.cc | 50 +-- ...creative_new_tab_page_ads_database_table.h | 7 +- ...ve_new_tab_page_ads_database_table_test.cc | 62 +++ ...ew_tab_page_ads_database_table_unittest.cc | 191 +------- .../tables/dayparts_database_table.cc | 14 +- .../database/tables/dayparts_database_table.h | 7 +- .../tables/geo_targets_database_table.cc | 14 +- .../tables/geo_targets_database_table.h | 7 +- .../eligible_ad_notifications.cc | 18 +- .../eligible_ad_notifications.h | 14 +- .../eligible_ad_notifications_unittest.cc | 155 ++----- .../ads/internal/{ => features}/features.cc | 9 +- .../ads/internal/{ => features}/features.h | 0 .../ad_notifications_frequency_capping.cc | 54 +-- .../ad_notifications_frequency_capping.h | 11 +- .../conversion_frequency_cap.cc | 13 +- .../conversion_frequency_cap.h | 5 - .../conversion_frequency_cap_unittest.cc | 101 +---- .../daily_cap_frequency_cap.cc | 8 +- .../exclusion_rules/daily_cap_frequency_cap.h | 5 - .../daily_cap_frequency_cap_unittest.cc | 108 +---- .../exclusion_rules/daypart_frequency_cap.cc | 13 +- .../exclusion_rules/daypart_frequency_cap.h | 7 +- .../daypart_frequency_cap_unittest.cc | 113 +---- .../dismissed_frequency_cap.cc | 8 +- .../exclusion_rules/dismissed_frequency_cap.h | 4 - .../dismissed_frequency_cap_unittest.cc | 156 ++----- .../marked_as_inappropriate_frequency_cap.cc | 12 +- .../marked_as_inappropriate_frequency_cap.h | 6 +- ...as_inappropriate_frequency_cap_unittest.cc | 109 +---- ...rked_to_no_longer_receive_frequency_cap.cc | 12 +- ...arked_to_no_longer_receive_frequency_cap.h | 6 +- ...o_longer_receive_frequency_cap_unittest.cc | 110 +---- .../new_tab_page_ad_uuid_frequency_cap.cc | 6 +- .../new_tab_page_ad_uuid_frequency_cap.h | 4 - ...tab_page_ad_uuid_frequency_cap_unittest.cc | 99 +--- .../exclusion_rules/per_day_frequency_cap.cc | 8 +- .../exclusion_rules/per_day_frequency_cap.h | 5 - .../per_day_frequency_cap_unittest.cc | 113 +---- .../exclusion_rules/per_hour_frequency_cap.cc | 8 +- .../exclusion_rules/per_hour_frequency_cap.h | 5 - .../per_hour_frequency_cap_unittest.cc | 106 +---- .../subdivision_targeting_frequency_cap.cc | 13 +- .../subdivision_targeting_frequency_cap.h | 12 +- ...vision_targeting_frequency_cap_unittest.cc | 106 +---- .../total_max_frequency_cap.cc | 6 +- .../exclusion_rules/total_max_frequency_cap.h | 4 - .../total_max_frequency_cap_unittest.cc | 105 +---- .../transferred_frequency_cap.cc | 8 +- .../transferred_frequency_cap.h | 4 - .../transferred_frequency_cap_unittest.cc | 105 +---- .../frequency_capping_unittest_util.cc | 2 +- .../frequency_capping_util.cc | 14 +- .../frequency_capping_util.h | 6 +- .../new_tab_page_ads_frequency_capping.cc | 12 +- .../new_tab_page_ads_frequency_capping.h | 4 - .../ads_per_day_frequency_cap.cc | 13 +- .../ads_per_day_frequency_cap.h | 5 - .../ads_per_day_frequency_cap_unittest.cc | 116 +---- .../ads_per_hour_frequency_cap.cc | 11 +- .../ads_per_hour_frequency_cap.h | 5 - .../ads_per_hour_frequency_cap_unittest.cc | 145 ++---- .../allow_notifications_frequency_cap.cc | 10 +- .../allow_notifications_frequency_cap.h | 7 +- ...ow_notifications_frequency_cap_unittest.cc | 98 +--- .../browser_is_active_frequency_cap.cc | 14 +- .../browser_is_active_frequency_cap.h | 7 +- ...rowser_is_active_frequency_cap_unittest.cc | 117 ++--- .../permission_rules/catalog_frequency_cap.cc | 36 +- .../permission_rules/catalog_frequency_cap.h | 7 +- .../catalog_frequency_cap_unittest.cc | 118 +---- .../do_not_disturb_frequency_cap.cc | 12 +- .../do_not_disturb_frequency_cap.h | 7 +- .../do_not_disturb_frequency_cap_unittest.cc | 173 ++----- .../permission_rules/media_frequency_cap.cc | 19 +- .../permission_rules/media_frequency_cap.h | 7 +- .../media_frequency_cap_unittest.cc | 154 ++----- .../minimum_wait_time_frequency_cap.cc | 11 +- .../minimum_wait_time_frequency_cap.h | 5 - ...inimum_wait_time_frequency_cap_unittest.cc | 111 +---- .../network_connection_frequency_cap.cc | 10 +- .../network_connection_frequency_cap.h | 7 +- ...twork_connection_frequency_cap_unittest.cc | 98 +--- .../new_tab_page_ads_per_day_frequency_cap.cc | 8 +- .../new_tab_page_ads_per_day_frequency_cap.h | 5 - ...page_ads_per_day_frequency_cap_unittest.cc | 116 +---- ...new_tab_page_ads_per_hour_frequency_cap.cc | 8 +- .../new_tab_page_ads_per_hour_frequency_cap.h | 5 - ...age_ads_per_hour_frequency_cap_unittest.cc | 116 +---- .../unblinded_tokens_frequency_cap.cc | 16 +- .../unblinded_tokens_frequency_cap.h | 7 +- ...unblinded_tokens_frequency_cap_unittest.cc | 105 +---- .../user_activity_frequency_cap.cc | 68 +-- .../user_activity_frequency_cap.h | 9 +- .../user_activity_frequency_cap_unittest.cc | 195 +++----- .../legacy_migration/legacy_migration_util.cc | 32 ++ .../legacy_migration/legacy_migration_util.h | 18 + .../src/bat/ads/internal/logging.cc | 14 +- .../src/bat/ads/internal/logging.h | 5 - .../src/bat/ads/internal/p2a/p2a.cc | 25 +- .../src/bat/ads/internal/p2a/p2a.h | 21 +- .../src/bat/ads/internal/p2a/p2a_util.cc | 2 + .../src/bat/ads/internal/p2a/p2a_util.h | 2 + .../bat/ads/internal/p2a/p2a_util_unittest.cc | 5 +- .../internal/privacy/privacy_util_unittest.cc | 2 - .../unblinded_tokens/unblinded_tokens.cc | 14 +- .../unblinded_tokens/unblinded_tokens.h | 8 +- .../unblinded_tokens_unittest.cc | 136 +----- .../security/security_util_unittest.cc | 6 - .../{tabs => tab_manager}/tab_info.cc | 2 +- .../internal/{tabs => tab_manager}/tab_info.h | 6 +- .../ads/internal/tab_manager/tab_manager.cc | 177 ++++++++ .../tabs.h => tab_manager/tab_manager.h} | 39 +- .../src/bat/ads/internal/tabs/tabs.cc | 137 ------ .../bat/ads/internal/time_formatting_util.cc | 63 +++ .../bat/ads/internal/time_formatting_util.h | 34 ++ .../src/bat/ads/internal/time_util.cc | 74 +-- .../src/bat/ads/internal/time_util.h | 23 +- .../src/bat/ads/internal/timer.h | 2 +- .../redeem_unblinded_payment_tokens.cc | 60 ++- .../redeem_unblinded_payment_tokens.h | 10 +- ...inded_payment_tokens_url_request_builder.h | 2 +- ...ent_tokens_url_request_builder_unittest.cc | 4 - ...nfirmation_url_request_builder_unittest.cc | 84 +--- .../create_confirmation_util.cc | 35 +- .../create_confirmation_util.h | 6 + ...ment_token_url_request_builder_unittest.cc | 2 - .../redeem_unblinded_token.cc | 209 ++------- .../redeem_unblinded_token.h | 30 +- .../redeem_unblinded_token_delegate.h | 10 +- .../redeem_unblinded_token_delegate_mock.h | 7 +- .../redeem_unblinded_token_unittest.cc | 141 ++---- .../get_signed_tokens_url_request_builder.h | 2 +- ...ned_tokens_url_request_builder_unittest.cc | 2 - .../refill_unblinded_tokens.cc | 42 +- .../refill_unblinded_tokens.h | 11 +- ...equest_signed_tokens_url_request_builder.h | 2 +- ...ned_tokens_url_request_builder_unittest.cc | 3 - .../src/bat/ads/internal/unittest_base.cc | 165 +++++++ .../src/bat/ads/internal/unittest_base.h | 94 ++++ .../src/bat/ads/internal/unittest_util.cc | 90 +++- .../src/bat/ads/internal/unittest_util.h | 32 +- .../src/bat/ads/internal/url_util.cc | 33 +- .../src/bat/ads/internal/url_util.h | 13 +- .../src/bat/ads/internal/url_util_unittest.cc | 38 +- .../internal/user_activity/user_activity.cc | 52 ++- .../internal/user_activity/user_activity.h | 24 +- .../bat-native-ads/src/bat/ads/pref_names.cc | 16 + .../src/bat/ads/statement_info.cc | 47 ++ 306 files changed, 5430 insertions(+), 7389 deletions(-) delete mode 100644 vendor/bat-native-ads/data/test/empty_catalog.json create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/account.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/account.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/account_observer.h rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_grants/ad_grants.cc (96%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_grants/ad_grants.h (100%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_grants/ad_grants_unittest.cc (96%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_grants/ad_grants_url_request_builder.cc (93%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_grants/ad_grants_url_request_builder.h (94%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_rewards.cc (76%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/ad_rewards.h (78%) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.h rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payment_info.h (100%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payments.cc (98%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payments.h (94%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payments_unittest.cc (94%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payments_url_request_builder.cc (97%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => account}/ad_rewards/payments/payments_url_request_builder.h (95%) rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => statement}/statement.cc (58%) rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => statement}/statement.h (66%) delete mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/transactions.h rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => transactions}/transactions.cc (51%) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.h rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => wallet}/wallet.cc (72%) rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => wallet}/wallet.h (66%) rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => wallet}/wallet_info.cc (92%) rename vendor/bat-native-ads/src/bat/ads/internal/account/{ => wallet}/wallet_info.h (78%) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_unittest.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.h create mode 100755 vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.cc create mode 100755 vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_observer.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_test.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_test.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_test.cc rename vendor/bat-native-ads/src/bat/ads/internal/{ => features}/features.cc (91%) rename vendor/bat-native-ads/src/bat/ads/internal/{ => features}/features.h (100%) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.h rename vendor/bat-native-ads/src/bat/ads/internal/{tabs => tab_manager}/tab_info.cc (89%) rename vendor/bat-native-ads/src/bat/ads/internal/{tabs => tab_manager}/tab_info.h (77%) create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.cc rename vendor/bat-native-ads/src/bat/ads/internal/{tabs/tabs.h => tab_manager/tab_manager.h} (55%) delete mode 100644 vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/unittest_base.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/unittest_base.h diff --git a/components/brave_ads/browser/ads_service.cc b/components/brave_ads/browser/ads_service.cc index 8b982c85f236..0a5b61b2c75c 100644 --- a/components/brave_ads/browser/ads_service.cc +++ b/components/brave_ads/browser/ads_service.cc @@ -65,6 +65,15 @@ void AdsService::RegisterProfilePrefs( ads::prefs::kAdsSubdivisionTargetingCode, "AUTO"); registry->RegisterStringPref( ads::prefs::kAutoDetectedAdsSubdivisionTargetingCode, ""); + + registry->RegisterStringPref( + ads::prefs::kCatalogId, ""); + registry->RegisterIntegerPref( + ads::prefs::kCatalogVersion, 0); + registry->RegisterInt64Pref( + ads::prefs::kCatalogPing, 0); + registry->RegisterInt64Pref( + ads::prefs::kCatalogLastUpdated, 0); } } // namespace brave_ads diff --git a/components/brave_ads/browser/ads_service.h b/components/brave_ads/browser/ads_service.h index ca72b8842c3b..37da825269ca 100644 --- a/components/brave_ads/browser/ads_service.h +++ b/components/brave_ads/browser/ads_service.h @@ -61,6 +61,11 @@ class AdsService : public KeyedService { AdsService(const AdsService&) = delete; AdsService& operator=(const AdsService&) = delete; + void AddObserver( + AdsServiceObserver* observer); + void RemoveObserver( + AdsServiceObserver* observer); + virtual bool IsSupportedLocale() const = 0; virtual bool IsNewlySupportedLocale() = 0; @@ -78,11 +83,9 @@ class AdsService : public KeyedService { virtual uint64_t GetAdsPerDay() const = 0; virtual bool ShouldAllowAdsSubdivisionTargeting() const = 0; - virtual std::string GetAdsSubdivisionTargetingCode() const = 0; virtual void SetAdsSubdivisionTargetingCode( const std::string& subdivision_targeting_code) = 0; - virtual std::string GetAutoDetectedAdsSubdivisionTargetingCode() const = 0; virtual void SetAutoDetectedAdsSubdivisionTargetingCode( const std::string& subdivision_targeting_code) = 0; @@ -94,7 +97,7 @@ class AdsService : public KeyedService { const SessionID& tab_id, const GURL& original_url, const GURL& url, - const std::string& html) = 0; + const std::string& content) = 0; virtual void OnMediaStart( const SessionID& tab_id) = 0; @@ -160,11 +163,6 @@ class AdsService : public KeyedService { virtual void ResetAllState( const bool should_shutdown) = 0; - void AddObserver( - AdsServiceObserver* observer); - void RemoveObserver( - AdsServiceObserver* observer); - // static static void RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry); diff --git a/components/brave_ads/browser/ads_service_browsertest.cc b/components/brave_ads/browser/ads_service_browsertest.cc index e0dfac5b4547..d9d34338375c 100644 --- a/components/brave_ads/browser/ads_service_browsertest.cc +++ b/components/brave_ads/browser/ads_service_browsertest.cc @@ -56,20 +56,20 @@ struct BraveAdsUpgradePathParamInfo { // at "src/brave/test/data/rewards-data/migration" std::string preferences; - // |supported_locale| should be set to |true| if the locale should be set to a - // supported locale; otherwise, should be set to |false| + // |supported_locale| should be set to true if the locale should be set to a + // supported locale; otherwise, should be set to false bool supported_locale; - // |newly_supported_locale| should be set to |true| if the locale should be - // set to a newly supported locale; otherwise, should be set to |false| + // |newly_supported_locale| should be set to true if the locale should be set + // to a newly supported locale; otherwise, should be set to false bool newly_supported_locale; - // |rewards_enabled| should be set to |true| if Brave rewards should be - // enabled after upgrade; otherwise, should be set to |false| + // |rewards_enabled| should be set to true if Brave rewards should be enabled + // after upgrade; otherwise, should be set to false bool rewards_enabled; - // |ads_enabled| should be set to |true| if Brave ads should be enabled after - // upgrade; otherwise, should be set to |false| + // |ads_enabled| should be set to true if Brave ads should be enabled after + // upgrade; otherwise, should be set to false bool ads_enabled; }; diff --git a/components/brave_ads/browser/ads_service_impl.cc b/components/brave_ads/browser/ads_service_impl.cc index c127f48f8126..47477653c2cf 100644 --- a/components/brave_ads/browser/ads_service_impl.cc +++ b/components/brave_ads/browser/ads_service_impl.cc @@ -1296,7 +1296,7 @@ void AdsServiceImpl::MigratePrefs() { VLOG(1) << "Migrating ads preferences from pre Brave Ads build"; // Force migration of preferences from version 1 if - // |is_upgrading_from_pre_brave_ads_build_| is set to |true| to fix + // |is_upgrading_from_pre_brave_ads_build_| is set to true to fix // "https://github.com/brave/brave-browser/issues/5434" SetIntegerPref(prefs::kVersion, 1); } else { @@ -1564,14 +1564,14 @@ int AdsServiceImpl::GetPrefsVersion() const { bool AdsServiceImpl::IsUpgradingFromPreBraveAdsBuild() { // Brave ads was hidden in 0.62.x however due to a bug |prefs::kEnabled| was - // set to |true| causing "https://github.com/brave/brave-browser/issues/5434" + // set to true causing "https://github.com/brave/brave-browser/issues/5434" // |prefs::kIdleThreshold| was not serialized in 0.62.x // |prefs::kVersion| was introduced in 0.63.x // We can detect if we are upgrading from a pre Brave ads build by checking - // |prefs::kEnabled| is set to |true|, |prefs::kIdleThreshold| does not exist, + // |prefs::kEnabled| is set to true, |prefs::kIdleThreshold| does not exist, // |prefs::kVersion| does not exist and it is not the first time the browser // has run for this user #if !defined(OS_ANDROID) diff --git a/components/brave_ads/browser/ads_service_impl.h b/components/brave_ads/browser/ads_service_impl.h index 44690f2a7dbb..449beabfea5d 100644 --- a/components/brave_ads/browser/ads_service_impl.h +++ b/components/brave_ads/browser/ads_service_impl.h @@ -67,6 +67,8 @@ class AdsServiceImpl : public AdsService, public brave_user_model::Observer, public base::SupportsWeakPtr { public: + void OnWalletUpdated(); + // AdsService implementation explicit AdsServiceImpl(Profile* profile); ~AdsServiceImpl() override; @@ -81,6 +83,9 @@ class AdsServiceImpl : public AdsService, void SetEnabled( const bool is_enabled) override; + void SetAllowConversionTracking( + const bool should_allow) override; + uint64_t GetAdsPerHour() const override; void SetAdsPerHour( const uint64_t ads_per_hour) override; @@ -91,20 +96,10 @@ class AdsServiceImpl : public AdsService, std::string GetAdsSubdivisionTargetingCode() const override; void SetAdsSubdivisionTargetingCode( const std::string& subdivision_targeting_code) override; - std::string - GetAutoDetectedAdsSubdivisionTargetingCode() const override; + std::string GetAutoDetectedAdsSubdivisionTargetingCode() const override; void SetAutoDetectedAdsSubdivisionTargetingCode( const std::string& subdivision_targeting_code) override; - void OnNewTabPageAdEvent( - const std::string& wallpaper_id, - const std::string& creative_instance_id, - const ads::NewTabPageAdEventType event_type) override; - - void SetAllowConversionTracking( - const bool should_allow) override; - - // AdsClient implementation void ChangeLocale( const std::string& locale) override; @@ -112,7 +107,7 @@ class AdsServiceImpl : public AdsService, const SessionID& tab_id, const GURL& original_url, const GURL& url, - const std::string& html) override; + const std::string& content) override; void OnMediaStart( const SessionID& tab_id) override; @@ -124,12 +119,17 @@ class AdsServiceImpl : public AdsService, const GURL& url, const bool is_active, const bool is_browser_active) override; + void OnTabClosed( const SessionID& tab_id) override; - void OnWalletUpdated(); + void OnUserModelUpdated( + const std::string& id) override; - void OnGetBraveWallet(ledger::type::BraveWalletPtr wallet); + void OnNewTabPageAdEvent( + const std::string& wallpaper_id, + const std::string& creative_instance_id, + const ads::NewTabPageAdEventType event_type) override; void ReconcileAdRewards() override; @@ -173,15 +173,10 @@ class AdsServiceImpl : public AdsService, void ResetAllState( const bool should_shutdown) override; - // BraveUserModelInstaller::Observer implementation - void OnUserModelUpdated( - const std::string& id) override; - // KeyedService implementation void Shutdown() override; private: - // AdsService implementation friend class AdsNotificationHandler; void MaybeInitialize(); @@ -267,6 +262,9 @@ class AdsServiceImpl : public AdsService, ads::UrlRequestCallback callback, const std::unique_ptr response_body); + void OnGetBraveWallet( + ledger::type::BraveWalletPtr wallet); + void OnGetAdsHistory( OnGetAdsHistoryCallback callback, const std::string& json); @@ -354,6 +352,11 @@ class AdsServiceImpl : public AdsService, std::string LoadDataResourceAndDecompressIfNeeded( const int id) const; + void StartNotificationTimeoutTimer( + const std::string& uuid); + bool StopNotificationTimeoutTimer( + const std::string& uuid); + bool connected(); // AdsClient implementation @@ -361,18 +364,16 @@ class AdsServiceImpl : public AdsService, bool IsForeground() const override; + bool ShouldShowNotifications() override; + + bool CanShowBackgroundNotifications() const override; + void ShowNotification( const ads::AdNotificationInfo& ad_notification) override; - bool ShouldShowNotifications() override; - void StartNotificationTimeoutTimer( - const std::string& uuid); - bool StopNotificationTimeoutTimer( - const std::string& uuid); + void CloseNotification( const std::string& uuid) override; - bool CanShowBackgroundNotifications() const override; - void UrlRequest( ads::UrlRequestPtr url_request, ads::UrlRequestCallback callback) override; @@ -381,19 +382,15 @@ class AdsServiceImpl : public AdsService, const std::string& name, const std::string& value, ads::ResultCallback callback) override; - void LoadUserModelForId( - const std::string& id, - ads::LoadCallback callback) override; - - void RecordP2AEvent( - const std::string& name, - const ads::P2AEventType type, - const std::string& value) override; void Load( const std::string& name, ads::LoadCallback callback) override; + void LoadUserModelForId( + const std::string& id, + ads::LoadCallback callback) override; + std::string LoadResourceForId( const std::string& id) override; @@ -403,6 +400,11 @@ class AdsServiceImpl : public AdsService, void OnAdRewardsChanged() override; + void RecordP2AEvent( + const std::string& name, + const ads::P2AEventType type, + const std::string& value) override; + void DiagnosticLog( const std::string& file, const int line, diff --git a/components/brave_ads/test/BUILD.gn b/components/brave_ads/test/BUILD.gn index 670cf00136aa..8b3b34ed10d4 100644 --- a/components/brave_ads/test/BUILD.gn +++ b/components/brave_ads/test/BUILD.gn @@ -13,13 +13,16 @@ source_set("brave_ads_unit_tests") { if (brave_ads_enabled) { sources = [ "//brave/components/brave_ads/browser/ads_service_impl_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.h", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing_unittest.cc", - "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_unittest.cc", - "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting_util_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/contextual_util_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.h", "//brave/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter_unittest.cc", @@ -27,8 +30,11 @@ source_set("brave_ads_unit_tests") { "//brave/vendor/bat-native-ads/src/bat/ads/internal/ads_history/sorts/ads_history_sort_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/conversions/sorts/conversions_sort_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_test.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_test.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_test.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc", @@ -74,6 +80,8 @@ source_set("brave_ads_unit_tests") { "//brave/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder_unittest.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder_unittest.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.cc", + "//brave/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.h", "//brave/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.cc", "//brave/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.h", "//brave/vendor/bat-native-ads/src/bat/ads/internal/url_util_unittest.cc", diff --git a/components/services/bat_ads/bat_ads_impl.h b/components/services/bat_ads/bat_ads_impl.h index 10131f177c55..d0e9a421a47c 100644 --- a/components/services/bat_ads/bat_ads_impl.h +++ b/components/services/bat_ads/bat_ads_impl.h @@ -51,7 +51,7 @@ class BatAdsImpl : const int32_t tab_id, const std::string& original_url, const std::string& url, - const std::string& html) override; + const std::string& content) override; void OnUnIdle() override; void OnIdle() override; diff --git a/components/services/bat_ads/public/cpp/ads_client_mojo_bridge.cc b/components/services/bat_ads/public/cpp/ads_client_mojo_bridge.cc index 1b725dcac2a9..c64feffc959b 100644 --- a/components/services/bat_ads/public/cpp/ads_client_mojo_bridge.cc +++ b/components/services/bat_ads/public/cpp/ads_client_mojo_bridge.cc @@ -256,7 +256,7 @@ void AdsClientMojoBridge::SetBooleanPref( void AdsClientMojoBridge::GetIntegerPref( const std::string& path, GetIntegerPrefCallback callback) { - std::move(callback).Run(ads_client_->GetBooleanPref(path)); + std::move(callback).Run(ads_client_->GetIntegerPref(path)); } void AdsClientMojoBridge::SetIntegerPref( diff --git a/components/services/bat_ads/public/interfaces/bat_ads.mojom b/components/services/bat_ads/public/interfaces/bat_ads.mojom index 0946428e183c..842d84ab6859 100644 --- a/components/services/bat_ads/public/interfaces/bat_ads.mojom +++ b/components/services/bat_ads/public/interfaces/bat_ads.mojom @@ -24,10 +24,10 @@ interface BatAdsClient { [Sync] ShouldShowNotifications() => (bool should_show); [Sync] - LoadResourceForId(string id) => (string value); - [Sync] CanShowBackgroundNotifications() => (bool can_show); [Sync] + LoadResourceForId(string id) => (string value); + [Sync] GetBooleanPref(string path) => (bool value); [Sync] GetIntegerPref(string path) => (int32 value); @@ -44,11 +44,11 @@ interface BatAdsClient { CloseNotification(string uuid); UrlRequest(ads.mojom.BraveAdsUrlRequest request) => (ads.mojom.BraveAdsUrlResponse response); Save(string name, string value) => (int32 result); - LoadUserModelForId(string id) => (int32 result, string value); - RecordP2AEvent(string name, ads.mojom.BraveAdsP2AEventType type, string value); Load(string name) => (int32 result, string value); + LoadUserModelForId(string id) => (int32 result, string value); RunDBTransaction(ads_database.mojom.DBTransaction transaction) => (ads_database.mojom.DBCommandResponse response); OnAdRewardsChanged(); + RecordP2AEvent(string name, ads.mojom.BraveAdsP2AEventType type, string value); Log(string file, int32 line, int32 verbose_level, string message); SetBooleanPref(string path, bool value); SetIntegerPref(string path, int32 value); diff --git a/vendor/bat-native-ads/BUILD.gn b/vendor/bat-native-ads/BUILD.gn index 1a9857da656c..a7e404c2ab6a 100644 --- a/vendor/bat-native-ads/BUILD.gn +++ b/vendor/bat-native-ads/BUILD.gn @@ -107,14 +107,29 @@ source_set("ads") { "src/bat/ads/category_content_info.cc", "src/bat/ads/confirmation_type.cc", "src/bat/ads/database.cc", - "src/bat/ads/internal/account/statement.cc", - "src/bat/ads/internal/account/statement.h", - "src/bat/ads/internal/account/transactions.cc", - "src/bat/ads/internal/account/transactions.h", - "src/bat/ads/internal/account/wallet.cc", - "src/bat/ads/internal/account/wallet.h", - "src/bat/ads/internal/account/wallet_info.cc", - "src/bat/ads/internal/account/wallet_info.h", + "src/bat/ads/internal/account/account.cc", + "src/bat/ads/internal/account/account.h", + "src/bat/ads/internal/account/account_observer.h", + "src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.cc", + "src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h", + "src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.cc", + "src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h", + "src/bat/ads/internal/account/ad_rewards/ad_rewards.cc", + "src/bat/ads/internal/account/ad_rewards/ad_rewards.h", + "src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h", + "src/bat/ads/internal/account/ad_rewards/payments/payment_info.h", + "src/bat/ads/internal/account/ad_rewards/payments/payments.cc", + "src/bat/ads/internal/account/ad_rewards/payments/payments.h", + "src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.cc", + "src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h", + "src/bat/ads/internal/account/statement/statement.cc", + "src/bat/ads/internal/account/statement/statement.h", + "src/bat/ads/internal/account/transactions/transactions.cc", + "src/bat/ads/internal/account/transactions/transactions.h", + "src/bat/ads/internal/account/wallet/wallet.cc", + "src/bat/ads/internal/account/wallet/wallet.h", + "src/bat/ads/internal/account/wallet/wallet_info.cc", + "src/bat/ads/internal/account/wallet/wallet_info.h", "src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.cc", "src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h", "src/bat/ads/internal/ad_events/ad_event.h", @@ -140,19 +155,9 @@ source_set("ads") { "src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h", "src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing.cc", "src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing.h", - "src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.cc", - "src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.h", - "src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.cc", - "src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.h", - "src/bat/ads/internal/ad_rewards/ad_rewards.cc", - "src/bat/ads/internal/ad_rewards/ad_rewards.h", - "src/bat/ads/internal/ad_rewards/payments/payment_info.h", - "src/bat/ads/internal/ad_rewards/payments/payments.cc", - "src/bat/ads/internal/ad_rewards/payments/payments.h", - "src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.cc", - "src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.h", "src/bat/ads/internal/ad_server/ad_server.cc", "src/bat/ads/internal/ad_server/ad_server.h", + "src/bat/ads/internal/ad_server/ad_server_observer.h", "src/bat/ads/internal/ad_server/get_catalog_url_request_builder.cc", "src/bat/ads/internal/ad_server/get_catalog_url_request_builder.h", "src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.cc", @@ -189,10 +194,14 @@ source_set("ads") { "src/bat/ads/internal/ad_transfer/ad_transfer.h", "src/bat/ads/internal/ads/ad_notifications/ad_notification.cc", "src/bat/ads/internal/ads/ad_notifications/ad_notification.h", + "src/bat/ads/internal/ads/ad_notifications/ad_notification_observer.h", "src/bat/ads/internal/ads/ad_notifications/ad_notifications.cc", "src/bat/ads/internal/ads/ad_notifications/ad_notifications.h", "src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc", "src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h", + "src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h", + "src/bat/ads/internal/ads_client_helper.cc", + "src/bat/ads/internal/ads_client_helper.h", "src/bat/ads/internal/ads_history/ads_history.cc", "src/bat/ads/internal/ads_history/ads_history.h", "src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter.cc", @@ -247,6 +256,8 @@ source_set("ads") { "src/bat/ads/internal/catalog/catalog_state.h", "src/bat/ads/internal/catalog/catalog_type_info.cc", "src/bat/ads/internal/catalog/catalog_type_info.h", + "src/bat/ads/internal/catalog/catalog_util.cc", + "src/bat/ads/internal/catalog/catalog_util.h", "src/bat/ads/internal/client/client.cc", "src/bat/ads/internal/client/client.h", "src/bat/ads/internal/client/client_info.cc", @@ -263,6 +274,7 @@ source_set("ads") { "src/bat/ads/internal/client/preferences/saved_ad_info.h", "src/bat/ads/internal/confirmations/confirmation_info.cc", "src/bat/ads/internal/confirmations/confirmation_info.h", + "src/bat/ads/internal/confirmations/confirmations_observer.h", "src/bat/ads/internal/confirmations/confirmations.cc", "src/bat/ads/internal/confirmations/confirmations.h", "src/bat/ads/internal/confirmations/confirmations_state.cc", @@ -274,6 +286,7 @@ source_set("ads") { "src/bat/ads/internal/conversions/conversion_queue_item_info.h", "src/bat/ads/internal/conversions/conversions.cc", "src/bat/ads/internal/conversions/conversions.h", + "src/bat/ads/internal/conversions/conversions_observer.h", "src/bat/ads/internal/conversions/sorts/conversions_ascending_sort.cc", "src/bat/ads/internal/conversions/sorts/conversions_ascending_sort.h", "src/bat/ads/internal/conversions/sorts/conversions_descending_sort.cc", @@ -320,8 +333,8 @@ source_set("ads") { "src/bat/ads/internal/eligible_ads/ad_notifications/filters/eligible_ads_priority_filter.cc", "src/bat/ads/internal/eligible_ads/ad_notifications/filters/eligible_ads_priority_filter.h", "src/bat/ads/internal/eligible_ads/eligible_ads_util.h", - "src/bat/ads/internal/features.cc", - "src/bat/ads/internal/features.h", + "src/bat/ads/internal/features/features.cc", + "src/bat/ads/internal/features/features.h", "src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.cc", "src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h", "src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.cc", @@ -354,12 +367,12 @@ source_set("ads") { "src/bat/ads/internal/frequency_capping/frequency_capping_util.h", "src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.cc", "src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h", - "src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc", - "src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h", "src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.cc", "src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h", "src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.cc", "src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.h", + "src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc", + "src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h", "src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.cc", "src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h", "src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.cc", @@ -385,6 +398,8 @@ source_set("ads") { "src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h", "src/bat/ads/internal/json_helper.cc", "src/bat/ads/internal/json_helper.h", + "src/bat/ads/internal/legacy_migration/legacy_migration_util.cc", + "src/bat/ads/internal/legacy_migration/legacy_migration_util.h", "src/bat/ads/internal/locale/anonymous_country_codes.h", "src/bat/ads/internal/locale/country_code_util.cc", "src/bat/ads/internal/locale/country_code_util.h", @@ -422,10 +437,12 @@ source_set("ads") { "src/bat/ads/internal/server/url_request_builder.h", "src/bat/ads/internal/string_util.cc", "src/bat/ads/internal/string_util.h", - "src/bat/ads/internal/tabs/tab_info.cc", - "src/bat/ads/internal/tabs/tab_info.h", - "src/bat/ads/internal/tabs/tabs.cc", - "src/bat/ads/internal/tabs/tabs.h", + "src/bat/ads/internal/tab_manager/tab_info.cc", + "src/bat/ads/internal/tab_manager/tab_info.h", + "src/bat/ads/internal/tab_manager/tab_manager.cc", + "src/bat/ads/internal/tab_manager/tab_manager.h", + "src/bat/ads/internal/time_formatting_util.cc", + "src/bat/ads/internal/time_formatting_util.h", "src/bat/ads/internal/time_util.cc", "src/bat/ads/internal/time_util.h", "src/bat/ads/internal/timer.cc", diff --git a/vendor/bat-native-ads/data/test/ad_conversions.json b/vendor/bat-native-ads/data/test/ad_conversions.json index 688d7104bceb..8db171b8d1c8 100644 --- a/vendor/bat-native-ads/data/test/ad_conversions.json +++ b/vendor/bat-native-ads/data/test/ad_conversions.json @@ -1,4 +1,4 @@ { "ad_conversions": [ ] -} \ No newline at end of file +} diff --git a/vendor/bat-native-ads/data/test/empty_catalog.json b/vendor/bat-native-ads/data/test/empty_catalog.json deleted file mode 100644 index 821b51263bac..000000000000 --- a/vendor/bat-native-ads/data/test/empty_catalog.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 1, - "issuers": [ - { - "name": "confirmation", - "publicKey": "qi1Vl8YrPEZliN5wmBgLTuGkbk8K505QwlXLTZjUd34=" - }, - { - "name": "0.05BAT", - "publicKey": "mmXlFlskcF+LjQmJTPQUmoDMV8Co2r+0eNqSyzCywmk=" - } - ], - "ping": 7200000, - "campaigns": [ - ], - "catalogId": "29e5c8bc0ba319069980bb390d8e8f9b58c05a20" -} diff --git a/vendor/bat-native-ads/data/test/notifications.json b/vendor/bat-native-ads/data/test/notifications.json index 9bf71412028f..d41e72d60ac8 100644 --- a/vendor/bat-native-ads/data/test/notifications.json +++ b/vendor/bat-native-ads/data/test/notifications.json @@ -1,4 +1,4 @@ { "notifications": [ ] -} \ No newline at end of file +} diff --git a/vendor/bat-native-ads/data/test/user_models/kkjipiepeooghlclkedllogndmohhnhi b/vendor/bat-native-ads/data/test/user_models/kkjipiepeooghlclkedllogndmohhnhi index bdc8b1ef5380..adb3f9565c8c 100644 --- a/vendor/bat-native-ads/data/test/user_models/kkjipiepeooghlclkedllogndmohhnhi +++ b/vendor/bat-native-ads/data/test/user_models/kkjipiepeooghlclkedllogndmohhnhi @@ -1 +1 @@ -{"locale":"us","version":1,"timestamp":"2020-05-13 19:43:35","parameters":{"signal_level":1,"classification_threshold":10,"signal_decay_time_window_in_seconds":604800},"segments":["automotive purchase intent by make-acura","automotive purchase intent by make-audi","automotive purchase intent by make-bmw","automotive purchase intent by make-buick","automotive purchase intent by make-cadillac","automotive purchase intent by make-chevrolet","automotive purchase intent by make-chrysler","automotive purchase intent by make-dodge","automotive purchase intent by make-fiat","automotive purchase intent by make-ford","automotive purchase intent by make-gmc","automotive purchase intent by make-honda","automotive purchase intent by make-hyundai","automotive purchase intent by make-infiniti","automotive purchase intent by make-jaguar","automotive purchase intent by make-jeep","automotive purchase intent by make-kia","automotive purchase intent by make-land rover","automotive purchase intent by make-lexus","automotive purchase intent by make-lincoln","automotive purchase intent by make-mazda","automotive purchase intent by make-mercedes-benz","automotive purchase intent by make-mini","automotive purchase intent by make-mitsubishi","automotive purchase intent by make-nissan","automotive purchase intent by make-porsche","automotive purchase intent by make-ram","automotive purchase intent by make-saab","automotive purchase intent by make-scion","automotive purchase intent by make-smart","automotive purchase intent by make-subaru","automotive purchase intent by make-suzuki","automotive purchase intent by make-toyota","automotive purchase intent by make-volkswagen","automotive purchase intent by make-volvo","automotive purchase intent by category-entry luxury car","automotive purchase intent by category-luxury suv","automotive purchase intent by category-mid luxury car","automotive purchase intent by category-entry sports car","automotive purchase intent by category-premium luxury car","automotive purchase intent by category-premium sports car","automotive purchase intent by category-luxury sports car","automotive purchase intent by category-midsize suv","automotive purchase intent by category-compact suv","automotive purchase intent by category-premium midsize car","automotive purchase intent by category-entry midsize car","automotive purchase intent by category-ld fullsize pickup","automotive purchase intent by category-entry compact car","automotive purchase intent by category-compact pickup","automotive purchase intent by category-premium compact car","automotive purchase intent by category-hd fullsize pickup","automotive purchase intent by category-fullsize suv","automotive purchase intent by category-compact van","purchase intent fintech - top blockfi keywords","purchase intent fintech - blockfi keyword gaps","purchase intent fintech - blockfi intent keywords","purchase intent fintech - alexa personal finance audience","working from home purchase intent - general","working from home purchase intent - focus and productivity","working from home purchase intent - office products"],"segment_keywords":{"Acura ILX":[0,35],"Acura ILX Hybrid":[0,35],"Acura MDX":[0,36],"Acura RDX":[0,36],"Acura RL":[0,37],"Acura RLX":[0,37],"Acura TL":[0,35],"Acura TSX":[0,35],"Acura TSX Sport Wagon":[0,35],"Acura ZDX":[0,36],"Audi A3":[1,38],"Audi A4":[1,35],"Audi A4 allroad":[1,35],"Audi A5":[1,35],"Audi A6":[1,37],"Audi A7":[1,37],"Audi A8":[1,39],"Audi Q5":[1,36],"Audi Q5 Hybrid":[1,36],"Audi Q7":[1,36],"Audi R8":[1,40],"Audi R8 GT Spyder":[1,40],"Audi R8 Spyder":[1,40],"Audi RS 5":[1,35],"Audi S4":[1,35],"Audi S5":[1,35],"Audi S6":[1,37],"Audi S7":[1,37],"Audi S8":[1,39],"Audi TT":[1,40],"Audi TT RS":[1,40],"Audi TTS":[1,40],"BMW 128I":[2,40],"BMW 135I":[2,40],"BMW 320I":[2,35],"BMW 320I xDrive":[2,35],"BMW 328I":[2,35],"BMW 328I xDrive":[2,35],"BMW 335I":[2,35],"BMW 335I xDrive":[2,35],"BMW 335IS":[2,35],"BMW 528I":[2,37],"BMW 528I xDrive":[2,37],"BMW 535I":[2,37],"BMW 535I Gran Turismo":[2,36],"BMW 535I xDrive":[2,37],"BMW 535I xDrive Gran Turismo":[2,36],"BMW 550I":[2,37],"BMW 550I Gran Turismo":[2,36],"BMW 550I xDrive":[2,37],"BMW 550I xDrive Gran Turismo":[2,36],"BMW 640I":[2,41],"BMW 640I Gran Coupe":[2,41],"BMW 640I xDrive":[2,41],"BMW 640I xDrive Gran Coupe":[2,41],"BMW 650I":[2,41],"BMW 650I Gran Coupe":[2,41],"BMW 650I xDrive":[2,41],"BMW 650I xDrive Gran Coupe":[2,41],"BMW 740I":[2,39],"BMW 740LI":[2,39],"BMW 740LI xDrive":[2,39],"BMW 750I":[2,39],"BMW 750I xDrive":[2,39],"BMW 750LI":[2,39],"BMW 750LI xDrive":[2,39],"BMW ActiveHybrid 3":[2,35],"BMW ActiveHybrid 5":[2,37],"BMW ActiveHybrid 750LI":[2,39],"BMW M3":[2,35],"BMW M5":[2,37],"BMW M6":[2,41],"BMW M6 Gran Coupe":[2,41],"BMW X1":[2,36],"BMW X3":[2,36],"BMW X5":[2,36],"BMW X5 M":[2,36],"BMW X6":[2,36],"BMW X6 M":[2,36],"BMW Z4":[2,40],"Buick Enclave":[3,42],"Buick Encore":[3,43],"Buick LaCrosse":[3,44],"Buick LaCrosse eAssist":[3,44],"Buick Regal":[3,44],"Buick Regal eAssist":[3,44],"Buick Verano":[3,45],"Cadillac ATS":[4,35],"Cadillac CTS":[4,35],"Cadillac CTS SportWagon":[4,35],"Cadillac Escalade":[4,36],"Cadillac Escalade ESV":[4,36],"Cadillac Escalade Hybrid":[4,36],"Cadillac SRX":[4,36],"Cadillac XTS":[4,37],"Chevrolet Avalanche":[5,46],"Chevrolet Aveo":[5,47],"Chevrolet Camaro":[5,38],"Chevrolet Colorado":[5,48],"Chevrolet Corvette":[5,40],"Chevrolet Cruze":[5,49],"Chevrolet Equinox":[5,43],"Chevrolet Impala":[5,44],"Chevrolet Malibu":[5,45],"Chevrolet Malibu Eco":[5,45],"Chevrolet Silverado 1500":[5,46],"Chevrolet Silverado 1500 Hybrid":[5,46],"Chevrolet Silverado 2500 HD":[5,50],"Chevrolet Silverado 3500":[5,50],"Chevrolet Sonic":[5,47],"Chevrolet Spark":[5,47],"Chevrolet Suburban C1500":[5,51],"Chevrolet Suburban C2500":[5,51],"Chevrolet Suburban K1500":[5,51],"Chevrolet Suburban K2500":[5,51],"Chevrolet Tahoe":[5,51],"Chevrolet Tahoe Hybrid":[5,51],"Chevrolet Traverse":[5,42],"Chevrolet Volt":[5,49],"Chrysler 200":[6,44],"Chrysler 300":[6,35],"Chrysler Town & Country":[6,52],"Dodge Avenger":[7,44],"Dodge Caliber":[7,49],"Dodge Challenger":[7,38],"Dodge Charger":[7,44],"Dodge Dart":[7,49],"Dodge Durango":[7,42],"Dodge Grand Caravan":[7,52],"Dodge Journey":[7,42],"Dodge Viper":[7,40],"Fiat 500":[8,47],"Fiat 500C":[8,47],"Ford C-Max Energi":[9,49],"Ford C-Max Hybrid":[9,49],"Ford Edge":[9,42],"Ford Escape":[9,43],"Ford Expedition":[9,51],"Ford Expedition EL":[9,51],"Ford Explorer":[9,42],"Ford F-150":[9,46],"Ford F-250":[9,50],"Ford F-350":[9,50],"Ford F-450":[9,50],"Ford Fiesta":[9,47],"Ford Flex":[9,42],"Ford Focus":[9,49],"Ford Focus Electric":[9,49],"Ford Fusion":[9,44],"Ford Fusion Energi":[9,44],"Ford Fusion Hybrid":[9,44],"Ford Mustang":[9,38],"Ford Ranger":[9,48],"Ford Taurus":[9,44],"Ford Transit Connect":[9,52],"GMC Acadia":[10,42],"GMC Canyon":[10,48],"GMC Sierra 1500":[10,46],"GMC Sierra 2500 HD":[10,50],"GMC Sierra 3500":[10,50],"GMC Sierra Denali":[10,46],"GMC Sierra Denali 2500 HD":[10,50],"GMC Sierra Denali 3500":[10,50],"GMC Terrain":[10,43],"GMC Yukon":[10,51],"GMC Yukon Denali":[10,51],"GMC Yukon Denali Hybrid":[10,51],"GMC Yukon XL C1500":[10,51],"GMC Yukon XL K1500":[10,51],"GMC Yukon XL K2500":[10,51],"Honda Accord":[11,44],"Honda Accord Plug-In":[11,44],"Honda Civic":[11,49],"Honda Civic Hybrid":[11,49],"Honda Crosstour":[11,42],"Honda CR-V":[11,43],"Honda CR-Z":[11,49],"Honda Fit":[11,47],"Honda Fit EV":[11,47],"Honda Insight":[11,49],"Honda Odyssey":[11,52],"Honda Pilot":[11,42],"Honda Ridgeline":[11,48],"Hyundai Accent":[12,47],"Hyundai Azera":[12,44],"Hyundai Elantra":[12,49],"Hyundai Elantra GT":[12,49],"Hyundai Elantra Touring":[12,49],"Hyundai Equus":[12,39],"Hyundai Genesis":[12,38],"Hyundai Santa Fe":[12,43],"Hyundai Santa Fe LWB":[12,42],"Hyundai Santa Fe Sport":[12,43],"Hyundai Sonata":[12,45],"Hyundai Sonata Hybrid":[12,45],"Hyundai Tucson":[12,43],"Hyundai Veloster":[12,38],"Hyundai Veracruz":[12,42],"Infiniti EX35":[13,35],"Infiniti EX37":[13,35],"Infiniti FX37":[13,36],"Infiniti FX50":[13,36],"Infiniti G37":[13,35],"Infiniti JX35":[13,36],"Infiniti M37":[13,37],"Infiniti M56":[13,37],"Infiniti QX56":[13,36],"Jaguar F-Type":[14,40],"Jaguar F-Type S":[14,40],"Jaguar F-Type V8 S":[14,40],"Jaguar XF":[14,37],"Jaguar XF 3.0":[14,37],"Jaguar XF Portfolio":[14,37],"Jaguar XF Supercharged":[14,37],"Jaguar XFR":[14,39],"Jaguar XJ":[14,39],"Jaguar XJ Supercharged":[14,39],"Jaguar XJL":[14,39],"Jaguar XJL Portfolio":[14,39],"Jaguar XJL Supercharged":[14,39],"Jaguar XJL Supersport":[14,39],"Jaguar XK":[14,41],"Jaguar XK Touring":[14,41],"Jaguar XKR":[14,41],"Jaguar XKR-S":[14,41],"Jeep Compass":[15,43],"Jeep Grand Cherokee":[15,42],"Jeep Liberty":[15,43],"Jeep Patriot":[15,43],"Jeep Wrangler":[15,43],"Jeep Wrangler Unlimited":[15,43],"Kia Cadenza":[16,44],"Kia Forte":[16,49],"Kia Forte Koup":[16,49],"Kia Optima":[16,45],"Kia Optima Hybrid":[16,45],"Kia Rio":[16,47],"Kia Rio 5-Door":[16,47],"Kia Sedona":[16,52],"Kia Sorento":[16,42],"Kia Soul":[16,43],"Kia Sportage":[16,43],"Land Rover LR2":[17,36],"Land Rover LR4":[17,36],"Land Rover Range Rover":[17,36],"Land Rover Range Rover Evoque":[17,36],"Land Rover Range Rover Sport":[17,36],"Lexus CT 200H":[18,35],"Lexus ES 300H":[18,35],"Lexus ES 350":[18,35],"Lexus GS 350":[18,37],"Lexus GS 450H":[18,37],"Lexus GX 460":[18,36],"Lexus IS 250":[18,35],"Lexus IS 250C":[18,35],"Lexus IS 350":[18,35],"Lexus IS 350C":[18,35],"Lexus IS F":[18,35],"Lexus LS 460":[18,39],"Lexus LS 460 L":[18,39],"Lexus LS 600H L":[18,39],"Lexus LX 570":[18,36],"Lexus RX 350":[18,36],"Lexus RX 450H":[18,36],"Lincoln MKS":[19,37],"Lincoln MKT":[19,36],"Lincoln MKX":[19,36],"Lincoln MKZ":[19,35],"Lincoln MKZ Hybrid":[19,35],"Lincoln Navigator":[19,36],"Lincoln Navigator L":[19,36],"Mazda 2":[20,47],"Mazda 3":[20,49],"Mazda 5":[20,52],"Mazda 6":[20,44],"Mazda CX-5":[20,43],"Mazda CX-7":[20,43],"Mazda CX-9":[20,42],"Mazda MX-5":[20,38],"Mazda MX-5 PRHT":[20,38],"Mercedes-Benz C250":[21,35],"Mercedes-Benz C250C":[21,35],"Mercedes-Benz C300":[21,35],"Mercedes-Benz C350":[21,35],"Mercedes-Benz C350C":[21,35],"Mercedes-Benz C63":[21,35],"Mercedes-Benz C63C":[21,35],"Mercedes-Benz CL550":[21,41],"Mercedes-Benz CL63":[21,41],"Mercedes-Benz CLS550":[21,41],"Mercedes-Benz CLS63":[21,41],"Mercedes-Benz E350":[21,37],"Mercedes-Benz E350 Bluetec":[21,37],"Mercedes-Benz E350C":[21,37],"Mercedes-Benz E400 Hybrid":[21,37],"Mercedes-Benz E550":[21,37],"Mercedes-Benz E550C":[21,37],"Mercedes-Benz E63":[21,37],"Mercedes-Benz G550":[21,36],"Mercedes-Benz G63":[21,36],"Mercedes-Benz GL350 Bluetec":[21,36],"Mercedes-Benz GL450":[21,36],"Mercedes-Benz GL550":[21,36],"Mercedes-Benz GL63":[21,36],"Mercedes-Benz GLK250 Bluetec":[21,36],"Mercedes-Benz GLK350":[21,36],"Mercedes-Benz ML350":[21,36],"Mercedes-Benz ML350 Bluetec":[21,36],"Mercedes-Benz ML550":[21,36],"Mercedes-Benz ML63":[21,36],"Mercedes-Benz S350 Bluetec":[21,39],"Mercedes-Benz S400 Hybrid":[21,39],"Mercedes-Benz S550":[21,39],"Mercedes-Benz S63":[21,39],"Mercedes-Benz SL550":[21,41],"Mercedes-Benz SL63":[21,41],"Mercedes-Benz SL65":[21,41],"Mercedes-Benz SLK250":[21,40],"Mercedes-Benz SLK300":[21,40],"Mercedes-Benz SLK350":[21,40],"Mercedes-Benz SLK55":[21,40],"Mercedes-Benz SLS AMG":[21,40],"Mercedes-Benz SLS AMG GT":[21,40],"Mini Clubman":[22,49],"Mini Cooper":[22,49],"Mini Cooper Roadster":[22,49],"Mini Countryman":[22,43],"Mini Paceman":[22,43],"Mitsubishi Eclipse Spyder":[23,38],"Mitsubishi Galant":[23,44],"Mitsubishi i":[23,47],"Mitsubishi Lancer":[23,49],"Mitsubishi Lancer Evolution":[23,38],"Mitsubishi Lancer Sportback":[23,49],"Mitsubishi Outlander":[23,43],"Mitsubishi Outlander Sport":[23,43],"Nissan 370Z":[24,40],"Nissan Altima":[24,44],"Nissan Armada":[24,51],"Nissan cube":[24,49],"Nissan Frontier":[24,48],"Nissan GT-R":[24,40],"Nissan JUKE":[24,43],"Nissan LEAF":[24,49],"Nissan Maxima":[24,44],"Nissan Murano":[24,42],"Nissan Murano CrossCabriolet":[24,42],"Nissan NV200":[24,52],"Nissan Pathfinder":[24,42],"Nissan Pathfinder CUV":[24,42],"Nissan Quest":[24,52],"Nissan Rogue":[24,43],"Nissan Sentra":[24,49],"Nissan Titan":[24,46],"Nissan Versa":[24,47],"Nissan Xterra":[24,43],"Porsche 911":[25,40],"Porsche Boxster":[25,40],"Porsche Cayenne":[25,36],"Porsche Cayenne Hybrid":[25,36],"Porsche Cayman":[25,40],"Porsche Panamera":[25,41],"Porsche Panamera Hybrid":[25,41],"RAM Ram 1500":[26,46],"RAM Ram 2500":[26,50],"RAM Ram 2500 Mega Cab":[26,50],"RAM Ram 3500":[26,50],"RAM Ram 3500 Mega Cab":[26,50],"RAM Ram Cargo Van":[26,52],"Saab 3-Sep":[27,35],"Saab 5-Sep":[27,37],"Scion FR-S":[28,38],"Scion iQ":[28,47],"Scion tC":[28,38],"Scion xB":[28,49],"Scion xD":[28,49],"smart fortwo":[29,47],"smart fortwo electric drive":[29,47],"Subaru BRZ":[30,38],"Subaru Forester":[30,43],"Subaru Impreza":[30,49],"Subaru Legacy":[30,44],"Subaru Outback":[30,44],"Subaru Tribeca":[30,42],"Subaru XV Crosstrek":[30,43],"Suzuki Equator":[31,48],"Suzuki Grand Vitara":[31,43],"Suzuki Kizashi":[31,45],"Suzuki SX4":[31,47],"Suzuki SX4 Crossover":[31,47],"Toyota 4Runner":[32,42],"Toyota Avalon":[32,44],"Toyota Avalon Hybrid":[32,44],"Toyota Camry":[32,44],"Toyota Camry Hybrid":[32,44],"Toyota Corolla":[32,49],"Toyota FJ Cruiser":[32,42],"Toyota Highlander":[32,42],"Toyota Highlander Hybrid":[32,42],"Toyota Land Cruiser":[32,36],"Toyota Matrix":[32,49],"Toyota Prius":[32,49],"Toyota Prius c":[32,47],"Toyota Prius Plug-In":[32,49],"Toyota Prius v":[32,49],"Toyota RAV4":[32,43],"Toyota RAV4 EV":[32,43],"Toyota Sequoia":[32,51],"Toyota Sienna":[32,52],"Toyota Tacoma":[32,48],"Toyota Tundra":[32,46],"Toyota Tundra CrewMax":[32,46],"Toyota Venza":[32,42],"Toyota Yaris":[32,47],"Volkswagen Beetle":[33,49],"Volkswagen CC":[33,44],"Volkswagen Eos":[33,38],"Volkswagen Golf":[33,49],"Volkswagen Golf R":[33,38],"Volkswagen GTI":[33,38],"Volkswagen Jetta":[33,45],"Volkswagen Jetta Hybrid":[33,45],"Volkswagen Jetta SportWagen":[33,45],"Volkswagen Passat":[33,44],"Volkswagen Routan":[33,52],"Volkswagen Tiguan":[33,43],"Volkswagen Touareg":[33,36],"Volvo C30":[34,49],"Volvo C70":[34,35],"Volvo S60":[34,35],"Volvo S80":[34,37],"Volvo XC60":[34,36],"Volvo XC70":[34,37],"Volvo XC90":[34,36],"Acura":[0],"Audi":[1],"BMW":[2],"Buick":[3],"Cadillac":[4],"Chevrolet":[5],"Chrysler":[6],"Dodge":[7],"Fiat":[8],"Ford":[9],"GMC":[10],"Honda":[11],"Hyundai":[12],"Infiniti":[13],"Jaguar":[14],"Jeep":[15],"Kia":[16],"Land Rover":[17],"Lexus":[18],"Lincoln":[19],"Mazda":[20],"Mercedes-Benz":[21],"Mini":[22],"Mitsubishi":[23],"Nissan":[24],"Porsche":[25],"RAM":[26],"Saab":[27],"Scion":[28],"smart":[29],"Subaru":[30],"Suzuki":[31],"Toyota":[32],"Volkswagen":[33],"Volvo":[34],"blockfi":[53],"btc to usd":[53],"free bitcoin":[53],"free bitcoin mining":[53],"freebitcoin":[53],"earn bitcoin":[53],"earn free bitcoin":[53],"free bitcoin generator":[53],"earn bitcoin free":[53],"free bitcoin sites":[53],"blockfi wallet":[53],"1 btc to inr":[53],"bonus bitcoin":[53],"earn btc":[53],"get free bitcoin":[53],"blockfi interest rates":[53],"bitcoin mining free":[53],"block fi":[53],"blockfi logo":[53],"blockfi affiliate":[53],"how to earn bitcoin":[53],"bitcoin free":[53],"free btc":[53],"freebitco":[53],"usd to btc":[53],"how to earn free bitcoin":[53],"free btc generator":[53],"bitcoin to pkr":[53],"blockfi referral code":[53],"blockfi lending":[53],"free bitcoins":[53],"cointiply":[53],"how can i earn bitcoins for free":[53],"earn free bitcoins instantly":[53],"free bitcoin earning":[53],"earn interest on bitcoin":[53],"mining cheap":[53],"blockfi mobile app":[53],"blockfi logo png":[53],"earn bitcoin for free":[53],"crypto interest account":[53],"free mining bitcoin":[53],"how to earn bitcoin online":[53],"free bitco.in":[53],"how to earn bitcoin free":[53],"earn free bitcoins":[53],"free bcash":[53],"free bitcoin south africa":[53],"get free bitcoins":[53],"bitcoin lending":[53],"earn free btc":[53],"0.01 btc to usd":[53],"crypto compound interest calculator":[53],"blockfi affiliate program":[53],"free bitcoin cash":[53],"earn bitcoin online free":[53],"zac prince blockfi":[53],"celsius network":[53],"blockfi interest":[53],"btc mining free":[53],"crypto loans":[53],"get 1 bitcoin free":[53],"how to get free bitcoin":[53],"free bitcoin 2020":[53],"best get free bitcoin":[53],"free btc earning":[53],"1 free bitcoin":[53],"how to get free bitcoins fast":[53],"how to earn btc for free":[53],"get 0.1 bitcoin free":[53],"free cloud mining":[53],"how to get free bitcoins instantly":[53],"earn bitcoin online":[53],"zac prince":[53],"how to earn free bitcoin online":[53],"what is blockfi":[53],"free bitcoin mining sites":[53],"crypto loan":[53],"earn interest on crypto":[53],"free fast bitcoin mining":[53],"btc instant win":[53],"free bitcoin mining values":[53],"how to earn bitcoins fast":[53],"bitcoin games":[53],"bitcoin faucets":[53],"crypto backed loans":[53],"crypto tax software":[53],"free bitcoin.io":[53],"mine bitcoin for free":[53],"free bitcoins every second":[53],"free bitcoin generator no fee":[53],"how to earn bitcoin for free":[53],"bitcoin":[53],"coinbase earn":[53],"blockfi reviews":[53],"btc lending sites":[54,55],"best bitcoin lending sites":[54,55],"unchained capital review":[54,55],"bitcoin vs internet":[54,55],"lending cryptocurrency":[54],"crypto lending platform":[54],"cryptocurrency lending":[54],"cryptocurrency lending platforms":[54],"lending coin":[54],"coin loan":[54],"bitcoin loan instant":[54],"crypto lending platforms":[54],"borrow litecoin":[54],"lending platform":[54],"the lending coin":[54],"borrow bitcoin":[54],"lend token":[54],"lend ethereum":[54],"loan platform":[54],"unchained capital":[54],"lend coin":[54],"salt crypto":[54],"salt token":[54],"salt cryptocurrency":[54],"nebeus":[54],"salt blockchain":[54],"salt loan":[54],"salt loans":[54],"salt lending careers":[54],"salt lending denver":[54],"salt wallet":[54],"salt platform":[54],"salt denver":[54],"borrow crypto":[54],"bitcoin obsoletes all other money":[54],"salt lending holdings":[54],"salt whitepaper":[54],"ico lending":[54],"parker lewis unchained capital":[54],"bitcoin vault":[54],"jeff berwick":[54],"crypto bank":[54],"21 million":[54],"salt coin news":[54],"salt lending news":[54],"multisig wallet ethereum":[54],"multisig contract":[54],"salt ico":[54],"blockchain loans":[54],"salt io":[54],"bill sinclair":[54],"salt lending ceo":[54],"salt lending platform":[54],"salt ceo":[54],"hodl waves":[54],"bitcoin data science":[54],"multisig ethereum":[54],"salt lending jobs":[54],"salt lending team":[54],"coinloan token":[54],"salt lending holdings inc.":[54],"salt lending login":[54],"non purpose loan":[54],"salt bitcoin":[54],"unchain capital hold bitcoin":[54],"shawn owen salt":[54],"salt community":[54],"blockchain lending":[54],"ethereum multisig wallet":[54],"salt exchange":[54],"dhruv bansal":[54],"bottom shelf bitcoin":[54],"$salt":[54],"digital asset lending":[54],"bitcoin data analysis":[54],"blockchain lending platforms":[54],"21million ways":[54],"crypto salt":[54],"salt lending bermuda":[54],"salt lending ico":[54],"salt lending roadmap":[54],"ethereum multi signature":[54],"minimizing trust in hardware wallets with two factor signatures":[54],"blockchain in lending":[54],"salt lending crunchbase":[54],"salt lending california":[54],"salt lending founders":[54],"salt blockchain asset management":[54],"salt roadmap":[54],"clt coin":[54],"salt website":[55],"salt coin price":[55],"salt coin market cap":[55],"online bank crypto":[55],"salt app online":[55],"best ethereum multisig wallet":[55],"tokens for sale":[55],"best lending platform":[55],"blockchain compared to internet":[55],"salt crypto price":[55],"use crypto exchange loan pay back":[55],"blockchain vs internet":[55],"salt lending review":[55],"best ptp sites":[55],"lending sites":[55],"earn free rub":[55],"salt token price":[55],"lending websites":[55],"get backed pdf":[55],"lending company":[55],"international loans online":[55],"bitcoin investment sites":[55],"bitcoin website":[55],"wfh":[57],"work from home":[57],"working from home":[57],"working at home":[57],"home office":[57],"remote work":[57],"working remotely":[57],"telecommuting":[57],"how to focus better":[58],"how to focus on homework":[58],"how to focus on studying":[58],"how to focus on reading":[58],"how to focus in class":[58],"how to focus on your goals":[58],"how to focus on school":[58],"productivity apps":[58],"productivity planner":[58],"productivity software":[58],"productivity timer":[58],"productivity journal":[58],"productivity books":[58],"productivity stickers":[58],"productivity project":[58],"productivity planner stickers":[58],"productivity notebook":[58],"productivity quotes":[58],"productivity tools":[58],"productivity meaning":[58],"productivity music":[58],"productivity game":[58],"productivity tips":[58],"productivity meditation":[58],"productivity hacks":[58],"productivity desk setup":[58],"productivity motivation":[58],"productivity subliminal":[58],"productivity music for work":[58],"productivity during quarantine":[58],"productivity bootcamp":[58],"productivity aids":[58],"procrastinating":[58],"procrastination":[58],"home office desk":[59],"home office furniture":[59],"home office chair":[59],"home office setup":[59],"home office decor":[59],"home office accessories":[59],"home office organization and storage":[59],"home office printer":[59],"home office chair ergonomic":[59],"home office ideas":[59],"home office design":[59],"home office chairs":[59],"home office furniture collections":[59],"home office design ideas":[59],"home office tour":[59],"home office makeover":[59],"home office organization":[59],"home office design ideas ikea":[59],"home office fail":[59],"home office setup 2020":[59],"home office in bedroom":[59],"home office desk setup":[59],"home office under theresa may":[59],"home office hostile environment policy":[59],"home office radio":[59],"home office building":[59],"home office travel document":[59],"home office drugs inspectorate":[59],"home office of the basque government":[59],"home office baby":[59],"home office desks":[59],"home office ergonomics":[59],"home office equipment":[59],"home office decorating ideas":[59],"home office desk chair":[59],"home office cabinet":[59],"home office storage":[59],"home office decorations":[59]},"funnel_keywords":{"review":2,"youtube":2,"comparison":2,"pictures of":2,"trunk space":2,"towing capacity":2,"panoramic sunroof":2,"backup camera":2,"test drives":2,"highlights":2,"walkthroughs":2,"configuration":2,"configurator":2,"equipment":2,"msrp":2,"list price":2,"value":2,"trade-in":2,"sell":2,"for sale under":2,"lease deals":2,"dealer opening times":3,"dealer phone number":3,"dealer reviews":3,"open sunday":3,"dealerships nearby":3,"where to buy":3,"in stock":3},"funnel_sites":[{"sites":["http://staples.com","http://officedepot.com","http://quill.com","http://moo.com","http://btod.com","http://shoplet.com","http://overnightprints.com","http://papersource.com","http://gouletpens.com","http://officedesigns.com","http://waterproofpaper.com","http://thestampmaker.com","http://successories.com","http://thepapermillstore.com","http://cultpens.com","http://nationalbusinessfurniture.com","http://ontimesupplies.com","http://officefurniture.com","http://thehumansolution.com","http://cross.com","http://jampaper.com","http://modernofficefurniture.com","http://officefurniturecenter.com","http://gotprint.net","http://worldlabel.com","http://currentcatalog.com","http://redrivercatalog.com","http://officefurnitureonline.co.uk","http://pospaper.com","http://bizchair.com","http://iteminfo.com","http://rubberstamps.com","http://rubberstamps.net","http://margolisfurniture.co.uk","http://pacificsignandstamp.com","http://crane.com","http://simplystamps.com","http://bestar.ca","http://worthingtondirect.com","http://officechairs.com","http://ataglance.com","http://ergoprise.com","http://daytimer.com","http://theelegantoffice.com","http://digitalbuyer.com","http://stenograph.com","http://warehouse-lighting.com","http://officechairsuk.co.uk","http://11x17.com","http://furniturefinders.com","http://hertzfurniture.com","http://abcoffice.com","http://envelopesuperstore.com","http://limitedpapers.com","http://xstamperonline.com","http://freedmansonline.com","http://pbsoffice.com","http://deskstore.com","http://inkd.com","http://mead.com","http://sitbackandrelax.com.au","http://back2.co.uk","http://acornsales.com","http://myturnstone.com","http://trendway.com","http://desktopsupplies.com","http://tablelegsonline.com","http://aceofficesystems.com","http://rainbowzebra.co.uk","http://furniturewholesalers.com","http://stylo.ca","http://versatables.com","http://skutchi.com","http://officereality.co.uk","http://officechairsunlimited.com","http://ergomart.com","http://wellworking.co.uk","http://corpkit.com","http://healthpostures.com","http://eventstable.com","http://neutralposture.com","http://hittmarking.com","http://findofficefurniture.com","http://chairlines.com","http://rapidsupplies.com","http://seejanework.com","http://marking.ca","http://stampco.com","http://rack.com.sg","http://fastkit.com","http://mbmcorp.com","http://chairoffice.co.uk","http://discountrubberstamps.com","http://ergokidz.com.au","http://paperweight.ie","http://stationeryxpress.com","http://ergonomicofficechairs.com","http://monkeyoffice.co.uk","http://buyonlinenow.com","http://labeluniverse.com","http://graytex.com","http://printsmadeeasy.com","http://laserinkjetlabels.com","http://paper-paper.com","http://khawarpapermart.com","http://ausergo.com.au","http://continentaloffice.com","http://millersconnect.com","http://gopak.co.uk","http://officechairscanada.com","http://chair-mats.com","http://pukka-pads.co.uk","http://kos.ie","http://cumminsallison.com","http://rieke.com","http://schwaab.com","http://charnstrom.com","http://kuojer.com.tw","http://fountainpenhospital.com","http://idealofficefurniture.com.au","http://carlmfg.com","http://toaddiaries.co.uk","http://usi-laminate.com","http://kentwoodoffice.com","http://uplifting.com.au","http://onestopergonomics.com","http://themandatepress.com","http://slampaper.co.za","http://qenvelopes.com","http://imagesupply.com","http://usalight.com","http://dataprint.com","http://affordableofficefurniture.com","http://gmund.com","http://atd.com","http://amsprinting.com","http://yafa.com","http://tablelegworld.com","http://klsecurity.com","http://postroom-online.co.uk","http://japanesemoderndesign.com","http://1-computerdesks.com","http://rochester100.com","http://simonstamp.com","http://topflightpaper.com","http://rubberstamps.com.au","http://dallasmidwest.com","http://gibraltarfurniture.com","http://xstamper.com","http://labelsbythesheet.com","http://rubberstampman.com","http://papershredders.com","http://asianagencies.com","http://plasmadesign.co.uk","http://keynamics.com","http://superfineprinting.com","http://anglepoise.com","http://stamp-connection.com","http://stampxpress.com","http://tri-pointproducts.com","http://alphaos.com","http://baldwincooke.com","http://printfever.com","http://steadfastpaper.com","http://classroomessentialsonline.com","http://directofficesupply.co.uk","http://zapcopaper.com","http://embraceair.com","http://windowenvelopes.com","http://fessco.net","http://wattscurrent.com","http://andrewsofficefurniture.com","http://lanstar.com","http://posturepeople.co.uk","http://designyourowncard.com","http://backcs.co.uk","http://hudsonsofficefurniture.co.uk","http://greetingpen.com","http://empireoffice.com","http://jtfbus.com","http://biomorphdesk.com","http://schoolstationers.stores.yahoo.net","http://1stergo.com","http://tigetek.com","http://3mdirect.co.uk","http://azstamps.com","http://a1stamps.com","http://aaaasurplus.com","http://paper-cutter.net","http://acemarking.com","http://acerubberstamps.com","http://acmestamp.com","http://actionenvelope.com","http://activelivingsolutions.net","http://abc-i.com","http://abe-online.com","http://aofcatalog.com","http://filingtoday.com","http://americanfolder.com","http://apecenvelopes.com","http://gwanderson.server101.com","http://anthro.com","http://arccrafts.com","http://onlinefurniture.us","http://atlofficesource.com","http://avidergo.com","http://backdesigns.com","http://backcarebasics.com","http://thebarn.com.au","http://barondirect.com","http://blrofficefurniture.com.au","http://bentonsofficesupplies.co.uk","http://bestbuy-officechairs.co.uk","http://best-folding-tables-and-chairs.com","http://bestinclassschoolsupplies.com","http://btsofficechair.com","http://bestfurnitureonline.com","http://bisleydirect.co.uk","http://signandstamp.com","http://bobsrubberstamps.com","http://borderxpress.com","http://brewer-cantelmo.com","http://bricknells.net","http://bureaudirect.co.uk","http://buronomic.com","http://businesscardsfast.com","http://businessfurnitureonline.co.uk","http://businessection.com","http://calculatorsource.com","http://calendarcastle.com","http://canmarkindustries.com","http://carolinastamp.com","http://color-business-cards.com","http://cbfoffice.com.au","http://rubberstampsales.co.uk","http://cessi.com","http://chair-saver.com","http://chairtech.com","http://championseating.com","http://cheap-integratedlabels.co.uk","http://cheapthermalpaper.com","http://2001ce.com","http://cityliquidators.com","http://clickbusinesscards.com","http://cmppaper.com","http://collinsdebden.co.uk","http://colop.co.uk","http://selfstamps.com","http://computerfurniturewarehouse.co.uk","http://constanttech.com","http://consumableitems.co.uk","http://contractinterior.com","http://corporatedepot.com","http://corporate-interiors.com","http://corpout.com","http://corrigo-design.com","http://columbuspaper.com","http://crayfourds.co.uk","http://createastamp.com","http://creativerubberstamps.com","http://magnawindow.com","http://cubiclekeys.com","http://cupboardsdirect.co.uk","http://crstamp.com","http://datalinksales.com","http://data-supplies.com","http://dauphin.com","http://designerpapers.com","http://desktoplabels.com","http://dictationdepot.com","http://discounthomeoffice.com","http://dpionlineinc.com","http://ds-ergonomics.com","http://etypewriters.com","http://easychairworkstation.com","http://echopaperstore.com","http://econoenvelope.com","http://edufurniture.com","http://eframofficefurniture.com","http://efstore.com.au","http://elbowfriend.com","http://corporatekits.com","http://endoofficefurniture.com.au","http://enetfurniture.com","http://envelopedistributor.com","http://envelopemall.com","http://theenvelopesupplier.com","http://envelopesexpress.com","http://envelopesdirect.com","http://envelopperinc.com","http://kneelsit.com","http://ergon-products.com","http://workspaces.com","http://ergonomic-computing.co.uk","http://ergonomichome.com","http://ergonomicsmadeeasy.com","http://ergospec.com","http://ergostat.com","http://ergotherapy.co.za","http://ethocenter.com","http://etray.co.uk","http://exled.co.uk","http://elliepoopaper.co.uk","http://expodesigninc.com","http://expressenvelopes.co.uk","http://ezphoenixofficefurniture.com","http://otooleofficesystems.com","http://factory-express.com","http://federalrubberstamps.com.au","http://thefilefactory.co.uk","http://filofaxusa.com","http://first-base.com","http://flipcharts2go.com","http://florenseusa.com","http://focusstationery.com","http://forestcontract.com","http://formyoffice.co.uk","http://foxstamp.com","http://franklinstamps.com","http://fredlake.com","http://spectrastamps.com","http://gfegroup.com","http://geneseestamp.com","http://ineedbusinesscards.com","http://glassmat.net","http://1coolpen.com","http://custom-stamps.co.uk","http://greatfxprinting.com","http://greatshinepaper.com","http://greendesigns.com","http://store.greenpearle.com","http://greenwichcontemporarylighting.com","http://gwofficefurniture.co.uk","http://h2ofurniture.com","http://buytillrolls.co.uk","http://hashinc.com","http://heasterlawson.com","http://hergo.com","http://holdnview.net","http://holmesstamp.com","http://home-office-design.co.uk","http://ibmtypewriters.com","http://icarusofficefurniture.co.uk","http://industrialseating.co.uk","http://inhousesf.com","http://ink2paper.com","http://instand.com","http://integrityfurniture.com","http://intercounty.uk.com","http://internetrubberstamps.com","http://intimus.com","http://coollaptopstand.co.uk","http://jasonoffice.com","http://jasperandblack.com","http://jazzyexpo.com","http://jmlecterns.co.uk","http://jmsteno.com","http://gprsmodems.co.uk","http://journalboutique.com","http://jit-tables-chairs.ca","http://jsfonline.com","http://justwrite.com.au","http://kareproducts.com","http://kellyrest.com","http://keystoneoffice.com","http://labtechseating.com","http://albcaligrafia.com","http://laminatorwarehouse.com","http://laporta.co.uk","http://laserrubberstamps.com","http://lasergrafixprinting.com","http://le-alfurnitureltd.co.uk","http://leatherfurnituresouth.com","http://legalcraft.net","http://libertystamp.com","http://lightingspecialties.com","http://lineamazzuccato.it","http://linneadesign.com","http://lizell.com","http://worldofenvelopes.com","http://magnesheet.com","http://mailinglabelsusa.com","http://machinerunner.com","http://marchandelectric.com","http://markscorpex.com","http://thematstore.com","http://mbosystems.com","http://mercurypen.com","http://midmodfurniture.com","http://milabels.com.au","http://miracledesk.com","http://miracle-envelope.com","http://mobile-tronics.com","http://mypencil.com","http://modernchair.com","http://mohawkstamp.com","http://mymonkeytown.com","http://montisawork.com","http://mountedconcepts.com","http://mpressiveprint.com","http://mrwhiteboards.com.au","http://msmmarking.com","http://myofficetable.com","http://myenvelopes247.com","http://myexpression.com","http://nationwideofficefurniture.com","http://niodonline.co.uk","http://nobisfurniture.com","http://naenv.com","http://nbstamp.com","http://obros.co.za","http://officeallsorts.co.uk","http://officechairsforless.com","http://officefurniturebox.com","http://ofconcepts.com","http://furniturekinginc.com","http://officefurniturenow.co.uk","http://officefurnitureunl.com","http://officefurnitureworld.com","http://ofusa.com","http://officeneedsonline.co.uk","http://officequarters.com","http://officeusa.com","http://officeclocks.com","http://officefurniturehq.com","http://officestar-group.co.uk","http://officezilla.com","http://onestopstamps.co.uk","http://packagingbydesigninc.com","http://paper-papers.com","http://passion4pens.com","http://paymastercheckwriter.com","http://paystation.ca","http://penloversparadise.com","http://pencraft.co.uk","http://pengallery.com","http://pensations.com","http://photopaperplus.com","http://plan-itinteriors.co.uk","http://aplusdiscountstamps.com","http://pocketfolderstore.com","http://pospaper.com.au","http://receiptpaper.com.au","http://posrolls.co.za","http://presslabel.com","http://printedpaperproducts.co.uk","http://printinganddesignonline.com","http://prismatique.com","http://addressstamp.com","http://quickcard.co.uk","http://rsruggles.com","http://rainbowenvelopes.co.uk","http://receiptrolls.com","http://regentenvelopes.com","http://remcoequipment.com","http://rubberstamps.co.uk","http://anejaplastic.com","http://safetyfile.com","http://saxen.co.uk","http://schoolhouseelectronics.com","http://schroedersolutions.com","http://sealsandengravables.com","http://second-hand-office-furniture.co.uk","http://secureshredders.com","http://pensandgifts.com","http://shape-seating.co.uk","http://shemoilighting.com","http://simply-ergonomic.co.uk","http://sit4life.com","http://solusifurniture.com","http://swmodularinc.com","http://spspaper.com","http://stampdesign4u.co.uk","http://stampworldonline.com","http://stampworld.com.au","http://stampchamp.com","http://stardesk.com","http://stevensonsofficefurniture.co.uk","http://stonelinedesigns.com","http://stratisindustries.com","http://superiorrubberstamp.com","http://superiorstampandsign.com","http://tstrubberstamp.com","http://accurateracks.com","http://thsolidwood.com","http://thefilingstore.com","http://things4computers.com","http://ticktocksales.com","http://tide-mark.com","http://atozstamps.com","http://toryinc.com","http://totalofficeonline.com","http://treecycle.com","http://tubeshield.co.uk","http://eagle-tungyung.com","http://twentygauge.com","http://uklabchairs.co.uk","http://undercoveruk.com","http://uniquepersonalizedproducts.com","http://bizsiteusa.co"],"segments":[57,58,59]},{"sites":["http://finance.yahoo.com","http://irs.gov","http://cnbc.com","http://marketwatch.com","http://fool.com","http://money.cnn.com","http://bankrate.com","http://ssa.gov","http://youneedabudget.com","http://healthcare.gov","http://mint.com","http://kiplinger.com","http://daveramsey.com","http://cms.gov","http://iwillteachyoutoberich.com","http://retirementplans.vanguard.com","http://marketplace.org","http://myfico.com","http://guidestar.org","http://medicare.gov","http://hud.gov","http://annualcreditreport.com","http://charitynavigator.org","http://goodfinancialcents.com","http://doughroller.net","http://debt.org","http://moneytalksnews.com","http://treasurydirect.gov","http://investorjunkie.com","http://themortgagereports.com","http://creditcardinsider.com","http://tax.virginia.gov","http://biblemoneymatters.com","http://iii.org","http://ficoforums.myfico.com","http://savingadvice.com","http://medicaid.gov","http://revenue.pa.gov","http://elephant.com","http://ptmoney.com","http://getsmarteraboutmoney.ca","http://missingmoney.com","http://incharge.org","http://20somethingfinance.com","http://fico.com","http://practicalmoneyskills.com","http://aaii.com","http://healthinsurance.org","http://charitywatch.org","http://mymoneyblog.com","http://credit.org","http://consumerismcommentary.com","http://budgetsaresexy.com","http://rrb.gov","http://ambest.com","http://moneymanagement.org","http://cashmoneylife.com","http://nfcc.org","http://21st.com","http://safeauto.com","http://mvelopes.com","http://onecentatatime.com","http://govloans.gov","http://dfa.arkansas.gov","http://moneyinstructor.com","http://greenpath.com","http://consumercredit.com","http://calendarbudget.com","http://nevblog.com","http://revenue.alabama.gov","http://richescorner.com","http://frugalconfessions.com","http://thousandaire.com","http://bloggingawaydebt.com","http://milliondollarjourney.com","http://manvsdebt.com","http://consolidatedcredit.org","http://dinkytown.net","http://mtgprofessor.com","http://mymoney.gov","http://investorguide.com","http://everybodylovesyourmoney.com","http://boomerandecho.com","http://benefitslink.com","http://alauxsoft.com","http://moolanomy.com","http://getoutofdebt.org","http://debtorsanonymous.org","http://makinghomeaffordable.gov","http://newlywedsonabudget.com","http://pfadvice.com","http://creditinfocenter.com","http://finder.healthcare.gov","http://takechargeamerica.org","http://401khelpcenter.com","http://quotelab.com","http://advantageccs.org","http://morewithlesstoday.com","http://jasonzweig.com","http://clearpoint.org","http://cesisolutions.org","http://floodsmart.gov","http://freefrombroke.com","http://good2go.com","http://hcsc.com","http://youngmoney.com","http://myfinancialgoals.org","http://navicoresolutions.org","http://debthelper.com","http://revenue.wyo.gov","http://aprfinder.com","http://jumpstart.org","http://punchdebtintheface.com","http://themoneyways.com","http://insurance-canada.ca","http://familycredit.org","http://thedigeratilife.com","http://allregs.com","http://crr.bc.edu","http://insurekidsnow.gov","http://moneyspire.com","http://clarifi.org","http://sharescope.co.uk","http://empowerins.com","http://choosetosave.org","http://term4sale.com","http://genxfinance.com","http://earthandmoney.ca","http://mydollarplan.com","http://aging.senate.gov","http://responsiblelending.org","http://401k.fidelity.com","http://keaneunclaimedproperty.com","http://creditguard.org","http://shareaction.org","http://moneydance.com","http://mortgage-x.com","http://iretireearly.com","http://consumerfu.com","http://pensionrights.org","http://actuary.org","http://debtsmart.com","http://moneyhelpforchristians.com","http://pensionsandannuities.co.uk","http://debtreductionservices.org","http://debtwave.org","http://pennysaverblog.com","http://thehousingbubbleblog.com","http://auto-insurance-knowledge.com","http://familiesusa.org","http://medicare.org","http://givemebackmyfivebucks.com","http://cobrainsurancebenefits.org","http://free-financial-advice.net","http://debtsyndrome.com","http://teenanalyst.com","http://debtcounselingcorp.org","http://yourmoneypage.com","http://knowdebt.org","http://northerncheapskate.com","http://quicken.intuit.com","http://lostmoney.com","http://ingenie.com","http://carinsuranceguidebook.com","http://financialfraudaction.org.uk","http://iheartwallstreet.com","http://financial-education-icfe.org","http://liquidledger.com","http://reversemortgage.org","http://debthelp.com","http://decisionaide.com","http://autoinsuranceez.com","http://creditslips.org","http://ehealthhelp.com","http://keepsoft.com","http://pfblog.com","http://investoreducation.org","http://bkforum.com","http://22dollars.com","http://cerp.carloalberto.org","http://mymedicare.com","http://gbonds.sourceforge.net","http://mrrc.isr.umich.edu","http://auto.progressive.com","http://credit.about.com","http://financialplan.about.com","http://mutualfunds.about.com","http://taxes.about.com","http://finance.cch.com","http://nccsdataweb.urban.org","http://abcstockinvesting.com","http://about-disability-insurance.com","http://indexannuity.org","http://allfinancialmatters.com","http://americaquote.com","http://creditunion.coop","http://debtguru.com","http://asec.org","http://americansforfairnessinlending.wordpress.com","http://azinvestor.gov","http://askjackaboutdebt.com","http://askunclebill.typepad.com","http://aiccca.org","http://aurfs.com.au","http://articles.onlineautoinsurance.com","http://autoinsuranceeasy123.com","http://theautoinsurancereviewsite.com","http://automaticfinances.com","http://theaveragejoeinvestor.blogspot.com","http://autofinancing101.org","http://balancejunkie.com","http://bargaineering.com","http://basicinvest.com","http://unclaimedpropertybc.ca","http://beingfrugal.net","http://betterbudgeting.com","http://mybsi.org","http://brokerfish.com","http://budgetease.com","http://budgetways.com","http://insuranceoracle.com","http://alloftypesinsurance.blogspot.com","http://carinsurance.org","http://carinsurancecalculator.info","http://carinsurancevalue.net","http://cbmfoundation.org","http://cccsoc.org","http://cheapquotescarinsurance.com","http://checkdepot.net","http://debtkiller.com","http://christiancreditcounsel.com","http://christianpf.com","http://cobrainsurancehq.com","http://cobrainsurancedirect.com","http://csinvestor.com","http://compareautoinsurancerates.com","http://cc-bc.com","http://cccs.net","http://cccsnevada.org","http://cccsnj.org","http://cccssf.org","http://cfefa.org","http://contents-insurance.info","http://cookconsolidation.com","http://coveryoungpeople.com","http://creditadvisors.org","http://ccoacares.com","http://cccspa.org","http://creditscoring.com","http://thecreditbible.com","http://debtomg.com","http://delraycc.com","http://disasterprepared.net","http://the-diy-income-investor.com","http://esplanner.com","http://essentia-soft.com","http://faithandfinance.org","http://ffef.org","http://finance4youth.wordpress.com","http://financialrecovery.com","http://flexibleretirementplanner.com","http://foundmoney.com","http://live-frugal.blogspot.com","http://directfund.fundinfo.wilink.com","http://funeralconsumer.org","http://yourgfm.com","http://glenndaily.com","http://guidewellfs.org","http://healthinsuranceindepth.com","http://healthsymphony.com","http://homemoneymanager.com","http://ibesthealthinsurance.com","http://icreateofx.co.uk","http://incomeprofiles.com","http://indexfunds.com","http://en.indextracker.ch","http://instantcarquotes.net","http://instantcarinsuranceonline.com","http://coverageglossary.com","http://theinsuranceblogger.co.uk","http://insurancebrokersgroup.com","http://carinsurance.co.za","http://insuranceusa.com","http://infre.org","http://investools.com","http://investorism.com","http://ipaydebt.com","http://jlplanner.com","http://jimmillersworld.com","http://joetaxpayer.com","http://justapps.com","http://learninvesting.com","http://lifeinsurance-onweb.com","http://1003.com","http://lostcash.ca","http://mcol.com","http://billadvocates.com","http://medicalinsurance.net","http://medicareuncluttered.com","http://misscar.co.uk","http://moneybox.ai","http://mortgageforum.com","http://mortgage-helper.com","http://themortgageinsider.net","http://mpoweredcolorado.org","http://mrltc.com","http://msmoney.com","http://mfea.com","http://mybudgetplanner.com","http://myfreecash.info","http://myinsuranceweb.co.uk","http://narrowbridge.net","http://naschip.org","http://1foryourlife.com","http://onemomfivekids.blogspot.com","http://othersoft.com","http://outofdebtagain.com","http://longtermcareliving.com","http://penny-saved.com","http://pensionprotectionfund.org.uk","http://pensionresearchcouncil.org","http://pensions-pmi.org.uk","http://personaldividends.com","http://personal-loan-calculator.com","http://pinkpowerladies.com","http://pioneercredit.com","http://pointsonthedollar.com","http://pensionspolicyinstitute.org.uk","http://prepaiddebitcards.net","http://rsea4u.org","http://retirementcalc.com","http://healthquotesmatch.com","http://roth401k.com","http://rothira.com","http://savings-bond-advisor.com","http://savingsbonds.com","http://mysenioradvisorsgroup.com","http://sensetosave.com","http://setupabudget.com","http://simplybudgets.com.au","http://speedresearch.com","http://stockjargon.com","http://stock-market-investors.com","http://stocksandcents.com","http://stupidcents.com","http://summitmedigap.com","http://thesunsfinancialdiary.com","http://timbertax.org","http://timemaps.biz","http://atozinvestments.com","http://topshare.com.au","http://trinitycredit.org","http://savingsbondtracker.com","http://vibir.gov","http://unclaimedassets.co.uk","http://ultrasoft.com","http://unclaimed-state-money.com","http://unclaimedfunds.net","http://usaaedfoundation.org","http://viaticalhelp.tripod.com","http://viatical-web.org","http://wealthinformatics.com","http://wvretirement.com","http://checkbookbalancing.com","http://consumerterm.com","http://youngcheapliving.com","http://votrecourtier.com","http://zilchworks.co"],"segments":[53,54,55]},{"sites":["http://autotrader.com","http://carmax.com","http://car.com","http://autobytel.com","http://dealerrater.com","http://eastwood.com","http://buyatoyota.com","http://hertzcarsales.com","http://andysautosport.com","http://legendarymotorcar.com","http://streetsideclassics.com","http://carchex.com","http://hybrid-racing.com","http://sportcompactwarehouse.com","http://australianmusclecarsales.com.au","http://optionsauto.com","http://genracer.com","http://endurancewarranty.com","http://fswerks.com","http://kingmotorsports.com","http://brotherstrucks.com","http://hymanltd.com","http://7ent.com","http://passwordjdm.com","http://xcceleration.com","http://billetspecialties.com","http://thewestcoastclassics.com","http://stainlessworks.net","http://lkperformance.co.uk","http://cimotorsports.net","http://oldbug.com","http://countryclassiccars.com","http://steelerubber.com","http://westcoastautosport.com","http://chevsofthe40s.com","http://goldenclassics.com","http://rksport.com","http://springrates.com","http://mershons.com","http://paragonmotorclub.com","http://troy-ford-extended-warranty.com","http://continentalwarranty.org","http://vvncc.com","http://vintagespeedsters.com","http://evolutionimport.com","http://classicinvest.com","http://xcaliberart.com","http://valenticlassics.com","http://lombardfordwarrantys.com","http://holden.co.uk","http://dantesparts.com","http://airheadparts.com","http://dsmparts.com","http://motorchrome.com","http://americanclassic.com","http://northshoresportscars.com","http://rywire.com","http://proteamcorvette.com","http://rallyarmor.com","http://turbotechracing.com","http://belairautoparts.com","http://snydersantiqueauto.com","http://halibrand.com","http://warrantyheadquarters.com","http://vintagemotorssarasota.com","http://bobdrake.com","http://cooperclassiccars.com","http://classiccarautoparts.com","http://chryslerwarrantys.com","http://contes.com","http://proformanceunlimited.com","http://wilsonmotorco.com","http://aaautowarranty.com","http://beangarage.com","http://kstech.biz","http://oldmoparts.com","http://yogisinc.com","http://jshmotors.com","http://pdm-racing.com","http://turninconcepts.com","http://convertibleparts.com","http://eaglegb.com","http://collectorsautosupply.com","http://supracarparts.com","http://aston.co.uk","http://cashfortrucks.com","http://pjsautoworld.com","http://morrisminorspares.com","http://carsinc.com","http://amkproducts.com","http://certifiedautoappraisers.com","http://dealer.autobytel.com","http://steam-car-dev.karoo.net","http://accuratevalue.com","http://advancedautodealers.com","http://affordableclassicsinc.com","http://aktivperformanceparts.co.uk","http://acscorp.com","http://anamericanclassic.com","http://americanstreetrod.com","http://acautos.com","http://antiqueautomobileradio.com","http://apexperformance.net","http://autoappraisalsbyalan.com","http://armoredcars.com","http://autoappraisalnetwork.com","http://theautoappraiser.com","http://autobound.com","http://autoinstruments.com","http://autopi.com","http://autoservicewarranty.com","http://autoadvisor.com","http://the-autoline.com","http://automall.com","http://automobileinspections.com","http://autosearcher.com","http://autosource-online.com","http://autovantage.com","http://avantiparts.biz","http://avrecovery.com","http://bwautoparts.com","http://bcautos.com","http://benzamotors.com","http://blackmountainprecision.com","http://boomslang.us","http://buyavette.net","http://buyerservicesinternational.com","http://calimerswheelshop.com","http://carbroker.com.au","http://carcarepeople.com","http://cascadeclassics.com","http://certifiedcarcare.com","http://martinpacker.com","http://aerokits.net","http://chicagovintage.com","http://chuckstrucksllc.com","http://brassauto.com","http://classicbuicks.com","http://classiccarinspections.com","http://s219981800.onlinehome.us","http://classiccarmall.com","http://classiccarprojects.com","http://classicsteeringwheels.com","http://cobrarestorers.com","http://coiloversdirect.co.uk","http://grilleteeth.com","http://cruisinclassics.com","http://curryacuracare.com","http://customclassic.com","http://cygnusperformance.com","http://factoryservicecontracts.com","http://hotrodproducts.com","http://daytonaparts.com","http://officialhyundaiwarranty.com","http://deucesteel.com","http://dewittracing.com","http://doubledparts.com","http://dragers.com","http://earlyford.com","http://eatmyflames.com","http://ecklersautomotive.com","http://endlessendeavors.com","http://europerformance.co.uk","http://europeancollectibles.com","http://expertautoappraisals.com","http://manheimglobaltrader.com","http://extended-warranty-pro.com","http://funkypower.co.uk","http://geneshotrodparts.com","http://glasermotors.com","http://goodsamesp.com","http://gotboostinc.com","http://greaterdakotaclassics.com","http://handhantique.com","http://hardtopstands.com","http://eharwood.com","http://heidts.com","http://thehotrodgirl.com","http://hotrodssuperstore.com","http://hotrods2die4.com","http://hptmotorsports.com","http://importperformance.com","http://oldradman.com","http://classic-carstore.com","http://i-van.org","http://islandmotorsports.com","http://jaycorptech.com","http://jbmotors.net","http://jefflilly.com","http://woodwheels.com","http://classic-new.com","http://jscspeed.com","http://key-men.com","http://kfxperformance.com","http://klasse356.com","http://kmbritishcars.ca","http://landefabrication.com","http://landlproducts.com","http://lanocharacing.com","http://larryscarsparts.com","http://littledearborn.com","http://lostnthe50sclassiccars.com","http://luzzago.com","http://maidstonesportscars.co.uk","http://vintageandclassiccars.co.uk","http://maxmerrittauto.com","http://britbits.com","http://memorylaneclassiccars.com","http://englishwheels.net","http://metrommp.com","http://mgcity.com.au","http://moderncapriparts.biz","http://mooneyes.com","http://themotorcompany.com","http://mustangdreams.com","http://mycarinspections.co.uk","http://nationalmoparts.com","http://classicmustang.com","http://newcarslowestprice.com","http://newtoncomm.co.uk","http://capecodmustang.com","http://northernclassictrucks.com","http://classicmusclecars.com","http://option1garage.com.au","http://pagparts.com","http://parrautomotive.com","http://partsfromthepast.com","http://peakesclassics.com","http://performancedepot.com","http://perrysprojectcars.com","http://peter-byrne.com","http://musclecardecals.net","http://autoappraisers.com","http://prestigecarnet.com.au","http://rrclassiccars.com","http://racinggreencars.com","http://store.racinglab.com","http://radersrelics.com","http://ratsglassbodies.com","http://rdfabs.com","http://reds-headers.com","http://rtcc.co.uk","http://ezboyinteriors.com","http://rollingart.com","http://rpmvt.com","http://ruckusrods.com","http://runnymedemotorcompany.com","http://sandersreproglass.com","http://satingloss.com","http://scottssupertrucks.com","http://securecarcare.com","http://selectmotors.net","http://shafersclassic.com","http://shiftworks.com","http://show-cars.com","http://sidchaverscompany.com","http://sleemansclassiccars.com","http://slidegood.com","http://villageservice.com","http://stencilsandstripes.com","http://stonebridgecars.com","http://streetrodgarage.com","http://streetrodglass.com","http://srbymichael.com","http://rodsforsale.com","http://highspeedmotors.com","http://studebakerparts.com","http://sunsetclassics.com","http://texasclassiccarsofdallas.com","http://tfbdesigns.com","http://then-now-auto.com","http://thunderbirdsouthwest.com","http://tolesautomotive.com","http://totallyautoinc.com","http://tr-classic.de","http://turborevs.org.uk","http://twmperformance.com","http://jagxk.com","http://ultramaticdynamics.com","http://usaautoappraisers.com","http://usedeclipseparts.com","http://usedcarinspections.org","http://vintagerodcomponents.com","http://vintagecarradiatorcompany.co.uk","http://vintagemotorgarage.com","http://vipclassics.com","http://vsoc.nl","http://wwmotorcars.com","http://warrantydirect.com","http://warrantywarehouse.com","http://watsons-streetworks.com","http://weatherstripspecial.com","http://wescottsauto.com","http://willysreplacementparts.com","http://wirthscustomauto.com","http://fordwood.com","http://woodiesusa.com","http://gearheadcity.com","http://woolcockantiqueauto.com","http://wow-products.com","http://xatracing.com","http://yearwood.com","http://carfax.com","http://cars.com","http://cargurus.com","http://truecar.com","http://kbb.com","http://edmunds.com","http://caranddriver.com","http://motortrend.com","http://carsforsale.com","http://thecarconnection.com","http://autoblog.com","http://jdpower.com","http://autolist.com","http://auto.com","http://carsdirect.com","http://carvana.com","http://toyota.com","http://nadaguides.com","http://roadandtrack.com","http://chevrolet.com","http://fueleconomy.gov","http://ford.com","http://iseecars.com","http://usnews.com","http://awadserver.com","http://consumerreports.org","http://autoguide.com","http://nissanusa.com","http://jalopnik.com","http://honda.com","http://motor1.com","http://mbusa.com","http://jeep.com","http://lexus.com","http://mazdausa.com","http://subaru.com","http://driving.ca","http://audiusa.com","http://autotrader.ca","http://enterprisecarsales.com","http://gmc.com","http://greencarreports.com","http://autoweb.com","http://acura.com","http://autowise.com","http://bmwusa.com","http://newcars.com","http://autoweek.com","http://hyundaiusa.com","http://hemmings.com","http://realtor.com","http://repairpal.com","http://vw.com","http://classiccars.com","http://auto123.com","http://craigslist.org","http://autonews.com","http://fuelly.com","http://nerdwallet.com","http://topspeed.com","http://whatcar.com","http://carbuzz.com","http://creditkarma.com","http://bankrate.com","http://capitalone.com","http://imotors.com","http://vroom.com","http://carsguide.com.au","http://bbb.org","http://dodge.com","http://hotcars.com","http://vauto.com","http://vehiclehistory.com","http://automotivetouchup.com","http://thetruthaboutcars.com","http://zillow.com","http://carsgenius.com","http://hagerty.com","http://homedepot.com","http://buyerlink.com","http://carfaxonline.com","http://yelp.com","http://lowes.com","http://redfin.com","http://att.com","http://autonation.com","http://bankofamerica.com","http://carcomplaints.com","http://costco.com","http://vinurl.com","http://carwow.co.uk","http://7passengervehicleszone.com","http://carophile.com","http://getauto.com","http://usedcars.com","http://autotempest.com","http://choosenissan.com","http://dealer.com","http://leasehackr.com","http://mate1.com","http://mysearches.net","http://paintscratch.com","http://badvin.org","http://carsoup.com","http://manheim.com","http://surecritic.com","http://torquenews.com","http://gmfleet.com","http://instamotor.com","http://agirlsguidetocars.com","http://autoconsumerinfo.com","http://best8seatersuv.com","http://faqtoids.com","http://germaincars.com","http://gtcarlot.com","http://carwise.com","http://buick.com","http://nada.com","http://alamo.com","http://carvillesautomart.com","http://leasetrader.com","http://motominer.com","http://quicklane.com","http://westernslopeauto.com","http://airportvanrental.com","http://confused.com","http://dealerrater.ca","http://hireology.com","http://nationalcar.com","http://snap21.com","http://vwserviceandparts.com"],"segments":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52]}]} \ No newline at end of file +{"locale":"us","version":1,"timestamp":"2020-05-15 00:00:00","parameters":{"signal_level":1,"classification_threshold":10,"signal_decay_time_window_in_seconds":100},"segments":["segment 1","segment 2","segment 3"],"segment_keywords":{"segment keyword 1":[0],"segment keyword 2":[0,1]},"funnel_keywords":{"funnel keyword 1":2,"funnel keyword 2":3},"funnel_sites":[{"sites":["https://brave.com","https://crave.com"],"segments":[1,2]},{"sites":["https://frexample.org","https://example.org"],"segments":[0]}]} \ No newline at end of file diff --git a/vendor/bat-native-ads/include/bat/ads/ad_type.h b/vendor/bat-native-ads/include/bat/ads/ad_type.h index 83bb8399ceda..6711baf0bdb8 100644 --- a/vendor/bat-native-ads/include/bat/ads/ad_type.h +++ b/vendor/bat-native-ads/include/bat/ads/ad_type.h @@ -25,7 +25,7 @@ class AdType { const Value& value) : value_(value) {} - explicit AdType( + AdType( const std::string& value); Value value() const; diff --git a/vendor/bat-native-ads/include/bat/ads/ads.h b/vendor/bat-native-ads/include/bat/ads/ads.h index 3afaff27c962..1d33f3a09854 100644 --- a/vendor/bat-native-ads/include/bat/ads/ads.h +++ b/vendor/bat-native-ads/include/bat/ads/ads.h @@ -39,19 +39,19 @@ extern Environment _environment; extern BuildChannel _build_channel; // |_is_debug| indicates that the next catalog download should be reduced from -// ~1 hour to ~25 seconds. This value should be set to |false| on production -// builds and |true| on debug builds but can be overridden via command-line +// ~1 hour to ~25 seconds. This value should be set to false on production +// builds and true on debug builds but can be overridden via command-line // arguments extern bool _is_debug; // Catalog schema resource id extern const char _catalog_schema_resource_id[]; -// Returns |true| if the locale is supported; otherwise returns |false| +// Returns true if the locale is supported otherwise returns false bool IsSupportedLocale( const std::string& locale); -// Returns |true| if the locale is newly supported; otherwise returns |false| +// Returns true if the locale is newly supported otherwise returns false bool IsNewlySupportedLocale( const std::string& locale, const int last_schema_version); @@ -64,74 +64,64 @@ class ADS_EXPORT Ads { static Ads* CreateInstance( AdsClient* ads_client); - // Should be called to initialize ads, i.e. when launching the browser or when - // ads is implicitly enabled by a user on the client. The callback takes one - // argument — |Result| should be set to |SUCCESS| if successful; otherwise, - // should be set to |FAILED| + // Should be called to initialize ads when launching the browser or when ads + // is enabled by a user. The callback takes one argument — |Result| should be + // set to |SUCCESS| if successful otherwise should be set to |FAILED| virtual void Initialize( InitializeCallback callback) = 0; - // Should be called to shutdown ads when a user implicitly disables ads. - // Shutting down ads will call |CloseNotification| for each ad notification in - // the Notification Center on the client. The callback takes one argument — - // |Result| should be set to |SUCCESS| if successful; otherwise, should be set - // to |FAILED| + // Should be called to shutdown ads when a user disables ads. The callback + // takes one argument — |Result| should be set to |SUCCESS| if successful + // otherwise should be set to |FAILED| virtual void Shutdown( ShutdownCallback callback) = 0; - // Should be called when the user implicitly changes the locale of their - // operating system. This call is not required if the operating system - // restarts the browser when changing locale. |locale| should be specified in - // any of the following formats: - // - // - i.e. en-US - // -. i.e. en-US.UTF-8 - // _ i.e. en_US - // -. i.e. en_US.UTF-8 + // Should be called when the user changes the locale of their operating + // system. This call is not required if the operating system restarts the + // browser when changing the locale. |locale| should be specified in either + // - or _ format virtual void ChangeLocale( const std::string& locale) = 0; // Should be called when the ads subdivision targeting code has changed virtual void OnAdsSubdivisionTargetingCodeHasChanged() = 0; - // Should be called when a page has loaded in a browser tab, and the HTML is - // available for analysis + // Should be called when a page has loaded and the content is available for + // analysis virtual void OnPageLoaded( const int32_t tab_id, const std::string& original_url, const std::string& url, - const std::string& html) = 0; + const std::string& content) = 0; // Should be called when a user is no longer idle. This call is optional for // mobile devices virtual void OnUnIdle() = 0; - // Should be called when a user is idle for the specified threshold set in + // Should be called when a user is idle for the threshold set in // |SetIdleThreshold|. This call is optional for mobile devices virtual void OnIdle() = 0; - // Should be called when the browser enters the foreground + // Should be called when the browser becomes active virtual void OnForeground() = 0; // Should be called when the browser enters the background virtual void OnBackground() = 0; - // Should be called to report when the media has started playing on the - // browser tab specified by |tab_id| + // Should be called when media starts playing on a browser tab virtual void OnMediaPlaying( const int32_t tab_id) = 0; - // Should be called to report when the media has stopped playing on the - // browser tab specified by |tab_id| + // Should be called when media stops playing on a browser tab virtual void OnMediaStopped( const int32_t tab_id) = 0; - // Should be called to report user activity on a browser tab specified by - // |tab_id|. |is_active| should be set to |true| if |tab_id| refers to the - // currently active tab; otherwise, should be set to |false|. - // |is_browser_active| should be set to |true| if the current browser window - // is active; otherwise, should be set to |false|. |is_incognito| should be - // set to |true| if the tab is private; otherwise, should be set to |false| + // Should be called when a browser tab is updated. |is_active| should be set + // to true if |tab_id| refers to the currently active tab otherwise should be + // set to false. |is_browser_active| should be set to true if the current + // browser window is active otherwise should be set to false. |is_incognito| + // should be set to true if the tab is private otherwise should be set to + // false virtual void OnTabUpdated( const int32_t tab_id, const std::string& url, @@ -139,29 +129,28 @@ class ADS_EXPORT Ads { const bool is_browser_active, const bool is_incognito) = 0; - // Should be called to report when a browser tab has been closed as specified - // by |tab_id| + // Should be called when a browser tab is closed virtual void OnTabClosed( const int32_t tab_id) = 0; - // Should be called to report when the wallet has been updated + // Should be called when the users wallet has been updated virtual void OnWalletUpdated( const std::string& payment_id, const std::string& seed) = 0; - // Should be called when user model has been updated in the + // Should be called when the user model has been updated by // |BraveUserModelInstaller| component virtual void OnUserModelUpdated( const std::string& id) = 0; - // Should be called to get the notification specified by |uuid|. Returns - // |true| and |info| if the notification exists; otherwise, should return - // |false| + // Should be called to get the ad notification specified by |uuid|. Returns + // true if the ad notification exists otherwise returns false. + // |ad_notification| contains the ad notification for uuid virtual bool GetAdNotification( const std::string& uuid, - AdNotificationInfo* info) = 0; + AdNotificationInfo* ad_notification) = 0; - // Should be called when a user views, clicks or dismisses an ad notification; + // Should be called when a user views, clicks or dismisses an ad notification // or an ad notification times out virtual void OnAdNotificationEvent( const std::string& uuid, @@ -174,7 +163,7 @@ class ADS_EXPORT Ads { const NewTabPageAdEventType event_type) = 0; // Should be called to remove all cached history. The callback takes one - // argument — |Result| should be set to |SUCCESS| if successful; otherwise, + // argument — |Result| should be set to |SUCCESS| if successful otherwise // should be set to |FAILED| virtual void RemoveAllHistory( RemoveAllHistoryCallback callback) = 0; @@ -183,7 +172,8 @@ class ADS_EXPORT Ads { // ad grant is claimed virtual void ReconcileAdRewards() = 0; - // Should be called to get ads history. Returns |AdsHistoryInfo| + // Should be called to get ads history for a specified date range. Returns + // |AdsHistoryInfo| virtual AdsHistoryInfo GetAdsHistory( const AdsHistoryInfo::FilterType filter_type, const AdsHistoryInfo::SortType sort_type, @@ -225,16 +215,16 @@ class ADS_EXPORT Ads { const CategoryContentInfo::OptAction& action) = 0; // Should be called to save an ad for later viewing. This is a toggle, so - // calling it again removes the ad from the saved list. Returns |true| if the - // ad was saved; otherwise, should return |false| + // calling it again removes the ad from the saved list. Returns true if the ad + // was saved otherwise should return false virtual bool ToggleSaveAd( const std::string& creative_instance_id, const std::string& creative_set_id, const bool saved) = 0; // Should be called to flag an ad as inappropriate. This is a toggle, so - // calling it again unflags the ad. Returns |true| if the ad was flagged; - // otherwise returns |false| + // calling it again unflags the ad. Returns true if the ad was flagged + // otherwise returns false virtual bool ToggleFlagAd( const std::string& creative_instance_id, const std::string& creative_set_id, diff --git a/vendor/bat-native-ads/include/bat/ads/ads_client.h b/vendor/bat-native-ads/include/bat/ads/ads_client.h index 24dc3f142e18..14b15b40d540 100644 --- a/vendor/bat-native-ads/include/bat/ads/ads_client.h +++ b/vendor/bat-native-ads/include/bat/ads/ads_client.h @@ -30,77 +30,77 @@ class ADS_EXPORT AdsClient { public: virtual ~AdsClient() = default; - // Should return |true| if there is an available network connection; - // otherwise, should return |false| + // Return true if there is an available network connection otherwise return + // false virtual bool IsNetworkConnectionAvailable() const = 0; - // Should return |true| if the browser is active in the foreground; otherwise, - // should return |false| + // Return true if the browser is active in the foreground otherwise return + // false virtual bool IsForeground() const = 0; - // Should return true if background notifications are allowed + // Return true if notifications should be displayed otherwise return false + virtual bool ShouldShowNotifications() = 0; + + // Return true if notifications can be displayed while the browser is inactive + // otherwise return false virtual bool CanShowBackgroundNotifications() const = 0; - // Should show a notification + // Show notification virtual void ShowNotification( const AdNotificationInfo& ad_notification) = 0; - // Should return |true| if notifications can be displayed; otherwise should - // return |false| - virtual bool ShouldShowNotifications() = 0; - - // Should close a notification + // Close notification virtual void CloseNotification( const std::string& uuid) = 0; - // Should fetch and return data. Loading should be performed asynchronously, - // so that the app remains responsive and should handle incoming data or - // errors as they arrive. The callback takes 1 argument — |URLResponse| should - // contain the url, status code, HTTP body and HTTP headers + // Fetch and return data. Loading should be performed asynchronously, so that + // the app remains responsive and should handle incoming data or errors as + // they arrive. The callback takes 1 argument — |URLResponse| should contain + // the url, status code, HTTP body and HTTP headers virtual void UrlRequest( UrlRequestPtr url_request, UrlRequestCallback callback) = 0; - // Should save a value to persistent storage. The callback takes one argument - // — |Result| should be set to |SUCCESS| if successful; otherwise, should be - // set to |FAILED| + // Save a value to persistent storage. The callback takes one argument — + // |Result| should be set to |SUCCESS| if successful otherwise should be set + // to |FAILED| virtual void Save( const std::string& name, const std::string& value, ResultCallback callback) = 0; - // Should load user model for id from persistent storage. The callback takes 2 - // arguments — |Result| should be set to |SUCCESS| if successful; otherwise, - // should be set to |FAILED|. |value| should contain the user model - virtual void LoadUserModelForId( + // Load a value from persistent storage. The callback takes 2 arguments — + // |Result| should be set to |SUCCESS| if successful otherwise should be set + // to |FAILED|. |value| should contain the persisted value + virtual void Load( const std::string& name, LoadCallback callback) = 0; - // Should record a P2A event of the given type - virtual void RecordP2AEvent( - const std::string& name, - const ads::P2AEventType type, - const std::string& value) = 0; - - // Should load a value from persistent storage. The callback takes 2 arguments - // — |Result| should be set to |SUCCESS| if successful; otherwise, should be - // set to |FAILED|. |value| should contain the persisted value - virtual void Load( + // Load user model for id from persistent storage. The callback takes 2 + // arguments — |Result| should be set to |SUCCESS| if successful otherwise + // should be set to |FAILED|. |value| should contain the user model + virtual void LoadUserModelForId( const std::string& name, LoadCallback callback) = 0; - // Should load a resource from persistent storage + // Should return the resource for given |id| virtual std::string LoadResourceForId( const std::string& id) = 0; - // Should run a database transaction. The callback takes one argument - + // Run database transaction. The callback takes one argument - // |DBCommandResponsePtr| virtual void RunDBTransaction( DBTransactionPtr transaction, RunDBTransactionCallback callback) = 0; - // Should be called when ad rewards has changed + // Should be called when ad rewards have changed, i.e. to refresh the UI virtual void OnAdRewardsChanged() = 0; - // Verbose level logging + // Record P2A event + virtual void RecordP2AEvent( + const std::string& name, + const ads::P2AEventType type, + const std::string& value) = 0; + + // Log diagnostic information virtual void Log( const char* file, const int line, diff --git a/vendor/bat-native-ads/include/bat/ads/confirmation_type.h b/vendor/bat-native-ads/include/bat/ads/confirmation_type.h index 23e8043ce318..29f799c34dff 100644 --- a/vendor/bat-native-ads/include/bat/ads/confirmation_type.h +++ b/vendor/bat-native-ads/include/bat/ads/confirmation_type.h @@ -33,7 +33,7 @@ class ConfirmationType { const Value& value) : value_(value) {} - explicit ConfirmationType( + ConfirmationType( const std::string& value); Value value() const; diff --git a/vendor/bat-native-ads/include/bat/ads/database.h b/vendor/bat-native-ads/include/bat/ads/database.h index aa52d3b928b8..7aa8cbd4d9df 100644 --- a/vendor/bat-native-ads/include/bat/ads/database.h +++ b/vendor/bat-native-ads/include/bat/ads/database.h @@ -23,7 +23,7 @@ namespace ads { class ADS_EXPORT Database { public: - explicit Database( + Database( const base::FilePath& path); ~Database(); @@ -65,7 +65,7 @@ class ADS_EXPORT Database { base::FilePath db_path_; sql::Database db_; sql::MetaTable meta_table_; - bool is_initialized_; + bool is_initialized_ = false; std::unique_ptr memory_pressure_listener_; 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 311496ef5307..48518c07724f 100644 --- a/vendor/bat-native-ads/include/bat/ads/pref_names.h +++ b/vendor/bat-native-ads/include/bat/ads/pref_names.h @@ -23,6 +23,11 @@ extern const char kShouldAllowAdsSubdivisionTargeting[]; extern const char kAdsSubdivisionTargetingCode[]; extern const char kAutoDetectedAdsSubdivisionTargetingCode[]; +extern const char kCatalogId[]; +extern const char kCatalogVersion[]; +extern const char kCatalogPing[]; +extern const char kCatalogLastUpdated[]; + } // namespace prefs } // namespace ads diff --git a/vendor/bat-native-ads/include/bat/ads/statement_info.h b/vendor/bat-native-ads/include/bat/ads/statement_info.h index 38f4f3bccb95..476f47f2d788 100644 --- a/vendor/bat-native-ads/include/bat/ads/statement_info.h +++ b/vendor/bat-native-ads/include/bat/ads/statement_info.h @@ -30,6 +30,7 @@ struct ADS_EXPORT StatementInfo { uint64_t next_payment_date_in_seconds = 0; uint64_t ad_notifications_received_this_month = 0; TransactionList transactions; + TransactionList uncleared_transactions; private: double GetEstimatedPendingRewardsFromDictionary( @@ -44,6 +45,10 @@ struct ADS_EXPORT StatementInfo { base::Value GetTransactionsAsList() const; TransactionList GetTransactionsFromDictionary( base::DictionaryValue* dictionary) const; + + base::Value GetUnclearedTransactionsAsList() const; + TransactionList GetUnclearedTransactionsFromDictionary( + base::DictionaryValue* dictionary) const; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/ad_history_info.cc b/vendor/bat-native-ads/src/bat/ads/ad_history_info.cc index 4047f97e6727..e14eed30091c 100644 --- a/vendor/bat-native-ads/src/bat/ads/ad_history_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/ad_history_info.cc @@ -5,8 +5,8 @@ #include "bat/ads/ad_history_info.h" +#include "bat/ads/internal/legacy_migration/legacy_migration_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/json_helper.h" namespace ads { @@ -47,9 +47,8 @@ Result AdHistoryInfo::FromJson( } if (document.HasMember("timestamp_in_seconds")) { - auto migrated_timestamp_in_seconds = - MigrateTimestampToDoubleT(document["timestamp_in_seconds"].GetUint64()); - timestamp_in_seconds = migrated_timestamp_in_seconds; + timestamp_in_seconds = MigrateTimestampToDoubleT( + document["timestamp_in_seconds"].GetUint64()); } if (document.HasMember("ad_content")) { diff --git a/vendor/bat-native-ads/src/bat/ads/database.cc b/vendor/bat-native-ads/src/bat/ads/database.cc index 81407379f6ec..8d89d5581ccd 100644 --- a/vendor/bat-native-ads/src/bat/ads/database.cc +++ b/vendor/bat-native-ads/src/bat/ads/database.cc @@ -105,8 +105,7 @@ DBRecordPtr CreateRecord( Database::Database( const base::FilePath& path) - : db_path_(path), - is_initialized_(false) { + : db_path_(path) { DETACH_FROM_SEQUENCE(sequence_checker_); db_.set_error_callback(base::BindRepeating(&Database::OnErrorCallback, @@ -203,8 +202,7 @@ DBCommandResponse::Status Database::Initialize( } is_initialized_ = true; - memory_pressure_listener_.reset(new base::MemoryPressureListener( - FROM_HERE, + memory_pressure_listener_.reset(new base::MemoryPressureListener(FROM_HERE, base::Bind(&Database::OnMemoryPressure, base::Unretained(this)))); } else { table_version = meta_table_.GetVersionNumber(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/account.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/account.cc new file mode 100644 index 000000000000..bd9a5cdb77eb --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/account.cc @@ -0,0 +1,201 @@ +/* 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/account/account.h" + +#include "bat/ads/internal/account/ad_rewards/ad_rewards.h" +#include "bat/ads/internal/account/statement/statement.h" +#include "bat/ads/internal/account/transactions/transactions.h" +#include "bat/ads/internal/account/wallet/wallet.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" +#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/logging.h" +#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" +#include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h" +#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h" + +namespace ads { + +Account::Account( + Confirmations* confirmations) + : confirmations_(confirmations), + wallet_(std::make_unique()), + ad_rewards_(std::make_unique()), + redeem_unblinded_payment_tokens_(std::make_unique< + RedeemUnblindedPaymentTokens>()), + refill_unblinded_tokens_(std::make_unique()) { + DCHECK(confirmations_); + + confirmations_->AddObserver(this); + + // TODO(https://github.com/brave/brave-browser/issues/12563): Decouple Brave + // Ads rewards state from confirmations + confirmations_->set_ad_rewards(ad_rewards_.get()); + + ad_rewards_->set_delegate(this); + redeem_unblinded_payment_tokens_->set_delegate(this); +} + +Account::~Account() { + confirmations_->RemoveObserver(this); + ad_rewards_->set_delegate(nullptr); + redeem_unblinded_payment_tokens_->set_delegate(nullptr); +} + +void Account::AddObserver( + AccountObserver* observer) { + observers_.AddObserver(observer); +} + +void Account::RemoveObserver( + AccountObserver* observer) { + observers_.RemoveObserver(observer); +} + +bool Account::SetWallet( + const std::string& id, + const std::string& seed) { + const WalletInfo last_wallet = wallet_->Get(); + + if (!wallet_->Set(id, seed)) { + BLOG(0, "Invalid wallet"); + NotifyWalletInvalid(); + return false; + } + + const WalletInfo wallet = wallet_->Get(); + + if (last_wallet.IsValid() && last_wallet != wallet) { + NotifyWalletRestored(wallet); + } + + NotifyWalletChanged(wallet); + + return true; +} + +WalletInfo Account::GetWallet() const { + return wallet_->Get(); +} + +StatementInfo Account::GetStatement( + const int64_t from_timestamp, + const int64_t to_timestamp) const { + DCHECK(to_timestamp >= from_timestamp); + + StatementInfo statement; + + statement.estimated_pending_rewards = + ad_rewards_->GetEstimatedPendingRewards(); + + statement.next_payment_date_in_seconds = + ad_rewards_->GetNextPaymentDateInSeconds(); + + statement.ad_notifications_received_this_month = + ad_rewards_->GetAdNotificationsReceivedThisMonth(); + + statement.transactions = + transactions::GetCleared(from_timestamp, to_timestamp); + + return statement; +} + +void Account::Reconcile() { + const WalletInfo wallet = GetWallet(); + ad_rewards_->MaybeReconcile(wallet); +} + +void Account::ProcessUnclearedTransactions() { + const WalletInfo wallet = GetWallet(); + redeem_unblinded_payment_tokens_->MaybeRedeemAfterDelay(wallet); +} + +void Account::TopUpUnblindedTokens() { + const WalletInfo wallet = GetWallet(); + refill_unblinded_tokens_->MaybeRefill(wallet); +} + +/////////////////////////////////////////////////////////////////////////////// + +void Account::NotifyWalletChanged( + const WalletInfo& wallet) { + for (AccountObserver& observer : observers_) { + observer.OnWalletChanged(wallet); + } +} + +void Account::NotifyWalletRestored( + const WalletInfo& wallet) { + for (AccountObserver& observer : observers_) { + observer.OnWalletRestored(wallet); + } +} + +void Account::NotifyWalletInvalid() { + for (AccountObserver& observer : observers_) { + observer.OnWalletInvalid(); + } +} + +void Account::NotifyAdRewardsChanged() { + for (AccountObserver& observer : observers_) { + observer.OnAdRewardsChanged(); + } +} + +void Account::NotifyTransactionsChanged() { + for (AccountObserver& observer : observers_) { + observer.OnTransactionsChanged(); + } +} + +void Account::NotifyUnclearedTransactionsProcessed() { + for (AccountObserver& observer : observers_) { + observer.OnUnclearedTransactionsProcessed(); + } +} + +void Account::OnConfirmAd( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation) { + transactions::Add(estimated_redemption_value, confirmation); + NotifyTransactionsChanged(); + + TopUpUnblindedTokens(); +} + +void Account::OnConfirmAdFailed( + const ConfirmationInfo& confirmation) { + TopUpUnblindedTokens(); + + confirmations_->RetryAfterDelay(); +} + +void Account::OnDidReconcileAdRewards() { + NotifyAdRewardsChanged(); +} + +void Account::OnDidRedeemUnblindedPaymentTokens() { + BLOG(1, "Successfully redeemed unblinded payment tokens"); + + const TransactionList transactions = transactions::GetUncleared(); + ad_rewards_->SetUnreconciledTransactions(transactions); + + ConfirmationsState::Get()->get_unblinded_payment_tokens()->RemoveAllTokens(); + ConfirmationsState::Get()->Save(); + + Reconcile(); +} + +void Account::OnFailedToRedeemUnblindedPaymentTokens() { + BLOG(1, "Failed to redeem unblinded payment tokens"); +} + +void Account::OnDidRetryRedeemingUnblindedPaymentTokens() { + BLOG(1, "Retry redeeming unblinded payment tokens"); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/account.h b/vendor/bat-native-ads/src/bat/ads/internal/account/account.h new file mode 100644 index 000000000000..89da09277b2a --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/account.h @@ -0,0 +1,97 @@ +/* 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 BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_H_ + +#include +#include + +#include "bat/ads/internal/account/account_observer.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h" +#include "bat/ads/internal/confirmations/confirmations_observer.h" +#include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_delegate.h" +#include "bat/ads/transaction_info.h" + +namespace ads { + +class AdRewards; +class Confirmations; +class RedeemUnblindedPaymentTokens; +class RefillUnblindedTokens; +class Wallet; +struct StatementInfo; +struct WalletInfo; + +class Account + : public AdRewardsDelegate, + public ConfirmationsObserver, + public RedeemUnblindedPaymentTokensDelegate { + public: + Account( + Confirmations* confirmations); + + ~Account() override; + + void AddObserver( + AccountObserver* observer); + void RemoveObserver( + AccountObserver* observer); + + bool SetWallet( + const std::string& id, + const std::string& seed); + + WalletInfo GetWallet() const; + + StatementInfo GetStatement( + const int64_t from_timestamp, + const int64_t to_timestamp) const; + + void Reconcile(); + + void ProcessUnclearedTransactions(); + + void TopUpUnblindedTokens(); + + private: + base::ObserverList observers_; + + Confirmations* confirmations_; // NOT OWNED + + std::unique_ptr wallet_; + std::unique_ptr ad_rewards_; + std::unique_ptr + redeem_unblinded_payment_tokens_; + std::unique_ptr refill_unblinded_tokens_; + + void NotifyWalletChanged( + const WalletInfo& wallet); + void NotifyWalletRestored( + const WalletInfo& wallet); + void NotifyWalletInvalid(); + void NotifyAdRewardsChanged(); + void NotifyTransactionsChanged(); + void NotifyUnclearedTransactionsProcessed(); + + // AdRewardsDelegate implementation + void OnDidReconcileAdRewards() override; + + // ConfirmationsObserver implementation + void OnConfirmAd( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation) override; + void OnConfirmAdFailed( + const ConfirmationInfo& confirmation) override; + + // RedeemUnblindedPaymentTokensDelegate implementation + void OnDidRedeemUnblindedPaymentTokens() override; + void OnFailedToRedeemUnblindedPaymentTokens() override; + void OnDidRetryRedeemingUnblindedPaymentTokens() override; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/account_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/account/account_observer.h new file mode 100644 index 000000000000..497a2750e7f1 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/account_observer.h @@ -0,0 +1,43 @@ +/* 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 BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_OBSERVER_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_OBSERVER_H_ + +#include "base/observer_list.h" + +namespace ads { + +struct WalletInfo; + +class AccountObserver : public base::CheckedObserver { + public: + // Invoked when the wallet has changed + virtual void OnWalletChanged( + const WalletInfo& wallet) {} + + // Invoked when a wallet is restored + virtual void OnWalletRestored( + const WalletInfo& wallet) {} + + // Invoked if the wallet is invalid + virtual void OnWalletInvalid() {} + + // Invoked when ad rewards have changed + virtual void OnAdRewardsChanged() {} + + // Invoked when transactions have changed + virtual void OnTransactionsChanged() {} + + // Invoked when uncleared transactions have been processed + virtual void OnUnclearedTransactionsProcessed() {} + + protected: + ~AccountObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ACCOUNT_ACCOUNT_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.cc similarity index 96% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.cc index 4d84beb9fa26..3c4b494cb61b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.cc @@ -3,7 +3,7 @@ * 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/ad_rewards/ad_grants/ad_grants.h" +#include "bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h" #include "base/json/json_reader.h" #include "base/strings/string_number_conversions.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h similarity index 100% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_unittest.cc similarity index 96% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_unittest.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_unittest.cc index aab29d2a20e1..5f46ba7c62a1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_unittest.cc @@ -3,7 +3,7 @@ * 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/ad_rewards/ad_grants/ad_grants.h" +#include "bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h" #include diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.cc similarity index 93% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.cc index 99a198e6f66d..018d758358c4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.cc @@ -3,7 +3,7 @@ * 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/ad_rewards/ad_grants/ad_grants_url_request_builder.h" +#include "bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h" #include "base/strings/stringprintf.h" #include "bat/ads/internal/logging.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h similarity index 94% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h index 89e9928f63f7..09429b1a79df 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h @@ -8,7 +8,7 @@ #include -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/server/url_request_builder.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.cc similarity index 76% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.cc index 7b54bcf21a58..5d82dbcddde9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.cc @@ -3,41 +3,87 @@ * 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/ad_rewards/ad_rewards.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards.h" #include #include +#include "base/time/time.h" #include "net/http/http_status_code.h" -#include "bat/ads/internal/account/transactions.h" -#include "bat/ads/internal/ad_rewards/ad_grants/ad_grants.h" -#include "bat/ads/internal/ad_rewards/ad_grants/ad_grants_url_request_builder.h" -#include "bat/ads/internal/ad_rewards/payments/payments.h" -#include "bat/ads/internal/ad_rewards/payments/payments_url_request_builder.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/account/ad_rewards/ad_grants/ad_grants.h" +#include "bat/ads/internal/account/ad_rewards/ad_grants/ad_grants_url_request_builder.h" +#include "bat/ads/internal/account/ad_rewards/payments/payments.h" +#include "bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h" +#include "bat/ads/internal/account/transactions/transactions.h" +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/transaction_info.h" namespace ads { -using std::placeholders::_1; - namespace { -const uint64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; + +const int64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; + +double CalculateEstimatedPendingRewardsForTransactions( + const TransactionList& transactions) { + double estimated_pending_rewards = 0.0; + + for (const auto& transaction : transactions) { + estimated_pending_rewards += transaction.estimated_redemption_value; + } + + return estimated_pending_rewards; +} + +uint64_t CalculateAdNotificationsReceivedThisMonthForTransactions( + const TransactionList& transactions) { + uint64_t ad_notifications_received_this_month = 0; + + auto now = base::Time::Now(); + base::Time::Exploded now_exploded; + now.UTCExplode(&now_exploded); + + for (const auto& transaction : transactions) { + if (transaction.timestamp == 0) { + // Workaround for Windows crash when passing 0 to UTCExplode + continue; + } + + auto transaction_timestamp = + base::Time::FromDoubleT(transaction.timestamp); + + base::Time::Exploded transaction_timestamp_exploded; + transaction_timestamp.UTCExplode(&transaction_timestamp_exploded); + + if (transaction_timestamp_exploded.year == now_exploded.year && + transaction_timestamp_exploded.month == now_exploded.month && + transaction.estimated_redemption_value > 0.0 && + ConfirmationType(transaction.confirmation_type) == + ConfirmationType::kViewed) { + ad_notifications_received_this_month++; + } + } + + return ad_notifications_received_this_month; +} + } // namespace -AdRewards::AdRewards( - AdsImpl* ads) - : ads_(ads), - ad_grants_(std::make_unique()), +AdRewards::AdRewards() + : ad_grants_(std::make_unique()), payments_(std::make_unique()) { - DCHECK(ads_); } AdRewards::~AdRewards() = default; +void AdRewards::set_delegate( + AdRewardsDelegate* delegate) { + delegate_ = delegate; +} + void AdRewards::MaybeReconcile( const WalletInfo& wallet) { if (is_processing_ || retry_timer_.IsRunning()) { @@ -59,8 +105,7 @@ double AdRewards::GetEstimatedPendingRewards() const { estimated_pending_rewards -= ad_grants_->GetBalance(); - Transactions transactions(ads_); - const TransactionList uncleared_transactions = transactions.GetUncleared(); + const TransactionList uncleared_transactions = transactions::GetUncleared(); const double uncleared_estimated_pending_rewards = CalculateEstimatedPendingRewardsForTransactions(uncleared_transactions); estimated_pending_rewards += uncleared_estimated_pending_rewards; @@ -78,7 +123,7 @@ uint64_t AdRewards::GetNextPaymentDateInSeconds() const { const base::Time now = base::Time::Now(); const base::Time next_token_redemption_date = - ads_->get_confirmations()->get_next_token_redemption_date(); + ConfirmationsState::Get()->get_next_token_redemption_date(); const base::Time next_payment_date = payments_->CalculateNextPaymentDate(now, next_token_redemption_date); @@ -88,7 +133,7 @@ uint64_t AdRewards::GetNextPaymentDateInSeconds() const { uint64_t AdRewards::GetAdNotificationsReceivedThisMonth() const { const TransactionList transactions = - ads_->get_confirmations()->get_transactions(); + ConfirmationsState::Get()->get_transactions(); return CalculateAdNotificationsReceivedThisMonthForTransactions(transactions); } @@ -98,18 +143,7 @@ void AdRewards::SetUnreconciledTransactions( CalculateEstimatedPendingRewardsForTransactions( unreconciled_transactions); - ads_->get_confirmations()->Save(); -} - -double AdRewards::CalculateEstimatedPendingRewardsForTransactions( - const TransactionList& transactions) const { - double estimated_pending_rewards = 0.0; - - for (const auto& transaction : transactions) { - estimated_pending_rewards += transaction.estimated_redemption_value; - } - - return estimated_pending_rewards; + ConfirmationsState::Get()->Save(); } base::Value AdRewards::GetAsDictionary() { @@ -176,8 +210,9 @@ void AdRewards::GetPayments() { BLOG(5, UrlRequestToString(url_request)); BLOG(7, UrlRequestHeadersToString(url_request)); - auto callback = std::bind(&AdRewards::OnGetPayments, this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + auto callback = std::bind(&AdRewards::OnGetPayments, this, + std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void AdRewards::OnGetPayments( @@ -189,13 +224,13 @@ void AdRewards::OnGetPayments( if (url_response.status_code != net::HTTP_OK) { BLOG(1, "Failed to get payment balance"); - OnAdRewards(FAILED); + OnFailedToReconcileAdRewards(); return; } if (!payments_->SetFromJson(url_response.body)) { BLOG(0, "Failed to parse payment balance: " << url_response.body); - OnAdRewards(FAILED); + OnFailedToReconcileAdRewards(); return; } @@ -211,8 +246,9 @@ void AdRewards::GetAdGrants() { BLOG(5, UrlRequestToString(url_request)); BLOG(7, UrlRequestHeadersToString(url_request)); - auto callback = std::bind(&AdRewards::OnGetAdGrants, this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + auto callback = std::bind(&AdRewards::OnGetAdGrants, this, + std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void AdRewards::OnGetAdGrants( @@ -224,44 +260,54 @@ void AdRewards::OnGetAdGrants( if (url_response.status_code == net::HTTP_NO_CONTENT) { ad_grants_ = std::make_unique(); - OnAdRewards(SUCCESS); + OnDidReconcileAdRewards(); return; } if (url_response.status_code != net::HTTP_OK) { BLOG(1, "Failed to get ad grants"); - OnAdRewards(FAILED); + OnFailedToReconcileAdRewards(); return; } if (!ad_grants_->SetFromJson(url_response.body)) { BLOG(0, "Failed to parse ad grants: " << url_response.body); - OnAdRewards(FAILED); + OnFailedToReconcileAdRewards(); return; } - OnAdRewards(SUCCESS); + OnDidReconcileAdRewards(); } -void AdRewards::OnAdRewards( - const Result result) { +void AdRewards::OnDidReconcileAdRewards() { is_processing_ = false; - if (result != SUCCESS) { - BLOG(1, "Failed to reconcile ad rewards"); + BLOG(1, "Successfully reconciled ad rewards"); + + retry_timer_.Stop(); + + unreconciled_estimated_pending_rewards_ = 0.0; + ConfirmationsState::Get()->Save(); - Retry(); + if (!delegate_) { return; } - BLOG(1, "Successfully reconciled ad rewards"); + delegate_->OnDidReconcileAdRewards(); +} - retry_timer_.Stop(); +void AdRewards::OnFailedToReconcileAdRewards() { + is_processing_ = false; - unreconciled_estimated_pending_rewards_ = 0.0; - ads_->get_confirmations()->Save(); + BLOG(1, "Failed to reconcile ad rewards"); + + Retry(); + + if (!delegate_) { + return; + } - ads_->get_ads_client()->OnAdRewardsChanged(); + delegate_->OnFailedToReconcileAdRewards(); } void AdRewards::Retry() { @@ -278,36 +324,4 @@ void AdRewards::OnRetry() { Reconcile(); } -uint64_t AdRewards::CalculateAdNotificationsReceivedThisMonthForTransactions( - const TransactionList& transactions) const { - uint64_t ad_notifications_received_this_month = 0; - - auto now = base::Time::Now(); - base::Time::Exploded now_exploded; - now.UTCExplode(&now_exploded); - - for (const auto& transaction : transactions) { - if (transaction.timestamp == 0) { - // Workaround for Windows crash when passing 0 to UTCExplode - continue; - } - - auto transaction_timestamp = - base::Time::FromDoubleT(transaction.timestamp); - - base::Time::Exploded transaction_timestamp_exploded; - transaction_timestamp.UTCExplode(&transaction_timestamp_exploded); - - if (transaction_timestamp_exploded.year == now_exploded.year && - transaction_timestamp_exploded.month == now_exploded.month && - transaction.estimated_redemption_value > 0.0 && - ConfirmationType(transaction.confirmation_type) == - ConfirmationType::kViewed) { - ad_notifications_received_this_month++; - } - } - - return ad_notifications_received_this_month; -} - } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.h similarity index 78% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.h index 6524e56a49c0..6050ef5078d8 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/ad_rewards.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards.h @@ -11,25 +11,26 @@ #include #include "base/values.h" -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h" #include "bat/ads/internal/backoff_timer.h" #include "bat/ads/mojom.h" -#include "bat/ads/result.h" #include "bat/ads/transaction_info.h" namespace ads { -class AdsImpl; class AdGrants; class Payments; class AdRewards { public: - AdRewards( - AdsImpl* ads); + AdRewards(); ~AdRewards(); + void set_delegate( + AdRewardsDelegate* delegate); + void MaybeReconcile( const WalletInfo& wallet); @@ -37,9 +38,6 @@ class AdRewards { uint64_t GetNextPaymentDateInSeconds() const; uint64_t GetAdNotificationsReceivedThisMonth() const; - double CalculateEstimatedPendingRewardsForTransactions( - const TransactionList& transactions) const; - void SetUnreconciledTransactions( const TransactionList& unreconciled_transactions); @@ -48,6 +46,10 @@ class AdRewards { base::Value* dictionary); private: + bool is_processing_ = false; + + AdRewardsDelegate* delegate_ = nullptr; + WalletInfo wallet_; double unreconciled_estimated_pending_rewards_ = 0.0; @@ -62,20 +64,14 @@ class AdRewards { void OnGetAdGrants( const UrlResponse& url_response); - void OnAdRewards( - const Result result); + void OnDidReconcileAdRewards(); + + void OnFailedToReconcileAdRewards(); BackoffTimer retry_timer_; void Retry(); void OnRetry(); - bool is_processing_ = false; - - uint64_t CalculateAdNotificationsReceivedThisMonthForTransactions( - const TransactionList& transactions) const; - - AdsImpl* ads_; // NOT OWNED - std::unique_ptr ad_grants_; std::unique_ptr payments_; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h new file mode 100644 index 000000000000..e0a516448633 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h @@ -0,0 +1,22 @@ +/* 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 BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_H_ +#define BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_H_ + +namespace ads { + +class AdRewardsDelegate { + public: + virtual ~AdRewardsDelegate() = default; + + virtual void OnDidReconcileAdRewards() = 0; + + virtual void OnFailedToReconcileAdRewards() {} +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.cc new file mode 100644 index 000000000000..98741134d45f --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.cc @@ -0,0 +1,14 @@ +/* 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/account/ad_rewards/ad_rewards_delegate_mock.h" + +namespace ads { + +AdRewardsDelegateMock::AdRewardsDelegateMock() = default; + +AdRewardsDelegateMock::~AdRewardsDelegateMock() = default; + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.h new file mode 100644 index 000000000000..90a56dedb10e --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/ad_rewards_delegate_mock.h @@ -0,0 +1,30 @@ +/* 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 BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_MOCK_H_ +#define BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_MOCK_H_ + +#include "testing/gmock/include/gmock/gmock.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards_delegate.h" + +namespace ads { + +class AdRewardsDelegateMock : public AdRewardsDelegate { + public: + AdRewardsDelegateMock(); + + ~AdRewardsDelegateMock() override; + + AdRewardsDelegateMock(const AdRewardsDelegateMock&) = delete; + AdRewardsDelegateMock& operator=(const AdRewardsDelegateMock&) = delete; + + MOCK_METHOD(void, OnDidReconcileAdRewards, ()); + + MOCK_METHOD(void, OnFailedToReconcileAdRewards, ()); +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_AD_REWARDS_AD_REWARDS_DELEGATE_MOCK_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payment_info.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payment_info.h similarity index 100% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payment_info.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payment_info.h diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.cc similarity index 98% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.cc index a1f0dcfa1abf..2c583381a83a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.cc @@ -3,7 +3,7 @@ * 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/ad_rewards/payments/payments.h" +#include "bat/ads/internal/account/ad_rewards/payments/payments.h" #include @@ -12,7 +12,6 @@ #include "base/strings/stringprintf.h" #include "third_party/re2/src/re2/re2.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.h similarity index 94% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.h index 591e8babe0a4..cda6c2e570f8 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments.h @@ -10,9 +10,9 @@ #include +#include "base/time/time.h" #include "base/values.h" -#include "bat/ads/internal/ad_rewards/payments/payment_info.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/account/ad_rewards/payments/payment_info.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_unittest.cc similarity index 94% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_unittest.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_unittest.cc index 27452b3cf43f..c4a6555aec69 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_unittest.cc @@ -3,55 +3,24 @@ * 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/ad_rewards/payments/payments.h" - -#include +#include "bat/ads/internal/account/ad_rewards/payments/payments.h" #include -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* namespace ads { -class BatAdsPaymentsTest : public ::testing::Test { +class BatAdsPaymentsTest : public UnitTestBase { protected: BatAdsPaymentsTest() : payments_(std::make_unique()) { - // You can do set-up work for each test here - } - - ~BatAdsPaymentsTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) } - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - base::Time TimeFromDateString( - const std::string& date) { - const std::string utc_date = date + " 23:59:59.999 +00:00"; - - base::Time time; - if (!base::Time::FromString(utc_date.c_str(), &time)) { - return base::Time(); - } - - return time; - } + ~BatAdsPaymentsTest() override = default; base::Time GetNextPaymentDate( const std::string& date, diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.cc similarity index 97% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.cc index 5f96b9e9a153..b8769a660421 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.cc @@ -3,7 +3,7 @@ * 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/ad_rewards/payments/payments_url_request_builder.h" +#include "bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h" #include diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.h b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h similarity index 95% rename from vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h index 44abbd6e7058..f5fd163ab867 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_rewards/payments/payments_url_request_builder.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/ad_rewards/payments/payments_url_request_builder.h @@ -9,7 +9,7 @@ #include #include -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/server/url_request_builder.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/statement.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.cc similarity index 58% rename from vendor/bat-native-ads/src/bat/ads/internal/account/statement.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.cc index 9d19ec7210a7..59d8f391166e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/statement.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.cc @@ -3,19 +3,18 @@ * 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/account/statement.h" +#include "bat/ads/internal/account/statement/statement.h" -#include "bat/ads/internal/account/transactions.h" -#include "bat/ads/internal/ad_rewards/ad_rewards.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards.h" +#include "bat/ads/internal/account/transactions/transactions.h" #include "bat/ads/statement_info.h" namespace ads { Statement::Statement( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); + AdRewards* ad_rewards) + : ad_rewards_(ad_rewards) { + DCHECK(ad_rewards_); } Statement::~Statement() = default; @@ -28,17 +27,18 @@ StatementInfo Statement::Get( StatementInfo statement; statement.estimated_pending_rewards = - ads_->get_ad_rewards()->GetEstimatedPendingRewards(); + ad_rewards_->GetEstimatedPendingRewards(); statement.next_payment_date_in_seconds = - ads_->get_ad_rewards()->GetNextPaymentDateInSeconds(); + ad_rewards_->GetNextPaymentDateInSeconds(); statement.ad_notifications_received_this_month = - ads_->get_ad_rewards()->GetAdNotificationsReceivedThisMonth(); + ad_rewards_->GetAdNotificationsReceivedThisMonth(); - Transactions transactions(ads_); statement.transactions = - transactions.Get(from_timestamp, to_timestamp); + transactions::GetCleared(from_timestamp, to_timestamp); + + statement.uncleared_transactions = transactions::GetUncleared(); return statement; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/statement.h b/vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.h similarity index 66% rename from vendor/bat-native-ads/src/bat/ads/internal/account/statement.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.h index 60bcb143925d..ad04b7bc3621 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/statement.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/statement/statement.h @@ -3,20 +3,20 @@ * 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 BAT_ADS_INTERNAL_STATEMENT_STATEMENT_H_ -#define BAT_ADS_INTERNAL_STATEMENT_STATEMENT_H_ +#ifndef BAT_ADS_INTERNAL_ACCOUNT_STATEMENT_STATEMENT_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_STATEMENT_STATEMENT_H_ #include namespace ads { -class AdsImpl; +class AdRewards; struct StatementInfo; class Statement { public: Statement( - AdsImpl* ads); + AdRewards* ad_rewards); ~Statement(); @@ -25,9 +25,9 @@ class Statement { const int64_t to_timestamp); private: - AdsImpl* ads_; // NOT OWNED + AdRewards* ad_rewards_; // NOT OWNED }; } // namespace ads -#endif // BAT_ADS_INTERNAL_STATEMENT_STATEMENT_H_ +#endif // BAT_ADS_INTERNAL_ACCOUNT_STATEMENT_STATEMENT_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/transactions.h b/vendor/bat-native-ads/src/bat/ads/internal/account/transactions.h deleted file mode 100644 index 427f3c83a3f9..000000000000 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/transactions.h +++ /dev/null @@ -1,36 +0,0 @@ -/* 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 BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_H_ -#define BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_H_ - -#include - -#include "bat/ads/transaction_info.h" - -namespace ads { - -class AdsImpl; - -class Transactions { - public: - Transactions( - AdsImpl* ads); - - ~Transactions(); - - TransactionList Get( - const int64_t from_timestamp, - const int64_t to_timestamp) const; - - TransactionList GetUncleared(); - - private: - AdsImpl* ads_; // NOT OWNED -}; - -} // namespace ads - -#endif // BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/transactions.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.cc similarity index 51% rename from vendor/bat-native-ads/src/bat/ads/internal/account/transactions.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.cc index 9ba5102d71d1..0ca1b211cb2b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/transactions.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.cc @@ -3,27 +3,23 @@ * 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/account/transactions.h" +#include "bat/ads/internal/account/transactions/transactions.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include + +#include "base/time/time.h" +#include "bat/ads/internal/confirmations/confirmation_info.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" namespace ads { +namespace transactions { -Transactions::Transactions( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -Transactions::~Transactions() = default; - -TransactionList Transactions::Get( +TransactionList GetCleared( const int64_t from_timestamp, - const int64_t to_timestamp) const { - TransactionList transactions = ads_->get_confirmations()->get_transactions(); + const int64_t to_timestamp) { + TransactionList transactions = ConfirmationsState::Get()->get_transactions(); const auto iter = std::remove_if(transactions.begin(), transactions.end(), [from_timestamp, to_timestamp](TransactionInfo& transaction) { @@ -36,18 +32,18 @@ TransactionList Transactions::Get( return transactions; } -TransactionList Transactions::GetUncleared() { - const size_t count = ads_->get_confirmations()-> - get_unblinded_payment_tokens()->Count(); +TransactionList GetUncleared() { + const size_t count = + ConfirmationsState::Get()->get_unblinded_payment_tokens()->Count(); if (count == 0) { - // There are no outstanding unblinded payment tokens to redeem + // There are no uncleared unblinded payment tokens to redeem return {}; } - // Unredeemed transactions are always at the end of the transaction history + // Uncleared transactions are always at the end of the transaction history const TransactionList transactions = - ads_->get_confirmations()->get_transactions(); + ConfirmationsState::Get()->get_transactions(); if (transactions.size() < count) { // There are fewer transactions than unblinded payment tokens which is @@ -62,4 +58,18 @@ TransactionList Transactions::GetUncleared() { return tail_transactions; } +void Add( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation) { + TransactionInfo transaction; + + transaction.timestamp = static_cast(base::Time::Now().ToDoubleT()); + transaction.estimated_redemption_value = estimated_redemption_value; + transaction.confirmation_type = std::string(confirmation.type); + + ConfirmationsState::Get()->add_transaction(transaction); + ConfirmationsState::Get()->Save(); +} + +} // namespace transactions } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.h b/vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.h new file mode 100644 index 000000000000..4ed6982b7986 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/transactions/transactions.h @@ -0,0 +1,32 @@ +/* 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 BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_TRANSACTIONS_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_TRANSACTIONS_H_ + +#include + +#include "bat/ads/transaction_info.h" + +namespace ads { + +struct ConfirmationInfo; + +namespace transactions { + +TransactionList GetCleared( + const int64_t from_timestamp, + const int64_t to_timestamp); + +TransactionList GetUncleared(); + +void Add( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation); + +} // namespace transactions +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ACCOUNT_TRANSACTIONS_TRANSACTIONS_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.cc similarity index 72% rename from vendor/bat-native-ads/src/bat/ads/internal/account/wallet.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.cc index 737f16e9435f..b2dafdf6e9e1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.cc @@ -3,24 +3,18 @@ * 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/account/wallet.h" +#include "bat/ads/internal/account/wallet/wallet.h" #include #include -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/logging.h" #include "bat/ads/internal/security/security_util.h" #include "bat/ads/internal/string_util.h" namespace ads { -Wallet::Wallet( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Wallet::Wallet() = default; Wallet::~Wallet() = default; @@ -31,7 +25,6 @@ bool Wallet::Set( security::GenerateSecretKeyFromSeed(seed); if (secret_key.empty()) { - BLOG(0, "Invalid wallet secret key"); return false; } @@ -40,15 +33,10 @@ bool Wallet::Set( wallet.secret_key = BytesToHexString(secret_key); if (!wallet.IsValid()) { - BLOG(0, "Invalid wallet"); return false; } - if (wallet_ != wallet) { - wallet_ = wallet; - - ads_->ReconcileAdRewards(); - } + wallet_ = wallet; return true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet.h b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.h similarity index 66% rename from vendor/bat-native-ads/src/bat/ads/internal/account/wallet.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.h index 7333c5323b62..fe89b70c775e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet.h @@ -3,21 +3,18 @@ * 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 BAT_ADS_INTERNAL_WALLET_WALLET_H_ -#define BAT_ADS_INTERNAL_WALLET_WALLET_H_ +#ifndef BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_H_ #include -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" namespace ads { -class AdsImpl; - class Wallet { public: - Wallet( - AdsImpl* ads); + Wallet(); ~Wallet(); @@ -29,10 +26,8 @@ class Wallet { private: WalletInfo wallet_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace ads -#endif // BAT_ADS_INTERNAL_WALLET_WALLET_H_ +#endif // BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.cc b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.cc similarity index 92% rename from vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.cc rename to vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.cc index bb96e4cc871c..bf69bb88502b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.cc @@ -3,7 +3,7 @@ * 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/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.h b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.h similarity index 78% rename from vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.h rename to vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.h index cb64e949d172..b61cb8cfc02c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/account/wallet_info.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/account/wallet/wallet_info.h @@ -3,8 +3,8 @@ * 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 BAT_ADS_WALLET_INFO_H_ -#define BAT_ADS_WALLET_INFO_H_ +#ifndef BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_INFO_H_ +#define BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_INFO_H_ #include @@ -30,4 +30,4 @@ struct WalletInfo { } // namespace ads -#endif // BAT_ADS_WALLET_INFO_H_ +#endif // BAT_ADS_INTERNAL_ACCOUNT_WALLET_WALLET_INFO_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.cc index ee25327574a7..98d93c2c2759 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.cc @@ -9,7 +9,7 @@ #include "bat/ads/ad_notification_info.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/p2a/p2a.h" @@ -18,11 +18,7 @@ namespace ads { namespace ad_notifications { -AdDelivery::AdDelivery( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdDelivery::AdDelivery() = default; AdDelivery::~AdDelivery() = default; @@ -32,7 +28,7 @@ bool AdDelivery::MaybeDeliverAd( return false; } - ads_->get_client()->UpdateSeenAdNotification(ad.creative_instance_id); + Client::Get()->UpdateSeenAdNotification(ad.creative_instance_id); RecordAdImpressionForCategory(ad.category); @@ -45,16 +41,17 @@ bool AdDelivery::MaybeDeliverAd( void AdDelivery::ShowNotification( const AdNotificationInfo& ad) { - ads_->get_ad_notifications()->PushBack(ad); + AdNotifications::Get()->PushBack(ad); + + AdsClientHelper::Get()->ShowNotification(ad); } void AdDelivery::RecordAdImpressionForCategory( const std::string& category) { const std::vector question_list = - CreateAdImpressionQuestionList(category); + p2a::CreateAdImpressionQuestionList(category); - P2A p2a(ads_); - p2a.RecordEvent("ad_impression", question_list); + p2a::RecordEvent("ad_impression", question_list); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h index 4a1024ac5e2e..444876aa03b9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h @@ -10,15 +10,13 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { class AdDelivery { public: - AdDelivery( - AdsImpl* ads); + AdDelivery(); ~AdDelivery(); @@ -31,8 +29,6 @@ class AdDelivery { void RecordAdImpressionForCategory( const std::string& category); - - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_event.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_event.h index 92375a926cd4..942afa76d47b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_event.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_event.h @@ -13,7 +13,7 @@ class AdEvent { public: virtual ~AdEvent() = default; - virtual void Trigger( + virtual void FireEvent( const T&) = 0; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.cc index d0934bb3e31b..f171df0d9c73 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.cc @@ -7,27 +7,18 @@ #include +#include "base/time/time.h" #include "bat/ads/ad_info.h" #include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ad_events/ad_event_info.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" -#include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { -AdEvents::AdEvents( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -AdEvents::~AdEvents() = default; - -void AdEvents::Log( +void LogAdEvent( const AdInfo& ad, const ConfirmationType& confirmation_type, - AdEventsCallback callback) { + AdEventCallback callback) { AdEventInfo ad_event; ad_event.type = ad.type; ad_event.uuid = ad.uuid; @@ -37,22 +28,22 @@ void AdEvents::Log( ad_event.timestamp = static_cast(base::Time::Now().ToDoubleT()); ad_event.confirmation_type = confirmation_type; - Log(ad_event, callback); + LogAdEvent(ad_event, callback); } -void AdEvents::Log( +void LogAdEvent( const AdEventInfo& ad_event, - AdEventsCallback callback) { - database::table::AdEvents database_table(ads_); + AdEventCallback callback) { + database::table::AdEvents database_table; database_table.LogEvent(ad_event, [callback]( const Result result) { callback(result); }); } -void AdEvents::PurgeExpired( - AdEventsCallback callback) { - database::table::AdEvents database_table(ads_); +void PurgeExpiredAdEvents( + AdEventCallback callback) { + database::table::AdEvents database_table; database_table.PurgeExpired([callback]( const Result result) { callback(result); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.h index a8f5d124e3ce..8b16fc8667e4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_events.h @@ -12,35 +12,23 @@ namespace ads { -class AdsImpl; +using AdEventCallback = std::function; + class ConfirmationType; -struct AdInfo; struct AdEventInfo; +struct AdInfo; -using AdEventsCallback = std::function; - -class AdEvents { - public: - AdEvents( - AdsImpl* ads); - - ~AdEvents(); - - void Log( - const AdInfo& ad, - const ConfirmationType& confirmation_type, - AdEventsCallback callback); - - void Log( - const AdEventInfo& ad_event, - AdEventsCallback callback); +void LogAdEvent( + const AdInfo& ad, + const ConfirmationType& confirmation_type, + AdEventCallback callback); - void PurgeExpired( - AdEventsCallback callback); +void LogAdEvent( + const AdEventInfo& ad_event, + AdEventCallback callback); - private: - AdsImpl* ads_; // NOT OWNED -}; +void PurgeExpiredAdEvents( + AdEventCallback callback); } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.cc index 8f5e9830dbf2..8abbac816bc0 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.cc @@ -8,39 +8,25 @@ #include "bat/ads/ad_notification_info.h" #include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ad_transfer/ad_transfer.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" #include "bat/ads/internal/ads_history/ads_history.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" namespace ads { namespace ad_notifications { -namespace { -const ConfirmationType kConfirmationType = ConfirmationType::kClicked; -} // namespace - -AdEventClicked::AdEventClicked( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventClicked::AdEventClicked() = default; AdEventClicked::~AdEventClicked() = default; -void AdEventClicked::Trigger( +void AdEventClicked::FireEvent( const AdNotificationInfo& ad) { BLOG(3, "Clicked ad notification with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - ads_->get_ad_notifications()->Remove(ad.uuid, /* should dismiss */ true); + AdNotifications::Get()->Remove(ad.uuid, /* should dismiss */ true); - ads_->get_ad_transfer()->set_last_clicked_ad(ad); - - AdEvents ad_events(ads_); - ad_events.Log(ad, kConfirmationType, []( + LogAdEvent(ad, ConfirmationType::kClicked, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log ad notification clicked event"); @@ -50,10 +36,7 @@ void AdEventClicked::Trigger( BLOG(1, "Successfully logged ad notification clicked event"); }); - ads_->get_ads_history()->AddAdNotification(ad, kConfirmationType); - - ads_->get_confirmations()->ConfirmAd(ad.creative_instance_id, - kConfirmationType); + history::AddAdNotification(ad, ConfirmationType::kClicked); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.h index b9a5c97c4ad4..aacdd1e7f5cd 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_clicked.h @@ -10,23 +10,18 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { class AdEventClicked : public AdEvent { public: - AdEventClicked( - AdsImpl* ads); + AdEventClicked(); ~AdEventClicked() override; - void Trigger( + void FireEvent( const AdNotificationInfo& ad) override; - - private: - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.cc index 2405289e72ea..5cb1a0fd8c55 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.cc @@ -10,34 +10,23 @@ #include "bat/ads/internal/ad_events/ad_events.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" #include "bat/ads/internal/ads_history/ads_history.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" namespace ads { namespace ad_notifications { -namespace { -const ConfirmationType kConfirmationType = ConfirmationType::kDismissed; -} // namespace - -AdEventDismissed::AdEventDismissed( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventDismissed::AdEventDismissed() = default; AdEventDismissed::~AdEventDismissed() = default; -void AdEventDismissed::Trigger( +void AdEventDismissed::FireEvent( const AdNotificationInfo& ad) { BLOG(3, "Dismissed ad notification with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - ads_->get_ad_notifications()->Remove(ad.uuid, /* should dismiss */ false); + AdNotifications::Get()->Remove(ad.uuid, /* should dismiss */ false); - AdEvents ad_events(ads_); - ad_events.Log(ad, kConfirmationType, []( + LogAdEvent(ad, ConfirmationType::kDismissed, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log ad notification dismissed event"); @@ -47,10 +36,7 @@ void AdEventDismissed::Trigger( BLOG(6, "Successfully logged ad notification dismissed event"); }); - ads_->get_ads_history()->AddAdNotification(ad, kConfirmationType); - - ads_->get_confirmations()->ConfirmAd(ad.creative_instance_id, - kConfirmationType); + history::AddAdNotification(ad, ConfirmationType::kDismissed); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.h index 08b18b9531f9..9bd70a63a046 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.h @@ -10,23 +10,18 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { class AdEventDismissed : public AdEvent { public: - AdEventDismissed( - AdsImpl* ads); + AdEventDismissed(); ~AdEventDismissed() override; - void Trigger( + void FireEvent( const AdNotificationInfo& ad) override; - - private: - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.cc index c39abbc034d4..1697986edd1c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.cc @@ -10,31 +10,27 @@ #include "bat/ads/internal/ad_events/ad_notifications/ad_notification_event_dismissed.h" #include "bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.h" #include "bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.h" -#include "bat/ads/internal/ads_impl.h" namespace ads { namespace ad_notifications { std::unique_ptr> AdEventFactory::Build( - AdsImpl* ads, const AdNotificationEventType event_type) { - DCHECK(ads); - switch (event_type) { case AdNotificationEventType::kViewed: { - return std::make_unique(ads); + return std::make_unique(); } case AdNotificationEventType::kClicked: { - return std::make_unique(ads); + return std::make_unique(); } case AdNotificationEventType::kDismissed: { - return std::make_unique(ads); + return std::make_unique(); } case AdNotificationEventType::kTimedOut: { - return std::make_unique(ads); + return std::make_unique(); } } } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.h index 4c545077e197..42b29e59d572 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.h @@ -13,7 +13,6 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { @@ -21,7 +20,6 @@ namespace ad_notifications { class AdEventFactory { public: static std::unique_ptr> Build( - AdsImpl* ads, const AdNotificationEventType event_type); }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.cc index 46935ddcf102..589c36f1f274 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.cc @@ -7,26 +7,21 @@ #include "bat/ads/ad_notification_info.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/logging.h" namespace ads { namespace ad_notifications { -AdEventTimedOut::AdEventTimedOut( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventTimedOut::AdEventTimedOut() = default; AdEventTimedOut::~AdEventTimedOut() = default; -void AdEventTimedOut::Trigger( +void AdEventTimedOut::FireEvent( const AdNotificationInfo& ad) { BLOG(3, "Timed out ad notification with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - ads_->get_ad_notifications()->Remove(ad.uuid, /* should dismiss */ false); + AdNotifications::Get()->Remove(ad.uuid, /* should dismiss */ false); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.h index 5608efa2afc7..d8e209193a66 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_timed_out.h @@ -10,23 +10,18 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { class AdEventTimedOut : public ads::AdEvent { public: - AdEventTimedOut( - AdsImpl* ads); + AdEventTimedOut(); ~AdEventTimedOut() override; - void Trigger( + void FireEvent( const AdNotificationInfo& ad) override; - - private: - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.cc index 9c242c1a5a5b..de9fa008486c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.cc @@ -9,32 +9,21 @@ #include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ad_events/ad_events.h" #include "bat/ads/internal/ads_history/ads_history.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" namespace ads { namespace ad_notifications { -namespace { -const ConfirmationType kConfirmationType = ConfirmationType::kViewed; -} // namespace - -AdEventViewed::AdEventViewed( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventViewed::AdEventViewed() = default; AdEventViewed::~AdEventViewed() = default; -void AdEventViewed::Trigger( +void AdEventViewed::FireEvent( const AdNotificationInfo& ad) { BLOG(3, "Viewed ad notification with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - AdEvents ad_events(ads_); - ad_events.Log(ad, kConfirmationType, []( + LogAdEvent(ad, ConfirmationType::kViewed, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log ad notification viewed event"); @@ -44,10 +33,7 @@ void AdEventViewed::Trigger( BLOG(6, "Successfully logged ad notification viewed event"); }); - ads_->get_ads_history()->AddAdNotification(ad, kConfirmationType); - - ads_->get_confirmations()->ConfirmAd(ad.creative_instance_id, - kConfirmationType); + history::AddAdNotification(ad, ConfirmationType::kViewed); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.h index c1bbc409e7f7..d12399fcade1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/ad_notifications/ad_notification_event_viewed.h @@ -10,23 +10,18 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; namespace ad_notifications { class AdEventViewed : public AdEvent { public: - AdEventViewed( - AdsImpl* ads); + AdEventViewed(); ~AdEventViewed() override; - void Trigger( + void FireEvent( const AdNotificationInfo& ad) override; - - private: - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.cc index c1540deb77e2..53ee749eae5e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.cc @@ -17,27 +17,16 @@ namespace ads { namespace new_tab_page_ads { -namespace { -const ConfirmationType kConfirmationType = ConfirmationType::kClicked; -} // namespace - -AdEventClicked::AdEventClicked( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventClicked::AdEventClicked() = default; AdEventClicked::~AdEventClicked() = default; -void AdEventClicked::Trigger( +void AdEventClicked::FireEvent( const NewTabPageAdInfo& ad) { BLOG(3, "Clicked new tab page ad with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - ads_->get_ad_transfer()->set_last_clicked_ad(ad); - - AdEvents ad_events(ads_); - ad_events.Log(ad, kConfirmationType, []( + LogAdEvent(ad, ConfirmationType::kClicked, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log new tab page ad clicked event"); @@ -47,10 +36,7 @@ void AdEventClicked::Trigger( BLOG(6, "Successfully logged new tab page ad clicked event"); }); - ads_->get_ads_history()->AddNewTabPageAd(ad, kConfirmationType); - - ads_->get_confirmations()->ConfirmAd(ad.creative_instance_id, - kConfirmationType); + history::AddNewTabPageAd(ad, ConfirmationType::kClicked); } } // namespace new_tab_page_ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.h index 2e4654463b21..ef4a66c15d18 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.h @@ -10,23 +10,18 @@ namespace ads { -class AdsImpl; struct NewTabPageAdInfo; namespace new_tab_page_ads { class AdEventClicked : public AdEvent { public: - AdEventClicked( - AdsImpl* ads); + AdEventClicked(); ~AdEventClicked() override; - void Trigger( + void FireEvent( const NewTabPageAdInfo& ad) override; - - private: - AdsImpl* ads_; // NOT OWNED }; } // namespace new_tab_page_ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.cc index c08416b0cd2e..b528c7b52d68 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.cc @@ -7,24 +7,20 @@ #include "bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_clicked.h" #include "bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/new_tab_page_ad_info.h" namespace ads { namespace new_tab_page_ads { std::unique_ptr> AdEventFactory::Build( - AdsImpl* ads, const NewTabPageAdEventType event_type) { - DCHECK(ads); - switch (event_type) { case NewTabPageAdEventType::kViewed: { - return std::make_unique(ads); + return std::make_unique(); } case NewTabPageAdEventType::kClicked: { - return std::make_unique(ads); + return std::make_unique(); } } } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.h index 63063d09032a..98f84a882304 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_factory.h @@ -13,7 +13,6 @@ namespace ads { -class AdsImpl; struct NewTabPageAdInfo; namespace new_tab_page_ads { @@ -21,7 +20,6 @@ namespace new_tab_page_ads { class AdEventFactory { public: static std::unique_ptr> Build( - AdsImpl* ads, const NewTabPageAdEventType event_type); }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.cc index 4d4195e52692..d6c35a0fddc7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.cc @@ -9,8 +9,7 @@ #include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/ads_history/ads_history.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" #include "bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h" #include "bat/ads/internal/logging.h" @@ -19,21 +18,13 @@ namespace ads { namespace new_tab_page_ads { -namespace { -const ConfirmationType kConfirmationType = ConfirmationType::kViewed; -} // namespace - -AdEventViewed::AdEventViewed( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEventViewed::AdEventViewed() = default; AdEventViewed::~AdEventViewed() = default; -void AdEventViewed::Trigger( +void AdEventViewed::FireEvent( const NewTabPageAdInfo& ad) { - database::table::AdEvents database_table(ads_); + database::table::AdEvents database_table; database_table.GetAll([=]( const Result result, const AdEventList& ad_events) { @@ -56,7 +47,7 @@ void AdEventViewed::Trigger( bool AdEventViewed::ShouldConfirmAd( const NewTabPageAdInfo& ad, const AdEventList& ad_events) { - FrequencyCapping frequency_capping(ads_, ad_events); + FrequencyCapping frequency_capping(ad_events); if (!frequency_capping.IsAdAllowed()) { return false; @@ -74,8 +65,7 @@ void AdEventViewed::ConfirmAd( BLOG(3, "Viewed new tab page ad with uuid " << ad.uuid << " and creative instance id " << ad.creative_instance_id); - AdEvents ad_events(ads_); - ad_events.Log(ad, kConfirmationType, []( + LogAdEvent(ad, ConfirmationType::kViewed, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log new tab page ad viewed event"); @@ -85,8 +75,7 @@ void AdEventViewed::ConfirmAd( BLOG(6, "Successfully logged new tab page ad viewed event"); }); - ads_->get_confirmations()->ConfirmAd(ad.creative_instance_id, - kConfirmationType); + history::AddNewTabPageAd(ad, ConfirmationType::kViewed); } } // namespace new_tab_page_ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h index 48ff5381e110..a8d69b271509 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_events/new_tab_page_ads/new_tab_page_ad_event_viewed.h @@ -11,19 +11,17 @@ namespace ads { -class AdsImpl; struct NewTabPageAdInfo; namespace new_tab_page_ads { class AdEventViewed : public AdEvent { public: - AdEventViewed( - AdsImpl* ads); + AdEventViewed(); ~AdEventViewed() override; - void Trigger( + void FireEvent( const NewTabPageAdInfo& ad) override; private: @@ -33,8 +31,6 @@ class AdEventViewed : public AdEvent { void ConfirmAd( const NewTabPageAdInfo& ad); - - AdsImpl* ads_; // NOT OWNED }; } // namespace new_tab_page_ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing_unittest.cc index ebffc77f077e..1262f623284e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing_unittest.cc @@ -3,31 +3,21 @@ * 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 - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" #include "bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ad_targeting/ad_targeting.h" +#include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h" +#include "bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/pref_names.h" + +// npm run test -- brave_unit_tests --filter=BatAds* using ::testing::_; using ::testing::AllOf; using ::testing::Between; using ::testing::Field; -using ::testing::InvokeArgument; using ::testing::Matcher; -using ::testing::NiceMock; -using ::testing::Return; - -// npm run test -- brave_unit_tests --filter=BatAds* namespace ads { namespace ad_notifications { @@ -37,125 +27,85 @@ namespace { Matcher IsNotification( const std::string& creative_instance_id) { return AllOf(Field("creative_instance_id", - &AdNotificationInfo::creative_instance_id, - creative_instance_id)); + &AdNotificationInfo::creative_instance_id, creative_instance_id)); } } // namespace -class BatAdsAdNotificationPacingTest : public ::testing::Test { +class BatAdsAdNotificationPacingTest : public UnitTestBase { protected: BatAdsAdNotificationPacingTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_( - std::make_unique>()), - platform_helper_mock_( - std::make_unique>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); + : page_classifier_(std::make_unique< + ad_targeting::contextual::PageClassifier>()), + purchase_intent_classifier_(std::make_unique< + ad_targeting::behavioral::PurchaseIntentClassifier>()), + ad_targeting_(std::make_unique( + page_classifier_.get(), purchase_intent_classifier_.get())), + subdivision_targeting_(std::make_unique< + ad_targeting::geographic::SubdivisionTargeting>()), + ad_serving_(std::make_unique( + ad_targeting_.get(), subdivision_targeting_.get())) { } - ~BatAdsAdNotificationPacingTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods + ~BatAdsAdNotificationPacingTest() override = default; void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()).WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); + UnitTestBase::SetUp(); - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); SetupTestAds(); } - void SetupTestAds() { - CreativeAdNotificationInfo ad_creative; - - ad_creative.creative_instance_id = "3519f52c-46a4-4c48-9c2b-c264c0067f04"; - ad_creative.creative_set_id = "c2ba3e7d-f688-4bc4-a053-cbe7ac1e6123"; - ad_creative.campaign_id = "84197fc8-830a-4a8e-8339-7a70c2bfa104"; - ad_creative.start_at_timestamp = DistantPast(); - ad_creative.end_at_timestamp = DistantFuture(); - ad_creative.daily_cap = 1; - ad_creative.advertiser_id = "5484a63f-eb99-4ba5-a3b0-8c25d3c0e4b2"; - ad_creative.priority = 1; - ad_creative.per_day = 3; - ad_creative.total_max = 4; - ad_creative.category = "Technology & Computing-Software"; - ad_creative.geo_targets = {"US"}; - ad_creative.target_url = "https://brave.com"; - ad_creative.title = "Test Ad 1 Title"; - ad_creative.body = "Test Ad 1 Body"; - ad_creative.ptr = 1.0; - - test_creative_notifications_.push_back(ad_creative); - - ad_creative.creative_instance_id = "a1ac44c2-675f-43e6-ab6d-500614cafe63"; - ad_creative.creative_set_id = "5800049f-cee5-4bcb-90c7-85246d5f5e7c"; - ad_creative.campaign_id = "3d62eca2-324a-4161-a0c5-7d9f29d10ab0"; - ad_creative.start_at_timestamp = DistantPast(); - ad_creative.end_at_timestamp = DistantFuture(); - ad_creative.daily_cap = 1; - ad_creative.advertiser_id = "9a11b60f-e29d-4446-8d1f-318311e36e0a"; - ad_creative.priority = 2; - ad_creative.per_day = 3; - ad_creative.total_max = 4; - ad_creative.category = "Food & Drink"; - ad_creative.geo_targets = {"US"}; - ad_creative.target_url = "https://brave.com"; - ad_creative.title = "Test Ad 2 Title"; - ad_creative.body = "Test Ad 2 Body"; - ad_creative.ptr = 1.0; - - test_creative_notifications_.push_back(ad_creative); - } - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) + UnitTestBase::TearDown(); } - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + void SetupTestAds() { + CreativeAdNotificationInfo ad_creative_1; + ad_creative_1.creative_instance_id = "3519f52c-46a4-4c48-9c2b-c264c0067f04"; + ad_creative_1.creative_set_id = "c2ba3e7d-f688-4bc4-a053-cbe7ac1e6123"; + ad_creative_1.campaign_id = "84197fc8-830a-4a8e-8339-7a70c2bfa104"; + ad_creative_1.start_at_timestamp = DistantPast(); + ad_creative_1.end_at_timestamp = DistantFuture(); + ad_creative_1.daily_cap = 1; + ad_creative_1.advertiser_id = "5484a63f-eb99-4ba5-a3b0-8c25d3c0e4b2"; + ad_creative_1.priority = 1; + ad_creative_1.per_day = 3; + ad_creative_1.total_max = 4; + ad_creative_1.category = "Technology & Computing-Software"; + ad_creative_1.geo_targets = {"US"}; + ad_creative_1.target_url = "https://brave.com"; + ad_creative_1.title = "Test Ad 1 Title"; + ad_creative_1.body = "Test Ad 1 Body"; + ad_creative_1.ptr = 1.0; + test_creative_notifications_.push_back(ad_creative_1); + + CreativeAdNotificationInfo ad_creative_2; + ad_creative_2.creative_instance_id = "a1ac44c2-675f-43e6-ab6d-500614cafe63"; + ad_creative_2.creative_set_id = "5800049f-cee5-4bcb-90c7-85246d5f5e7c"; + ad_creative_2.campaign_id = "3d62eca2-324a-4161-a0c5-7d9f29d10ab0"; + ad_creative_2.start_at_timestamp = DistantPast(); + ad_creative_2.end_at_timestamp = DistantFuture(); + ad_creative_2.daily_cap = 1; + ad_creative_2.advertiser_id = "9a11b60f-e29d-4446-8d1f-318311e36e0a"; + ad_creative_2.priority = 2; + ad_creative_2.per_day = 3; + ad_creative_2.total_max = 4; + ad_creative_2.category = "Food & Drink"; + ad_creative_2.geo_targets = {"US"}; + ad_creative_2.target_url = "https://brave.com"; + ad_creative_2.title = "Test Ad 2 Title"; + ad_creative_2.body = "Test Ad 2 Body"; + ad_creative_2.ptr = 1.0; + test_creative_notifications_.push_back(ad_creative_2); + } - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + std::unique_ptr page_classifier_; + std::unique_ptr + purchase_intent_classifier_; + std::unique_ptr ad_targeting_; + std::unique_ptr + subdivision_targeting_; + std::unique_ptr ad_serving_; std::vector test_creative_notifications_; }; @@ -169,9 +119,8 @@ TEST_F(BatAdsAdNotificationPacingTest, int iterations = 1000; EXPECT_CALL(*ads_client_mock_, ShowNotification(_)).Times(0); - AdServing ad_serving(ads_.get()); for (int i = 0; i < iterations; i++) { - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); @@ -187,9 +136,8 @@ TEST_F(BatAdsAdNotificationPacingTest, int iterations = 1000; EXPECT_CALL(*ads_client_mock_, ShowNotification(_)).Times(iterations); - AdServing ad_serving(ads_.get()); for (int i = 0; i < iterations; i++) { - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); @@ -207,9 +155,8 @@ TEST_F(BatAdsAdNotificationPacingTest, .Times(Between(iterations * test_creative_notifications_[0].ptr * 0.8, iterations * test_creative_notifications_[0].ptr * 1.2)); - AdServing ad_serving(ads_.get()); for (int i = 0; i < iterations; i++) { - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); @@ -227,8 +174,7 @@ TEST_F(BatAdsAdNotificationPacingTest, test_creative_notifications_[0].creative_instance_id))) .Times(1); - AdServing ad_serving(ads_.get()); - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); @@ -246,8 +192,7 @@ TEST_F(BatAdsAdNotificationPacingTest, test_creative_notifications_[1].creative_instance_id))) .Times(1); - AdServing ad_serving(ads_.get()); - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); @@ -279,9 +224,8 @@ TEST_F(BatAdsAdNotificationPacingTest, iterations * test_creative_notifications_[0].ptr * 1.2 * test_creative_notifications_[1].ptr)); - AdServing ad_serving(ads_.get()); for (int i = 0; i < iterations; i++) { - ad_serving.MaybeServeAd(creative_ad_notifications, []( + ad_serving_->MaybeServeAd(creative_ad_notifications, []( const Result result, const AdNotificationInfo& ad) { }); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.cc index bd4a8cc1af34..ee63a64bec0d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.cc @@ -6,39 +6,46 @@ #include "bat/ads/internal/ad_server/ad_server.h" #include +#include #include -#include "bat/ads/internal/account/wallet.h" +#include "base/time/time.h" +#include "bat/ads/ads.h" #include "bat/ads/internal/ad_server/get_catalog_url_request_builder.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/bundle/bundle.h" #include "bat/ads/internal/catalog/catalog.h" +#include "bat/ads/internal/catalog/catalog_issuers_info.h" #include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/server/ads_server_util.h" -#include "bat/ads/internal/time_util.h" -#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h" +#include "bat/ads/internal/time_formatting_util.h" +#include "bat/ads/pref_names.h" namespace ads { -using std::placeholders::_1; - namespace { -const uint64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; +const int64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; -const uint64_t kDebugCatalogPing = 15 * base::Time::kSecondsPerMinute; +const int64_t kDebugCatalogPing = 15 * base::Time::kSecondsPerMinute; } // namespace -AdServer::AdServer( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdServer::AdServer() = default; AdServer::~AdServer() = default; +void AdServer::AddObserver( + AdServerObserver* observer) { + observers_.AddObserver(observer); +} + +void AdServer::RemoveObserver( + AdServerObserver* observer) { + observers_.RemoveObserver(observer); +} + void AdServer::MaybeFetch() { if (is_processing_ || retry_timer_.IsRunning()) { return; @@ -47,10 +54,6 @@ void AdServer::MaybeFetch() { Fetch(); } -uint64_t AdServer::LastUpdated() const { - return last_updated_; -} - /////////////////////////////////////////////////////////////////////////////// void AdServer::Fetch() { @@ -66,8 +69,8 @@ void AdServer::Fetch() { BLOG(5, UrlRequestToString(url_request)); BLOG(7, UrlRequestHeadersToString(url_request)); - auto callback = std::bind(&AdServer::OnFetch, this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + auto callback = std::bind(&AdServer::OnFetch, this, std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void AdServer::OnFetch( @@ -77,90 +80,64 @@ void AdServer::OnFetch( is_processing_ = false; - bool should_retry = false; - if (url_response.status_code / 100 == 2) { - if (!url_response.body.empty()) { - BLOG(1, "Successfully fetched catalog"); - } + BLOG(1, "Successfully fetched catalog"); + + BLOG(1, "Parsing catalog"); - if (!Parse(url_response.body)) { - should_retry = true; + Catalog catalog; + if (catalog.FromJson(url_response.body)) { + SaveCatalog(catalog); + + const CatalogIssuersInfo catalog_issuers = catalog.GetIssuers(); + NotifyCatalogUpdated(catalog_issuers); + + FetchAfterDelay(); + + return; } } else if (url_response.status_code == 304) { BLOG(1, "Catalog is up to date"); - } else { - BLOG(1, "Failed to fetch catalog"); - - should_retry = true; - } - const WalletInfo wallet = ads_->get_wallet()->Get(); - ads_->get_refill_unblinded_tokens()->MaybeRefill(wallet); + FetchAfterDelay(); - ads_->get_confirmations()->RetryFailedConfirmationsAfterDelay(); - - if (should_retry) { - Retry(); return; } - retry_timer_.Stop(); + BLOG(1, "Failed to parse catalog"); - FetchAfterDelay(); + NotifyCatalogFailed(); + Retry(); } -bool AdServer::Parse( - const std::string& json) { - BLOG(1, "Parsing catalog"); - - Catalog catalog(ads_); - if (!catalog.FromJson(json)) { - BLOG(0, "Failed to load catalog"); +void AdServer::SaveCatalog( + const Catalog& catalog) { + const std::string last_catalog_id = + AdsClientHelper::Get()->GetStringPref(prefs::kCatalogId); - BLOG(3, "Failed to parse catalog: " << json); - - return false; - } + const std::string catalog_id = catalog.GetId(); - if (!catalog.HasChanged(ads_->get_bundle()->GetCatalogId())) { - BLOG(1, "Catalog id " << catalog.GetId() << " matches current catalog id " - << ads_->get_bundle()->GetCatalogId()); - - return true; - } - - BLOG(1, "Generating bundle"); - - if (!ads_->get_bundle()->UpdateFromCatalog(catalog)) { - BLOG(0, "Failed to generate bundle"); - - return false; + if (!catalog.HasChanged(last_catalog_id)) { + BLOG(1, "Catalog id " << catalog_id << " is up to date"); + return; } - BLOG(1, "Successfully generated bundle"); - - auto callback = std::bind(&AdServer::OnSaved, this, _1); - catalog.Save(json, callback); - - CatalogIssuersInfo catalog_issuers = catalog.GetIssuers(); - ads_->get_confirmations()->SetCatalogIssuers(catalog_issuers); - - return true; -} + AdsClientHelper::Get()->SetStringPref(prefs::kCatalogId, catalog_id); -void AdServer::OnSaved( - const Result result) { - if (result != SUCCESS) { - // If the catalog fails to save, we will retry the next time we fetch the - // catalog + const int catalog_version = catalog.GetVersion(); + AdsClientHelper::Get()->SetIntegerPref( + prefs::kCatalogVersion, catalog_version); - BLOG(0, "Failed to save catalog"); + const int64_t catalog_ping = catalog.GetPing(); + AdsClientHelper::Get()->SetInt64Pref(prefs::kCatalogPing, catalog_ping); - return; - } + const int64_t catalog_last_updated = + static_cast(base::Time::Now().ToDoubleT()); + AdsClientHelper::Get()->SetInt64Pref(prefs::kCatalogLastUpdated, + catalog_last_updated); - BLOG(3, "Successfully saved catalog"); + Bundle bundle; + bundle.BuildFromCatalog(catalog); } void AdServer::Retry() { @@ -178,8 +155,10 @@ void AdServer::OnRetry() { } void AdServer::FetchAfterDelay() { - const uint64_t ping = _is_debug ? kDebugCatalogPing : - ads_->get_bundle()->GetCatalogPing(); + retry_timer_.Stop(); + + const int64_t ping = _is_debug ? kDebugCatalogPing : + AdsClientHelper::Get()->GetIntegerPref(prefs::kCatalogPing); const base::TimeDelta delay = base::TimeDelta::FromSeconds(ping); @@ -189,4 +168,17 @@ void AdServer::FetchAfterDelay() { BLOG(1, "Fetch catalog " << FriendlyDateAndTime(time)); } +void AdServer::NotifyCatalogUpdated( + const CatalogIssuersInfo& catalog_issuers) { + for (AdServerObserver& observer : observers_) { + observer.OnCatalogUpdated(catalog_issuers); + } +} + +void AdServer::NotifyCatalogFailed() { + for (AdServerObserver& observer : observers_) { + observer.OnCatalogFailed(); + } +} + } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.h index 0f4fefcd5280..74e2ba0084f9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server.h @@ -6,42 +6,42 @@ #ifndef BAT_ADS_INTERNAL_AD_SERVER_AD_SERVER_H_ #define BAT_ADS_INTERNAL_AD_SERVER_AD_SERVER_H_ -#include - -#include - +#include "bat/ads/internal/ad_server/ad_server_observer.h" #include "bat/ads/internal/backoff_timer.h" #include "bat/ads/internal/timer.h" #include "bat/ads/mojom.h" -#include "bat/ads/result.h" namespace ads { -class AdsImpl; +class Catalog; +struct CatalogIssuersInfo; class AdServer { public: - AdServer( - AdsImpl* ads); + AdServer(); ~AdServer(); - void MaybeFetch(); + void AddObserver( + AdServerObserver* observer); + void RemoveObserver( + AdServerObserver* observer); - uint64_t LastUpdated() const; + void MaybeFetch(); private: + base::ObserverList observers_; + + bool is_processing_ = false; + + Timer timer_; + void Fetch(); void OnFetch( const UrlResponse& url_response); - bool Parse( - const std::string& json); - - void OnSaved( - const Result result); - - Timer timer_; + void SaveCatalog( + const Catalog& catalog); BackoffTimer retry_timer_; void Retry(); @@ -49,11 +49,9 @@ class AdServer { void FetchAfterDelay(); - bool is_processing_ = false; - - uint64_t last_updated_ = 0; - - AdsImpl* ads_; // NOT OWNED + void NotifyCatalogUpdated( + const CatalogIssuersInfo& catalog_issuers); + void NotifyCatalogFailed(); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server_observer.h new file mode 100644 index 000000000000..2ed273113934 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_server/ad_server_observer.h @@ -0,0 +1,30 @@ +/* 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 BAT_ADS_INTERNAL_AD_SERVER_AD_SERVER_OBSERVER_H_ +#define BAT_ADS_INTERNAL_AD_SERVER_AD_SERVER_OBSERVER_H_ + +#include "base/observer_list.h" + +namespace ads { + +struct CatalogIssuersInfo; + +class AdServerObserver : public base::CheckedObserver { + public: + // Invoked when the catalog has been updated + virtual void OnCatalogUpdated( + const CatalogIssuersInfo& catalog_issuers) {} + + // Invoked when fetching the catalog fails + virtual void OnCatalogFailed() {} + + protected: + ~AdServerObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_AD_SERVER_AD_SERVER_OBSERVER_H_ 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 69873fa1f1ac..5119331888ed 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 @@ -16,6 +16,8 @@ #include "bat/ads/internal/ad_delivery/ad_notifications/ad_notification_delivery.h" #include "bat/ads/internal/ad_pacing/ad_notifications/ad_notification_pacing.h" #include "bat/ads/internal/ad_targeting/ad_targeting_util.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" @@ -26,15 +28,19 @@ #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/time_formatting_util.h" #include "bat/ads/pref_names.h" namespace ads { namespace ad_notifications { AdServing::AdServing( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); + AdTargeting* ad_targeting, + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting) + : ad_targeting_(ad_targeting), + subdivision_targeting_(subdivision_targeting) { + DCHECK(ad_targeting_); + DCHECK(subdivision_targeting_); } AdServing::~AdServing() = default; @@ -46,17 +52,17 @@ void AdServing::ServeAtRegularIntervals() { base::TimeDelta delay; - if (ads_->get_client()->GetNextAdServingInterval().is_null()) { + if (Client::Get()->GetNextAdServingInterval().is_null()) { delay = base::TimeDelta::FromMinutes(2); const base::Time next_interval = base::Time::Now() + delay; - ads_->get_client()->SetNextAdServingInterval(next_interval); + Client::Get()->SetNextAdServingInterval(next_interval); } else { if (NextIntervalHasElapsed()) { delay = base::TimeDelta::FromMinutes(1); } else { const base::Time next_interval = - ads_->get_client()->GetNextAdServingInterval(); + Client::Get()->GetNextAdServingInterval(); delay = next_interval - base::Time::Now(); } @@ -72,9 +78,7 @@ void AdServing::StopServing() { } void AdServing::MaybeServe() { - const CategoryList categories = - ads_->get_ad_targeting()->GetWinningCategories(); - + const CategoryList categories = ad_targeting_->GetCategories(); MaybeServeAdForCategories(categories, [&]( const Result result, const AdNotificationInfo& ad) { @@ -104,7 +108,7 @@ bool AdServing::NextIntervalHasElapsed() { const base::Time now = base::Time::Now(); const base::Time next_interval = - ads_->get_client()->GetNextAdServingInterval(); + Client::Get()->GetNextAdServingInterval(); if (now < next_interval) { return false; @@ -122,7 +126,7 @@ base::Time AdServing::MaybeServeAfter( void AdServing::MaybeServeAdForCategories( const CategoryList& categories, MaybeServeAdForCategoriesCallback callback) { - database::table::AdEvents database_table(ads_); + database::table::AdEvents database_table; database_table.GetAll([=]( const Result result, const AdEventList& ad_events) { @@ -132,7 +136,7 @@ void AdServing::MaybeServeAdForCategories( return; } - FrequencyCapping frequency_capping(ads_, ad_events); + FrequencyCapping frequency_capping(subdivision_targeting_, ad_events); if (!frequency_capping.IsAdAllowed()) { BLOG(1, "Ad notification not served: Not allowed"); @@ -161,12 +165,12 @@ void AdServing::MaybeServeAdForParentChildCategories( BLOG(1, " " << category); } - database::table::CreativeAdNotifications database_table(ads_); + database::table::CreativeAdNotifications database_table; database_table.GetForCategories(categories, [=]( const Result result, const CategoryList& categories, const CreativeAdNotificationList& ads) { - EligibleAds eligible_ad_notifications(ads_); + EligibleAds eligible_ad_notifications(subdivision_targeting_); const CreativeAdNotificationList eligible_ads = eligible_ad_notifications.Get(ads, @@ -194,12 +198,12 @@ void AdServing::MaybeServeAdForParentCategories( BLOG(1, " " << parent_category); } - database::table::CreativeAdNotifications database_table(ads_); + database::table::CreativeAdNotifications database_table; database_table.GetForCategories(parent_categories, [=]( const Result result, const CategoryList& categories, const CreativeAdNotificationList& ads) { - EligibleAds eligible_ad_notifications(ads_); + EligibleAds eligible_ad_notifications(subdivision_targeting_); const CreativeAdNotificationList eligible_ads = eligible_ad_notifications.Get(ads, @@ -224,12 +228,12 @@ void AdServing::MaybeServeAdForUntargeted( ad_targeting::contextual::kUntargeted }; - database::table::CreativeAdNotifications database_table(ads_); + database::table::CreativeAdNotifications database_table; database_table.GetForCategories(categories, [=]( const Result result, const CategoryList& categories, const CreativeAdNotificationList& ads) { - EligibleAds eligible_ad_notifications(ads_); + EligibleAds eligible_ad_notifications(subdivision_targeting_); const CreativeAdNotificationList eligible_ads = eligible_ad_notifications.Get(ads, @@ -289,7 +293,7 @@ void AdServing::MaybeDeliverAd( ad_notification.body = ad.body; ad_notification.target_url = ad.target_url; - AdDelivery ad_delivery(ads_); + AdDelivery ad_delivery; if (!ad_delivery.MaybeDeliverAd(ad_notification)) { BLOG(1, "Ad notification not delivered"); callback(Result::FAILED, ad_notification); @@ -298,7 +302,7 @@ void AdServing::MaybeDeliverAd( last_delivered_creative_ad_ = ad; - ads_->get_client()->UpdateSeenAdvertiser(ad.advertiser_id); + Client::Get()->UpdateSeenAdvertiser(ad.advertiser_id); callback(Result::SUCCESS, ad_notification); } @@ -311,7 +315,7 @@ void AdServing::FailedToDeliverAd() { const base::TimeDelta delay = base::TimeDelta::FromMinutes(2); const base::Time next_interval = base::Time::Now() + delay; - ads_->get_client()->SetNextAdServingInterval(next_interval); + Client::Get()->SetNextAdServingInterval(next_interval); MaybeServeAfter(delay); } @@ -322,13 +326,13 @@ void AdServing::DeliveredAd() { } const int64_t seconds = base::Time::kSecondsPerHour / - ads_->get_ads_client()->GetUint64Pref(prefs::kAdsPerHour); + AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); const base::TimeDelta delay = base::TimeDelta::FromSeconds(seconds); const base::Time next_interval = base::Time::Now() + delay; - ads_->get_client()->SetNextAdServingInterval(next_interval); + Client::Get()->SetNextAdServingInterval(next_interval); MaybeServeAfter(delay); } @@ -336,10 +340,9 @@ void AdServing::DeliveredAd() { void AdServing::RecordAdOpportunityForCategories( const CategoryList& categories) { const std::vector question_list = - CreateAdOpportunityQuestionList(categories); + p2a::CreateAdOpportunityQuestionList(categories); - P2A p2a(ads_); - p2a.RecordEvent("ad_opportunity", question_list); + p2a::RecordEvent("ad_opportunity", question_list); } } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h index 69724bc902f1..a0ce9e20ad28 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h @@ -7,6 +7,7 @@ #define BAT_ADS_INTERNAL_AD_SERVING_AD_NOTIFICATION_SERVING_H_ #include "base/gtest_prod_util.h" +#include "base/time/time.h" #include "bat/ads/internal/ad_events/ad_event_info.h" #include "bat/ads/internal/ad_targeting/ad_targeting.h" #include "bat/ads/internal/bundle/creative_ad_notification_info.h" @@ -15,9 +16,14 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; +namespace ad_targeting { +namespace geographic { +class SubdivisionTargeting; +} // namespace geographic +} // namespace ad_targeting + namespace ad_notifications { using MaybeServeAdForCategoriesCallback = @@ -26,7 +32,8 @@ using MaybeServeAdForCategoriesCallback = class AdServing { public: AdServing( - AdsImpl* ads); + AdTargeting* ad_targeting, + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting); ~AdServing(); @@ -97,7 +104,10 @@ class AdServing { CreativeAdInfo last_delivered_creative_ad_; - AdsImpl* ads_; // NOT OWNED + AdTargeting* ad_targeting_; // NOT OWNED + + ad_targeting::geographic::SubdivisionTargeting* + subdivision_targeting_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.cc index b247deb2bdd4..a3476f2b59cb 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.cc @@ -5,10 +5,9 @@ #include "bat/ads/internal/ad_targeting/ad_targeting.h" -#include "bat/ads/internal/client/client.h" #include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h" #include "bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/client/client.h" #include "bat/ads/internal/logging.h" namespace ads { @@ -18,41 +17,43 @@ const uint16_t kMaximumPurchaseIntentSegments = 3; } // namespace AdTargeting::AdTargeting( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); + ad_targeting::contextual::PageClassifier* page_classifier, + ad_targeting::behavioral::PurchaseIntentClassifier* + purchase_intent_classifier) + : page_classifier_(page_classifier), + purchase_intent_classifier_(purchase_intent_classifier) { + DCHECK(page_classifier_); + DCHECK(purchase_intent_classifier_); } AdTargeting::~AdTargeting() = default; -CategoryList AdTargeting::GetWinningCategories() const { - const CategoryList page_classification_winning_categories = - GetPageClassificationWinningCategories(); +CategoryList AdTargeting::GetCategories() const { + const CategoryList page_classification_categories = + GetPageClassificationCategories(); - const CategoryList purchase_intent_winning_categories = - GetPurchaseIntentWinningCategories(); + const CategoryList purchase_intent_categories = GetPurchaseIntentCategories(); - CategoryList winning_categories = page_classification_winning_categories; + CategoryList categories = page_classification_categories; - winning_categories.insert(winning_categories.end(), - purchase_intent_winning_categories.begin(), - purchase_intent_winning_categories.end()); + categories.insert(categories.end(), purchase_intent_categories.begin(), + purchase_intent_categories.end()); - return winning_categories; + return categories; } /////////////////////////////////////////////////////////////////////////////// -CategoryList AdTargeting::GetPageClassificationWinningCategories() const { - return ads_->get_page_classifier()->GetWinningCategories(); +CategoryList AdTargeting::GetPageClassificationCategories() const { + return page_classifier_->GetWinningCategories(); } -CategoryList AdTargeting::GetPurchaseIntentWinningCategories() const { +CategoryList AdTargeting::GetPurchaseIntentCategories() const { const PurchaseIntentSignalSegmentHistoryMap purchase_intent_signal_history = - ads_->get_client()->GetPurchaseIntentSignalHistory(); + Client::Get()->GetPurchaseIntentSignalHistory(); const CategoryList categories = - ads_->get_purchase_intent_classifier()->GetWinningCategories( + purchase_intent_classifier_->GetWinningCategories( purchase_intent_signal_history, kMaximumPurchaseIntentSegments); return categories; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.h index d1134044cc93..86f276e9a626 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/ad_targeting.h @@ -11,25 +11,39 @@ namespace ads { -class AdsImpl; +namespace ad_targeting { + +namespace contextual { +class PageClassifier; +} // namespace contextual + +namespace behavioral { +class PurchaseIntentClassifier; +} // namespace behavioral + +} // namespace ad_targeting using CategoryList = std::vector; class AdTargeting { public: AdTargeting( - AdsImpl* ads); + ad_targeting::contextual::PageClassifier* page_classifier, + ad_targeting::behavioral::PurchaseIntentClassifier* + purchase_intent_classifier); ~AdTargeting(); - CategoryList GetWinningCategories() const; + CategoryList GetCategories() const; private: - CategoryList GetPageClassificationWinningCategories() const; + CategoryList GetPageClassificationCategories() const; - CategoryList GetPurchaseIntentWinningCategories() const; + CategoryList GetPurchaseIntentCategories() const; - AdsImpl* ads_; // NOT OWNED + ad_targeting::contextual::PageClassifier* page_classifier_; // NOT OWNED + ad_targeting::behavioral::PurchaseIntentClassifier* + purchase_intent_classifier_; // NOT OWNED }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.cc index 3ae4a12d5fab..7c2610544a89 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.cc @@ -11,35 +11,31 @@ #include #include "base/json/json_reader.h" +#include "base/time/time.h" #include "brave/components/l10n/common/locale_util.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "url/gurl.h" #include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_user_models.h" #include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_util.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/tabs/tab_info.h" -#include "bat/ads/internal/tabs/tabs.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/url_util.h" namespace ads { namespace ad_targeting { namespace behavioral { +namespace { + const uint16_t kExpectedPurchaseIntentModelVersion = 1; const uint16_t kPurchaseIntentDefaultSignalWeight = 1; const uint16_t kPurchaseIntentWordCountLimit = 1000; -using std::placeholders::_1; -using std::placeholders::_2; +} // namespace -PurchaseIntentClassifier::PurchaseIntentClassifier( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +PurchaseIntentClassifier::PurchaseIntentClassifier() = default; PurchaseIntentClassifier::~PurchaseIntentClassifier() = default; @@ -47,21 +43,6 @@ bool PurchaseIntentClassifier::IsInitialized() { return is_initialized_; } -bool PurchaseIntentClassifier::Initialize( - const std::string& json) { - is_initialized_ = FromJson(json); - - if (is_initialized_) { - BLOG(1, "Parsed purchase intent user model version " << version_ - << " with a signal level of " << signal_level_ << ", classification " - "threshold of " << classification_threshold_ << " and a signal " - "decay time window of " << signal_decay_time_window_in_seconds_ - << " seconds"); - } - - return is_initialized_; -} - void PurchaseIntentClassifier::LoadUserModelForLocale( const std::string& locale) { const std::string country_code = brave_l10n::GetCountryCode(locale); @@ -79,22 +60,22 @@ void PurchaseIntentClassifier::LoadUserModelForLocale( void PurchaseIntentClassifier::LoadUserModelForId( const std::string& id) { auto callback = std::bind(&PurchaseIntentClassifier::OnLoadUserModelForId, - this, id, _1, _2); + this, id, std::placeholders::_1, std::placeholders::_2); - ads_->get_ads_client()->LoadUserModelForId(id, callback); + AdsClientHelper::Get()->LoadUserModelForId(id, callback); } PurchaseIntentSignalInfo PurchaseIntentClassifier::MaybeExtractIntentSignal( - const std::string& url) { + const std::string& url, + const std::string& last_url) { PurchaseIntentSignalInfo purchase_intent_signal; - if (!UrlHasScheme(url)) { + if (!DoesUrlHaveSchemeHTTPOrHTTPS(url)) { BLOG(1, "Visited URL is not supported for extracting purchase intent"); return purchase_intent_signal; } - const TabInfo last_visible_tab = ads_->get_tabs()->GetLastVisible(); - if (SameSite(url, last_visible_tab.url)) { + if (SameDomainOrHost(url, last_url)) { return purchase_intent_signal; } @@ -327,6 +308,12 @@ bool PurchaseIntentClassifier::FromJson( } } + BLOG(1, "Parsed purchase intent user model version " << version_ + << " with a signal level of " << signal_level_ << ", classification " + "threshold of " << classification_threshold_ << " and a signal " + "decay time window of " << signal_decay_time_window_in_seconds_ + << " seconds"); + return true; } @@ -342,12 +329,14 @@ void PurchaseIntentClassifier::OnLoadUserModelForId( BLOG(1, "Successfully loaded " << id << " purchase intent user model"); - if (!Initialize(json)) { + if (!FromJson(json)) { BLOG(1, "Failed to initialize " << id << " purchase intent user model"); is_initialized_ = false; return; } + is_initialized_ = true; + BLOG(1, "Successfully initialized " << id << " purchase intent user model"); } @@ -390,7 +379,7 @@ void PurchaseIntentClassifier::AppendIntentSignalToHistory( PurchaseIntentSignalHistoryInfo history; history.timestamp_in_seconds = purchase_intent_signal.timestamp_in_seconds; history.weight = purchase_intent_signal.weight; - ads_->get_client()->AppendToPurchaseIntentSignalHistoryForSegment( + Client::Get()->AppendToPurchaseIntentSignalHistoryForSegment( segment, history); } } @@ -450,10 +439,10 @@ PurchaseIntentSegmentList PurchaseIntentClassifier::GetSegments( for (const auto& keyword : segment_keywords_) { auto list_keyword_set = TransformIntoSetOfWords(keyword.keywords); - // Intended behaviour relies on early return from list traversal and - // implicitely on the ordering of |segment_keywords_| to ensure - // specific segments are matched over general segments, e.g. "audi a6" - // segments should be returned over "audi" segments if possible. + // Intended behavior relies on early return from list traversal and + // implicitely on the ordering of |segment_keywords_| to ensure specific + // segments are matched over general segments, e.g. "audi a6" segments + // should be returned over "audi" segments if possible if (IsSubset(search_query_keyword_set, list_keyword_set)) { segment_list = keyword.segments; return segment_list; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h index 5013dadf2bc2..cdacce95901d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h @@ -22,8 +22,6 @@ namespace ads { -class AdsImpl; - namespace ad_targeting { namespace behavioral { @@ -31,23 +29,20 @@ using PurchaseIntentSegmentList = std::vector; class PurchaseIntentClassifier { public: - explicit PurchaseIntentClassifier( - AdsImpl* ads); + PurchaseIntentClassifier(); ~PurchaseIntentClassifier(); bool IsInitialized(); - bool Initialize( - const std::string& json); - void LoadUserModelForLocale( const std::string& locale); void LoadUserModelForId( const std::string& id); PurchaseIntentSignalInfo MaybeExtractIntentSignal( - const std::string& url); + const std::string& url, + const std::string& last_url); CategoryList GetWinningCategories( const PurchaseIntentSignalSegmentHistoryMap& history, @@ -88,7 +83,7 @@ class PurchaseIntentClassifier { const std::vector& set_a, const std::vector& set_b); - bool is_initialized_; + bool is_initialized_ = false; uint16_t version_ = 0; uint16_t signal_level_ = 0; uint16_t classification_threshold_ = 0; @@ -96,8 +91,6 @@ class PurchaseIntentClassifier { std::vector sites_; std::vector segment_keywords_; std::vector funnel_keywords_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace behavioral diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_unittest.cc index e5b11737abba..7aef0e7cdaa7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier_unittest.cc @@ -5,16 +5,8 @@ #include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_classifier.h" -#include - -#include -#include -#include - -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* @@ -22,92 +14,33 @@ namespace ads { namespace ad_targeting { namespace behavioral { -class BatAdsPurchaseIntentClassifierTest : public ::testing::Test { +class BatAdsPurchaseIntentClassifierTest : public UnitTestBase { protected: - BatAdsPurchaseIntentClassifierTest() : - ads_client_mock_(std::make_unique()), - ads_(std::make_unique(ads_client_mock_.get())), - purchase_intent_classifier_(std::make_unique< - PurchaseIntentClassifier>(ads_.get())) { - // You can do set-up work for each test here - } - - ~BatAdsPurchaseIntentClassifierTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - const char json[] = R"( - { - "locale": "gb", - "version": 1, - "timestamp": "2020-05-15 00:00:00", - "parameters": { - "signal_level": 1, - "classification_threshold": 10, - "signal_decay_time_window_in_seconds": 100 - }, - "segments": [ - "segment 1", "segment 2", "segment 3" - ], - "segment_keywords": { - "segment keyword 1": [0], - "segment keyword 2": [0, 1] - }, - "funnel_keywords": { - "funnel keyword 1": 2, - "funnel keyword 2": 3 - }, - "funnel_sites": [ - { - "sites": [ - "https://brave.com", "https://crave.com" - ], - "segments": [1, 2] - }, - { - "sites": [ - "https://frexample.org", "https://example.org" - ], - "segments": [0] - } - ] - })"; - - purchase_intent_classifier_->Initialize(json); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr purchase_intent_classifier_; + BatAdsPurchaseIntentClassifierTest() = default; + + ~BatAdsPurchaseIntentClassifierTest() override = default; }; TEST_F(BatAdsPurchaseIntentClassifierTest, InitializeClassifier) { - EXPECT_TRUE(purchase_intent_classifier_->IsInitialized()); + PurchaseIntentClassifier purchase_intent_classifier; + purchase_intent_classifier.LoadUserModelForLocale("en-US"); + + EXPECT_TRUE(purchase_intent_classifier.IsInitialized()); } TEST_F(BatAdsPurchaseIntentClassifierTest, ExtractSignalAndMatchFunnelSite) { // Arrange + PurchaseIntentClassifier purchase_intent_classifier; + purchase_intent_classifier.LoadUserModelForLocale("en-US"); + const std::string url = "https://www.brave.com/test?foo=bar"; + const std::string last_url = "https://www.foobar.com"; // Act const PurchaseIntentSignalInfo info = - purchase_intent_classifier_->MaybeExtractIntentSignal(url); + purchase_intent_classifier.MaybeExtractIntentSignal(url, last_url); // Assert const PurchaseIntentSegmentList expected_segments({ @@ -122,11 +55,15 @@ TEST_F(BatAdsPurchaseIntentClassifierTest, TEST_F(BatAdsPurchaseIntentClassifierTest, ExtractSignalAndMatchSegmentKeyword) { // Arrange + PurchaseIntentClassifier purchase_intent_classifier; + purchase_intent_classifier.LoadUserModelForLocale("en-US"); + const std::string url = "https://duckduckgo.com/?q=segment+keyword+1&foo=bar"; + const std::string last_url = "https://www.foobar.com"; // Act const PurchaseIntentSignalInfo info = - purchase_intent_classifier_->MaybeExtractIntentSignal(url); + purchase_intent_classifier.MaybeExtractIntentSignal(url, last_url); // Assert const PurchaseIntentSegmentList expected_segments({ @@ -140,11 +77,15 @@ TEST_F(BatAdsPurchaseIntentClassifierTest, TEST_F(BatAdsPurchaseIntentClassifierTest, ExtractSignalAndMatchFunnelKeyword) { // Arrange + PurchaseIntentClassifier purchase_intent_classifier; + purchase_intent_classifier.LoadUserModelForLocale("en-US"); + const std::string url = "https://duckduckgo.com/?q=segment+funnel+keyword+2"; + const std::string last_url = "https://www.foobar.com"; // Act const PurchaseIntentSignalInfo info = - purchase_intent_classifier_->MaybeExtractIntentSignal(url); + purchase_intent_classifier.MaybeExtractIntentSignal(url, last_url); // Assert const PurchaseIntentSegmentList expected_segments({ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.cc index 7d8896ed1f9e..fab888e420c1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.cc @@ -12,7 +12,7 @@ #include "bat/ads/internal/ad_targeting/ad_targeting_util.h" #include "bat/ads/internal/ad_targeting/contextual/contextual_util.h" #include "bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_user_models.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/search_engine/search_providers.h" @@ -22,18 +22,11 @@ namespace ads { namespace ad_targeting { namespace contextual { -using std::placeholders::_1; -using std::placeholders::_2; - namespace { const int kTopWinningCategoryCount = 3; } // namespace -PageClassifier::PageClassifier( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +PageClassifier::PageClassifier() = default; PageClassifier::~PageClassifier() = default; @@ -53,15 +46,15 @@ void PageClassifier::LoadUserModelForLocale( void PageClassifier::LoadUserModelForId( const std::string& id) { - auto callback = - std::bind(&PageClassifier::OnLoadUserModelForId, this, id, _1, _2); - ads_->get_ads_client()->LoadUserModelForId(id, callback); + auto callback = std::bind(&PageClassifier::OnLoadUserModelForId, this, id, + std::placeholders::_1, std::placeholders::_2); + AdsClientHelper::Get()->LoadUserModelForId(id, callback); } std::string PageClassifier::MaybeClassifyPage( const std::string& url, const std::string& content) { - if (!UrlHasScheme(url)) { + if (!DoesUrlHaveSchemeHTTPOrHTTPS(url)) { BLOG(1, "Visited URL is not supported for page classification"); return ""; } @@ -107,7 +100,7 @@ CategoryList PageClassifier::GetWinningCategories() const { } const PageProbabilitiesList page_probabilities = - ads_->get_client()->GetPageProbabilitiesHistory(); + Client::Get()->GetPageProbabilitiesHistory(); if (page_probabilities.empty()) { return winning_categories; } @@ -183,7 +176,7 @@ std::string PageClassifier::ClassifyPage( GetPageClassification(page_probabilities); if (!page_classification.empty()) { - ads_->get_client()->AppendPageProbabilitiesToHistory(page_probabilities); + Client::Get()->AppendPageProbabilitiesToHistory(page_probabilities); CachePageProbabilities(url, page_probabilities); } @@ -243,7 +236,7 @@ bool PageClassifier::ShouldFilterCategory( SplitCategory(category); const FilteredCategoryList filtered_categories = - ads_->get_client()->get_filtered_categories(); + Client::Get()->get_filtered_categories(); for (const auto& filtered_category : filtered_categories) { const std::vector filtered_category_classifications = diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h index 9bbeaf62b7ce..c94fde0257b9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h @@ -19,8 +19,6 @@ namespace ads { -class AdsImpl; - namespace ad_targeting { namespace contextual { @@ -36,8 +34,7 @@ const char kUntargeted[] = "untargeted"; class PageClassifier { public: - PageClassifier( - AdsImpl* ads); + PageClassifier(); ~PageClassifier(); @@ -55,8 +52,6 @@ class PageClassifier { const PageProbabilitiesCacheMap& get_page_probabilities_cache() const; private: - AdsImpl* ads_; // NOT OWNED - PageProbabilitiesCacheMap page_probabilities_cache_; bool IsInitialized() const; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_unittest.cc index 37ebc1b563d6..e4d378207211 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier_unittest.cc @@ -5,129 +5,34 @@ #include "bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h" -#include -#include -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" #include "base/path_service.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/platform/platform_helper_mock.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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace ad_targeting { namespace contextual { -class BatAdsPageClassifierTest : public ::testing::Test { +class BatAdsPageClassifierTest : public UnitTestBase { protected: - BatAdsPageClassifierTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsPageClassifierTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - const std::string locale = "en-US"; - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return(locale)); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); + BatAdsPageClassifierTest() = default; - ads_->ChangeLocale("en-US"); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - PageClassifier* get_page_classifier() { - return ads_->get_page_classifier(); - } - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsPageClassifierTest() override = default; }; TEST_F(BatAdsPageClassifierTest, DoNotClassifyPageForUntargetedLocale) { // Arrange - const std::string locale = "ja-JP"; - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return(locale)); - - ads_->ChangeLocale(locale); + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("ja-JP"); const std::string content = "一部のコンテンツ"; // Act const std::string page_classification = - get_page_classifier()->MaybeClassifyPage("https://foobar.com", content); + page_classifier.MaybeClassifyPage("https://foobar.com", content); // Assert const std::string expected_page_classification = "untargeted"; @@ -138,11 +43,14 @@ TEST_F(BatAdsPageClassifierTest, TEST_F(BatAdsPageClassifierTest, ClassifyPageWithNoContent) { // Arrange + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("en-US"); + const std::string content = ""; // Act const std::string page_classification = - get_page_classifier()->MaybeClassifyPage("https://foobar.com", content); + page_classifier.MaybeClassifyPage("https://foobar.com", content); // Assert const std::string expected_page_classification = ""; @@ -153,11 +61,14 @@ TEST_F(BatAdsPageClassifierTest, TEST_F(BatAdsPageClassifierTest, ClassifyPageWithContent) { // Arrange + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("en-US"); + const std::string content = "Some content about technology & computing"; // Act const std::string page_classification = - get_page_classifier()->MaybeClassifyPage("https://foobar.com", content); + page_classifier.MaybeClassifyPage("https://foobar.com", content); // Assert const std::string expected_page_classification = @@ -169,6 +80,9 @@ TEST_F(BatAdsPageClassifierTest, TEST_F(BatAdsPageClassifierTest, GetWinningCategories) { // Arrange + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("en-US"); + const std::vector contents = { "Some content about cooking food", "Some content about finance & banking", @@ -176,12 +90,12 @@ TEST_F(BatAdsPageClassifierTest, }; for (const auto& content : contents) { - get_page_classifier()->MaybeClassifyPage("https://foobar.com", content); + page_classifier.MaybeClassifyPage("https://foobar.com", content); } // Act const CategoryList winning_categories = - get_page_classifier()->GetWinningCategories(); + page_classifier.GetWinningCategories(); // Assert const CategoryList expected_winning_categories = { @@ -196,10 +110,12 @@ TEST_F(BatAdsPageClassifierTest, TEST_F(BatAdsPageClassifierTest, GetWinningCategoriesIfNoPagesHaveBeenClassified) { // Arrange + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("en-US"); // Act const CategoryList winning_categories = - get_page_classifier()->GetWinningCategories(); + page_classifier.GetWinningCategories(); // Assert EXPECT_TRUE(winning_categories.empty()); @@ -208,13 +124,17 @@ TEST_F(BatAdsPageClassifierTest, TEST_F(BatAdsPageClassifierTest, CachePageProbability) { // Arrange + PageClassifier page_classifier; + page_classifier.LoadUserModelForLocale("en-US"); + const std::string content = "Technology & computing content"; + const std::string page_classification = - get_page_classifier()->MaybeClassifyPage("https://foobar.com", content); + page_classifier.MaybeClassifyPage("https://foobar.com", content); // Act - const PageProbabilitiesCacheMap page_probabilities_cache = - get_page_classifier()->get_page_probabilities_cache(); + const PageProbabilitiesCacheMap page_probabilities_cache + = page_classifier.get_page_probabilities_cache(); // Assert const int count = page_probabilities_cache.size(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.cc index ed7da0ec4969..818a16b2b632 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.cc @@ -12,39 +12,34 @@ #include "base/json/json_reader.h" #include "base/strings/stringprintf.h" +#include "base/time/time.h" #include "brave/components/l10n/browser/locale_helper.h" #include "brave/components/l10n/common/locale_util.h" +#include "bat/ads/ads.h" #include "bat/ads/ads_client.h" #include "bat/ads/internal/ad_targeting/geographic/subdivision/get_subdivision_url_request_builder.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/logging.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/locale/supported_subdivision_codes.h" +#include "bat/ads/internal/logging.h" #include "bat/ads/internal/server/ads_server_util.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/pref_names.h" namespace ads { namespace ad_targeting { namespace geographic { -using std::placeholders::_1; - namespace { -const uint64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; +const int64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; -const uint64_t kFetchSubdivisionTargetingPing = - 24 * base::Time::kSecondsPerHour; -const uint64_t kDebugFetchSubdivisionTargetingPing = +const int64_t kFetchSubdivisionTargetingPing = 24 * base::Time::kSecondsPerHour; +const int64_t kDebugFetchSubdivisionTargetingPing = 5 * base::Time::kSecondsPerMinute; } // namespace -SubdivisionTargeting::SubdivisionTargeting( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +SubdivisionTargeting::SubdivisionTargeting() = default; SubdivisionTargeting::~SubdivisionTargeting() = default; @@ -71,7 +66,7 @@ bool SubdivisionTargeting::ShouldAllowForLocale( bool SubdivisionTargeting::IsDisabled() const { const std::string subdivision_targeting_code = - ads_->get_ads_client()->GetStringPref( + AdsClientHelper::Get()->GetStringPref( prefs::kAdsSubdivisionTargetingCode); if (subdivision_targeting_code != "DISABLED") { @@ -91,7 +86,7 @@ void SubdivisionTargeting::MaybeFetchForLocale( BLOG(1, "Ads subdivision targeting is not supported for " << locale << " locale"); - ads_->get_ads_client()->SetBooleanPref( + AdsClientHelper::Get()->SetBooleanPref( prefs::kShouldAllowAdsSubdivisionTargeting, false); return; @@ -104,7 +99,7 @@ void SubdivisionTargeting::MaybeFetchForLocale( if (!ShouldAutoDetect()) { const std::string subdivision_targeting_code = - ads_->get_ads_client()->GetStringPref( + AdsClientHelper::Get()->GetStringPref( prefs::kAdsSubdivisionTargetingCode); BLOG(1, "Ads subdivision targeting is enabled for " @@ -127,11 +122,11 @@ void SubdivisionTargeting::MaybeFetchForCurrentLocale() { std::string SubdivisionTargeting::GetAdsSubdivisionTargetingCode() const { if (ShouldAutoDetect()) { - return ads_->get_ads_client()->GetStringPref( + return AdsClientHelper::Get()->GetStringPref( prefs::kAutoDetectedAdsSubdivisionTargetingCode); } - return ads_->get_ads_client()->GetStringPref( + return AdsClientHelper::Get()->GetStringPref( prefs::kAdsSubdivisionTargetingCode); } @@ -153,13 +148,13 @@ void SubdivisionTargeting::MaybeAllowForLocale( const std::string& locale) { const bool should_allow = ShouldAllowForLocale(locale); - ads_->get_ads_client()->SetBooleanPref( + AdsClientHelper::Get()->SetBooleanPref( prefs::kShouldAllowAdsSubdivisionTargeting, should_allow); } bool SubdivisionTargeting::ShouldAutoDetect() const { const std::string subdivision_targeting_code = - ads_->get_ads_client()->GetStringPref( + AdsClientHelper::Get()->GetStringPref( prefs::kAdsSubdivisionTargetingCode); if (subdivision_targeting_code != "AUTO") { @@ -178,8 +173,9 @@ void SubdivisionTargeting::Fetch() { BLOG(5, UrlRequestToString(url_request)); BLOG(7, UrlRequestHeadersToString(url_request)); - const auto callback = std::bind(&SubdivisionTargeting::OnFetch, this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + const auto callback = std::bind(&SubdivisionTargeting::OnFetch, this, + std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void SubdivisionTargeting::OnFetch( @@ -245,7 +241,7 @@ bool SubdivisionTargeting::ParseJson( const std::string subdivision_code = base::StringPrintf("%s-%s", country->c_str(), region->c_str()); - ads_->get_ads_client()->SetStringPref( + AdsClientHelper::Get()->SetStringPref( prefs::kAutoDetectedAdsSubdivisionTargetingCode, subdivision_code); return true; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h index e7ce90caf3c8..50688367ccdc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h @@ -21,8 +21,7 @@ namespace geographic { class SubdivisionTargeting { public: - SubdivisionTargeting( - AdsImpl* ads); + SubdivisionTargeting(); ~SubdivisionTargeting(); @@ -61,8 +60,6 @@ class SubdivisionTargeting { void Retry(); void FetchAfterDelay(); - - AdsImpl* ads_; // NOT OWNED }; } // namespace geographic diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.cc index a60ae973a92f..12a6e4aed8a7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.cc @@ -5,30 +5,36 @@ #include "bat/ads/internal/ad_transfer/ad_transfer.h" -#include - +#include "base/time/time.h" +#include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/tabs/tabs.h" +#include "bat/ads/internal/tab_manager/tab_info.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/internal/url_util.h" #include "bat/ads/result.h" namespace ads { namespace { -const uint64_t kTransferAdAfterSeconds = 10; +const int64_t kTransferAdAfterSeconds = 10; } // namespace -AdTransfer::AdTransfer( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdTransfer::AdTransfer() = default; AdTransfer::~AdTransfer() = default; +void AdTransfer::AddObserver( + AdTransferObserver* observer) { + observers_.AddObserver(observer); +} + +void AdTransfer::RemoveObserver( + AdTransferObserver* observer) { + observers_.RemoveObserver(observer); +} + void AdTransfer::MaybeTransferAd( const int32_t tab_id, const std::string& url) { @@ -36,12 +42,12 @@ void AdTransfer::MaybeTransferAd( return; } - if (!UrlHasScheme(url)) { + if (!DoesUrlHaveSchemeHTTPOrHTTPS(url)) { BLOG(1, "Visited URL is not supported for ad transfer"); return; } - if (!SameSite(url, last_clicked_ad_.target_url)) { + if (!SameDomainOrHost(url, last_clicked_ad_.target_url)) { BLOG(1, "Visited URL does not match the last clicked ad"); return; } @@ -104,21 +110,34 @@ void AdTransfer::TransferAd( void AdTransfer::OnTransferAd( const int32_t tab_id, const std::string& url) { - const AdInfo transferred_ad = last_clicked_ad_; + const AdInfo ad = last_clicked_ad_; clear_last_clicked_ad(); transferring_ad_tab_id_ = 0; - if (!ads_->get_tabs()->IsVisible(tab_id)) { + if (!TabManager::Get()->IsVisible(tab_id)) { + BLOG(1, "Failed to transfer ad for " << url); + NotifyAdTransferFailed(ad); + return; + } + + const base::Optional tab = TabManager::Get()->GetForId(tab_id); + if (!tab) { + BLOG(1, "Failed to transfer ad for " << url); + NotifyAdTransferFailed(ad); + return; + } + + if (!SameDomainOrHost(tab->url, url)) { BLOG(1, "Failed to transfer ad for " << url); + NotifyAdTransferFailed(ad); return; } BLOG(1, "Transferred ad for " << url); - AdEvents ad_events(ads_); - ad_events.Log(transferred_ad, ConfirmationType::kTransferred, + LogAdEvent(ad, ConfirmationType::kTransferred, [](const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log transferred ad event"); @@ -128,8 +147,21 @@ void AdTransfer::OnTransferAd( BLOG(6, "Successfully logged transferred ad event"); }); - ads_->get_confirmations()->ConfirmAd(transferred_ad.creative_instance_id, - ConfirmationType::kTransferred); + NotifyAdTransfer(ad); +} + +void AdTransfer::NotifyAdTransfer( + const AdInfo& ad) { + for (AdTransferObserver& observer : observers_) { + observer.OnAdTransfer(ad); + } +} + +void AdTransfer::NotifyAdTransferFailed( + const AdInfo& ad) { + for (AdTransferObserver& observer : observers_) { + observer.OnAdTransferFailed(ad); + } } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.h index e766ecb7e631..fb35836d29c4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer.h @@ -11,19 +11,22 @@ #include #include "bat/ads/ad_info.h" +#include "bat/ads/internal/ad_transfer/ad_transfer_observer.h" #include "bat/ads/internal/timer.h" namespace ads { -class AdsImpl; - class AdTransfer { public: - AdTransfer( - AdsImpl* ads); + AdTransfer(); ~AdTransfer(); + void AddObserver( + AdTransferObserver* observer); + void RemoveObserver( + AdTransferObserver* observer); + void MaybeTransferAd( const int32_t tab_id, const std::string& url); @@ -35,6 +38,14 @@ class AdTransfer { const AdInfo& ad); private: + base::ObserverList observers_; + + int32_t transferring_ad_tab_id_ = 0; + + Timer timer_; + + AdInfo last_clicked_ad_; + void clear_last_clicked_ad(); void TransferAd( @@ -45,13 +56,11 @@ class AdTransfer { const int32_t tab_id, const std::string& url); - AdInfo last_clicked_ad_; - - int32_t transferring_ad_tab_id_ = 0; - - Timer timer_; + void NotifyAdTransfer( + const AdInfo& ad); - AdsImpl* ads_; // NOT OWNED + void NotifyAdTransferFailed( + const AdInfo& ad); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_observer.h new file mode 100644 index 000000000000..7502c6dbd8b7 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_observer.h @@ -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/. */ + +#ifndef BAT_ADS_INTERNAL_AD_TRANSFER_AD_TRANSFER_OBSERVER_H_ +#define BAT_ADS_INTERNAL_AD_TRANSFER_AD_TRANSFER_OBSERVER_H_ + +#include "base/observer_list.h" + +namespace ads { + +struct AdInfo; + +class AdTransferObserver : public base::CheckedObserver { + public: + // Invoked when an ad is transferred + virtual void OnAdTransfer( + const AdInfo& ad) {} + + // Invoked when an ad fails to transfer + virtual void OnAdTransferFailed( + const AdInfo& ad) {} + + protected: + ~AdTransferObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_AD_TRANSFER_AD_TRANSFER_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_unittest.cc new file mode 100644 index 000000000000..54fbb128a649 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ad_transfer/ad_transfer_unittest.cc @@ -0,0 +1,197 @@ +/* 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/ad_transfer/ad_transfer.h" + +#include + +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" + +// npm run test -- brave_unit_tests --filter=BatAds* + +namespace ads { + +class BatAdsAdTransferTest + : public AdTransferObserver, + public UnitTestBase { + protected: + BatAdsAdTransferTest() + : ad_transfer_(std::make_unique()) { + ad_transfer_->AddObserver(this); + } + + ~BatAdsAdTransferTest() override { + ad_transfer_->RemoveObserver(this); + } + + void OnAdTransfer( + const AdInfo& ad) override { + ad_transfer_count_++; + } + + void OnAdTransferFailed( + const AdInfo& ad) override { + ad_transfer_count_--; + } + + int GetAdTransferCount() { + return ad_transfer_count_; + } + + AdInfo GetAdForType( + const AdType type) { + AdInfo ad; + + ad.type = type; + ad.creative_instance_id = "c71b357a-89b9-4c4a-b71e-22654d4e557e"; + ad.creative_set_id = "01cd57da-1fa2-460b-a95d-4cc8cbd25e21"; + ad.campaign_id = "579e4e33-8c26-418f-9936-236142e0a697"; + ad.category = "Technology & Computing"; + ad.target_url = "https://www.brave.com"; + + return ad; + } + + std::unique_ptr ad_transfer_; + + private: + int ad_transfer_count_ = 0; +}; + +TEST_F(BatAdsAdTransferTest, + DoNotTransferAdIfUrlIsMissingHTTPOrHTTPSScheme) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kAdNotification); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://brave.com", /* is_visible */ true, + /* is_incognito */ false); + + // Act + ad_transfer_->MaybeTransferAd(1, "brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(0, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + DoNotTransferAdIfTheUrlDoesNotMatchTheLastClickedAd) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kNewTabPageAd); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://foobar.com", /* is_visible */ true, + /* is_incognito */ false); + + // Act + ad_transfer_->MaybeTransferAd(1, "brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(0, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + DoNotTransferAdIfTheSameAdIsAlreadyTransferring) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kAdNotification); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://brave.com", /* is_visible */ true, + /* is_incognito */ false); + + ad_transfer_->MaybeTransferAd(1, "https://brave.com"); + + // Act + ad_transfer_->MaybeTransferAd(1, "https://brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(1, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + TransferAdIfAnotherAdIsAlreadyTransferring) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kAdNotification); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://foobar.com", /* is_visible */ true, + /* is_incognito */ false); + + ad_transfer_->MaybeTransferAd(1, "https://foobar.com"); + + TabManager::Get()->OnUpdated(1, "https://foobar.com", /* is_visible */ false, + /* is_incognito */ false); + + TabManager::Get()->OnUpdated(2, "https://brave.com", /* is_visible */ true, + /* is_incognito */ false); + + // Act + ad_transfer_->MaybeTransferAd(2, "https://brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(1, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + TransferAdIfTheTabIsVisibleAndTheUrlIsTheSameAsTheDomainOrHost) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kNewTabPageAd); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://brave.com", /* is_visible */ true, + /* is_incognito */ false); + + // Act + ad_transfer_->MaybeTransferAd(1, "https://brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(1, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + FailToTransferAdIfNotVisible) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kAdNotification); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://brave.com", /* is_visible */ false, + /* is_incognito */ false); + + // Act + ad_transfer_->MaybeTransferAd(1, "https://brave.com"); + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(-1, GetAdTransferCount()); +} + +TEST_F(BatAdsAdTransferTest, + FailToTransferAdIfTheTabUrlIsNotTheSameAsTheDomainOrHost) { + // Arrange + const AdInfo ad = GetAdForType(AdType::kNewTabPageAd); + ad_transfer_->set_last_clicked_ad(ad); + + TabManager::Get()->OnUpdated(1, "https://brave.com", /* is_visible */ true, + /* is_incognito */ false); + + ad_transfer_->MaybeTransferAd(1, "https://brave.com"); + + // Act + TabManager::Get()->OnUpdated(1, "https://foobar.com", /* is_visible */ true, + /* is_incognito */ false); + + FastForwardClockBy(base::TimeDelta::FromSeconds(10)); + + // Assert + EXPECT_EQ(-1, GetAdTransferCount()); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.cc index 5029cddb0669..46c1a0021189 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.cc @@ -8,33 +8,106 @@ #include "bat/ads/ad_notification_info.h" #include "bat/ads/internal/ad_events/ad_notifications/ad_notification_event_factory.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/logging.h" namespace ads { -AdNotification::AdNotification( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdNotification::AdNotification() = default; AdNotification::~AdNotification() = default; -void AdNotification::Trigger( +void AdNotification::AddObserver( + AdNotificationObserver* observer) { + observers_.AddObserver(observer); +} + +void AdNotification::RemoveObserver( + AdNotificationObserver* observer) { + observers_.RemoveObserver(observer); +} + +void AdNotification::FireEvent( const std::string& uuid, const AdNotificationEventType event_type) { DCHECK(!uuid.empty()); - AdNotificationInfo ad_notification; - if (!ads_->get_ad_notifications()->Get(uuid, &ad_notification)) { + AdNotificationInfo ad; + if (!AdNotifications::Get()->Get(uuid, &ad)) { BLOG(1, "Failed to trigger ad notification event for uuid " << uuid); + + NotifyAdNotificationEventFailed(uuid, event_type); + return; } - const auto ad_event = - ad_notifications::AdEventFactory::Build(ads_, event_type); - ad_event->Trigger(ad_notification); + const auto ad_event = ad_notifications::AdEventFactory::Build(event_type); + ad_event->FireEvent(ad); + + NotifyAdNotificationEvent(ad, event_type); +} + +/////////////////////////////////////////////////////////////////////////////// + +void AdNotification::NotifyAdNotificationEvent( + const AdNotificationInfo& ad, + const AdNotificationEventType event_type) { + switch (event_type) { + case AdNotificationEventType::kViewed: { + NotifyAdNotificationViewed(ad); + break; + } + + case AdNotificationEventType::kClicked: { + NotifyAdNotificationClicked(ad); + break; + } + + case AdNotificationEventType::kDismissed: { + NotifyAdNotificationDismissed(ad); + break; + } + + case AdNotificationEventType::kTimedOut: { + NotifyAdNotificationTimedOut(ad); + break; + } + } +} + +void AdNotification::NotifyAdNotificationViewed( + const AdNotificationInfo& ad) { + for (AdNotificationObserver& observer : observers_) { + observer.OnAdNotificationViewed(ad); + } +} + +void AdNotification::NotifyAdNotificationClicked( + const AdNotificationInfo& ad) { + for (AdNotificationObserver& observer : observers_) { + observer.OnAdNotificationClicked(ad); + } +} + +void AdNotification::NotifyAdNotificationDismissed( + const AdNotificationInfo& ad) { + for (AdNotificationObserver& observer : observers_) { + observer.OnAdNotificationDismissed(ad); + } +} + +void AdNotification::NotifyAdNotificationTimedOut( + const AdNotificationInfo& ad) { + for (AdNotificationObserver& observer : observers_) { + observer.OnAdNotificationTimedOut(ad); + } +} + +void AdNotification::NotifyAdNotificationEventFailed( + const std::string& uuid, + const AdNotificationEventType event_type) { + for (AdNotificationObserver& observer : observers_) { + observer.OnAdNotificationEventFailed(uuid, event_type); + } } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.h b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.h index ddbfce85c538..22a0f49348b4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification.h @@ -8,25 +8,48 @@ #include +#include "bat/ads/internal/ads/ad_notifications/ad_notification_observer.h" #include "bat/ads/mojom.h" namespace ads { -class AdsImpl; +struct AdNotificationInfo; -class AdNotification { +class AdNotification + : public AdNotificationObserver { public: - AdNotification( - AdsImpl* ads); + AdNotification(); - ~AdNotification(); + ~AdNotification() override; - void Trigger( + void AddObserver( + AdNotificationObserver* observer); + void RemoveObserver( + AdNotificationObserver* observer); + + void FireEvent( const std::string& uuid, const AdNotificationEventType event_type); private: - AdsImpl* ads_; // NOT OWNED + base::ObserverList observers_; + + void NotifyAdNotificationEvent( + const AdNotificationInfo& ad, + const AdNotificationEventType event_type); + + void NotifyAdNotificationViewed( + const AdNotificationInfo& ad); + void NotifyAdNotificationClicked( + const AdNotificationInfo& ad); + void NotifyAdNotificationDismissed( + const AdNotificationInfo& ad); + void NotifyAdNotificationTimedOut( + const AdNotificationInfo& ad); + + void NotifyAdNotificationEventFailed( + const std::string& uuid, + const AdNotificationEventType event_type); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification_observer.h new file mode 100644 index 000000000000..67cb9665fff4 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notification_observer.h @@ -0,0 +1,47 @@ +/* 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 BAT_ADS_INTERNAL_ADS_AD_NOTIFICATIONS_AD_NOTIFICATION_OBSERVER_H_ +#define BAT_ADS_INTERNAL_ADS_AD_NOTIFICATIONS_AD_NOTIFICATION_OBSERVER_H_ + +#include + +#include "base/observer_list.h" +#include "bat/ads/mojom.h" + +namespace ads { + +struct AdNotificationInfo; + +class AdNotificationObserver : public base::CheckedObserver { + public: + // Invoked when an ad notification is viewed + virtual void OnAdNotificationViewed( + const AdNotificationInfo& ad) {} + + // Invoked when an ad notification is clicked + virtual void OnAdNotificationClicked( + const AdNotificationInfo& ad) {} + + // Invoked when an ad notification is dismissed + virtual void OnAdNotificationDismissed( + const AdNotificationInfo& ad) {} + + // Invoked when an ad notification times out + virtual void OnAdNotificationTimedOut( + const AdNotificationInfo& ad) {} + + // Invoked when an ad notification event fails + virtual void OnAdNotificationEventFailed( + const std::string& uuid, + const AdNotificationEventType event_type) {} + + protected: + ~AdNotificationObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ADS_AD_NOTIFICATIONS_AD_NOTIFICATION_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.cc index 995d22adb6e7..15b6debaed10 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.cc @@ -9,27 +9,28 @@ #include #include -#if defined(OS_ANDROID) -#include "base/android/build_info.h" -#include "base/system/sys_info.h" -#endif - #include "base/json/json_reader.h" #include "base/json/json_writer.h" +#include "base/time/time.h" #include "bat/ads/ad_notification_info.h" #include "bat/ads/ad_type.h" #include "bat/ads/internal/ad_events/ad_event_info.h" -#include "bat/ads/internal/ads_impl.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/logging.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/result.h" +#if defined(OS_ANDROID) +#include "base/android/build_info.h" +#include "base/system/sys_info.h" +#endif + namespace ads { -using std::placeholders::_1; -using std::placeholders::_2; +namespace { + +AdNotifications* g_ad_notifications = nullptr; #if defined(OS_ANDROID) const int kMaximumAdNotifications = 3; @@ -50,14 +51,28 @@ const char kNotificationTitleKey[] = "advertiser"; const char kNotificationBodyKey[] = "text"; const char kNotificationTargetUrlKey[] = "url"; -AdNotifications::AdNotifications( - AdsImpl* ads) - : is_initialized_(false), - ads_(ads) { - DCHECK(ads_); +} // namespace + +AdNotifications::AdNotifications() { + DCHECK_EQ(g_ad_notifications, nullptr); + g_ad_notifications = this; } -AdNotifications::~AdNotifications() = default; +AdNotifications::~AdNotifications() { + DCHECK(g_ad_notifications); + g_ad_notifications = nullptr; +} + +// static +AdNotifications* AdNotifications::Get() { + DCHECK(g_ad_notifications); + return g_ad_notifications; +} + +// static +bool AdNotifications::HasInstance() { + return g_ad_notifications; +} void AdNotifications::Initialize( InitializeCallback callback) { @@ -68,8 +83,9 @@ void AdNotifications::Initialize( bool AdNotifications::Get( const std::string& uuid, - AdNotificationInfo* info) const { + AdNotificationInfo* ad_notification) const { DCHECK(is_initialized_); + DCHECK(ad_notification); auto iter = std::find_if(ad_notifications_.begin(), ad_notifications_.end(), [&uuid](const AdNotificationInfo& notification) { @@ -80,9 +96,9 @@ bool AdNotifications::Get( return false; } - *info = *iter; + *ad_notification = *iter; - info->type = AdType::kAdNotification; + ad_notification->type = AdType::kAdNotification; return true; } @@ -97,8 +113,6 @@ void AdNotifications::PushBack( PopFront(true); } - ads_->get_ads_client()->ShowNotification(info); - Save(); } @@ -106,7 +120,7 @@ void AdNotifications::PopFront( const bool should_dismiss) { if (!ad_notifications_.empty()) { if (should_dismiss) { - ads_->get_ads_client()->CloseNotification(ad_notifications_.front().uuid); + AdsClientHelper::Get()->CloseNotification(ad_notifications_.front().uuid); } ad_notifications_.pop_front(); Save(); @@ -128,7 +142,7 @@ bool AdNotifications::Remove( } if (should_dismiss) { - ads_->get_ads_client()->CloseNotification(uuid); + AdsClientHelper::Get()->CloseNotification(uuid); } ad_notifications_.erase(iter); @@ -143,7 +157,7 @@ void AdNotifications::RemoveAll( if (should_dismiss) { for (const auto& notification : ad_notifications_) { - ads_->get_ads_client()->CloseNotification(notification.uuid); + AdsClientHelper::Get()->CloseNotification(notification.uuid); } } ad_notifications_.clear(); @@ -173,7 +187,7 @@ uint64_t AdNotifications::Count() const { #if defined(OS_ANDROID) void AdNotifications::RemoveAllAfterReboot() { - database::table::AdEvents database_table(ads_); + database::table::AdEvents database_table; database_table.GetAll([=]( const Result result, const AdEventList& ad_events) { @@ -192,7 +206,7 @@ void AdNotifications::RemoveAllAfterReboot() { const int64_t boot_timestamp = boot_time.ToDoubleT(); if (ad_event.timestamp <= boot_timestamp) { - ads_->get_ad_notifications()->RemoveAll(false); + RemoveAll(false); } }); } @@ -201,14 +215,15 @@ void AdNotifications::RemoveAllAfterUpdate() { const std::string current_version_code = base::android::BuildInfo::GetInstance()->package_version_code(); - const std::string last_version_code = ads_->get_client()->GetVersionCode(); + const std::string last_version_code = Client::Get()->GetVersionCode(); if (last_version_code == current_version_code) { return; } - ads_->get_client()->SetVersionCode(current_version_code); - ads_->get_ad_notifications()->RemoveAll(false); + Client::Get()->SetVersionCode(current_version_code); + + RemoveAll(false); } #endif @@ -239,46 +254,47 @@ std::deque AdNotifications::GetNotificationsFromList( bool AdNotifications::GetNotificationFromDictionary( base::DictionaryValue* dictionary, - AdNotificationInfo* info) const { - AdNotificationInfo notification_info; + AdNotificationInfo* ad_notification) const { + AdNotificationInfo new_ad_notification; - if (!GetUuidFromDictionary(dictionary, ¬ification_info.uuid)) { + if (!GetUuidFromDictionary(dictionary, &new_ad_notification.uuid)) { return false; } if (!GetCreativeInstanceIdFromDictionary(dictionary, - ¬ification_info.creative_instance_id)) { + &new_ad_notification.creative_instance_id)) { return false; } if (!GetCreativeSetIdFromDictionary(dictionary, - ¬ification_info.creative_set_id)) { + &new_ad_notification.creative_set_id)) { return false; } if (!GetCampaignIdFromDictionary(dictionary, - ¬ification_info.campaign_id)) { + &new_ad_notification.campaign_id)) { // Migrate for legacy notifications - notification_info.campaign_id = ""; + new_ad_notification.campaign_id = ""; } - if (!GetCategoryFromDictionary(dictionary, ¬ification_info.category)) { + if (!GetCategoryFromDictionary(dictionary, &new_ad_notification.category)) { return false; } - if (!GetTitleFromDictionary(dictionary, ¬ification_info.title)) { + if (!GetTitleFromDictionary(dictionary, &new_ad_notification.title)) { return false; } - if (!GetBodyFromDictionary(dictionary, ¬ification_info.body)) { + if (!GetBodyFromDictionary(dictionary, &new_ad_notification.body)) { return false; } - if (!GetTargetUrlFromDictionary(dictionary, ¬ification_info.target_url)) { + if (!GetTargetUrlFromDictionary(dictionary, + &new_ad_notification.target_url)) { return false; } - *info = notification_info; + *ad_notification = new_ad_notification; return true; } @@ -360,8 +376,9 @@ void AdNotifications::Save() { BLOG(9, "Saving ad notifications state"); std::string json = ToJson(); - auto callback = std::bind(&AdNotifications::OnSaved, this, _1); - ads_->get_ads_client()->Save(kNotificationsFilename, json, callback); + auto callback = std::bind(&AdNotifications::OnSaved, this, + std::placeholders::_1); + AdsClientHelper::Get()->Save(kNotificationsFilename, json, callback); } void AdNotifications::OnSaved( @@ -377,8 +394,9 @@ void AdNotifications::OnSaved( void AdNotifications::Load() { BLOG(3, "Loading ad notifications state"); - auto callback = std::bind(&AdNotifications::OnLoaded, this, _1, _2); - ads_->get_ads_client()->Load(kNotificationsFilename, callback); + auto callback = std::bind(&AdNotifications::OnLoaded, this, + std::placeholders::_1, std::placeholders::_2); + AdsClientHelper::Get()->Load(kNotificationsFilename, callback); } void AdNotifications::OnLoaded( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.h b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.h index d34b99722af7..28e22abaff76 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/ad_notifications/ad_notifications.h @@ -16,22 +16,24 @@ namespace ads { -class AdsImpl; struct AdNotificationInfo; class AdNotifications { public: - AdNotifications( - AdsImpl* ads); + AdNotifications(); ~AdNotifications(); + static AdNotifications* Get(); + + static bool HasInstance(); + void Initialize( InitializeCallback callback); bool Get( const std::string& uuid, - AdNotificationInfo* info) const; + AdNotificationInfo* ad_notification) const; void PushBack( const AdNotificationInfo& info); @@ -55,7 +57,7 @@ class AdNotifications { #endif private: - bool is_initialized_; + bool is_initialized_ = false; InitializeCallback callback_; @@ -66,7 +68,7 @@ class AdNotifications { bool GetNotificationFromDictionary( base::DictionaryValue* dictionary, - AdNotificationInfo* info) const; + AdNotificationInfo* ad_notification) const; bool GetUuidFromDictionary( base::DictionaryValue* dictionary, @@ -117,8 +119,6 @@ class AdNotifications { std::string ToJson(); base::Value GetAsList(); - - AdsImpl* ads_; // NOT OWNED }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc index 307a181c2fc5..12208fcf46d9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc @@ -35,15 +35,21 @@ NewTabPageAdInfo CreateNewTabPageAd( } // namespace -NewTabPageAd::NewTabPageAd( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +NewTabPageAd::NewTabPageAd() = default; NewTabPageAd::~NewTabPageAd() = default; -void NewTabPageAd::Trigger( +void NewTabPageAd::AddObserver( + NewTabPageAdObserver* observer) { + observers_.AddObserver(observer); +} + +void NewTabPageAd::RemoveObserver( + NewTabPageAdObserver* observer) { + observers_.RemoveObserver(observer); +} + +void NewTabPageAd::FireEvent( const std::string& wallpaper_id, const std::string& creative_instance_id, const NewTabPageAdEventType event_type) { @@ -55,26 +61,70 @@ void NewTabPageAd::Trigger( return; } - database::table::CreativeNewTabPageAds database_table(ads_); + database::table::CreativeNewTabPageAds database_table; database_table.GetForCreativeInstanceId(creative_instance_id, [=]( const Result result, const std::string& creative_instance_id, const CreativeNewTabPageAdInfo& creative_new_tab_page_ad) { if (result != SUCCESS) { - BLOG(1, "Failed to trigger new tab page ad event for wallpaper id " - << wallpaper_id << " and creative instance id " - << creative_instance_id); + BLOG(1, "Failed to trigger new tab page ad event for wallpaper id"); + + NotifyNewTabPageAdEventFailed(wallpaper_id, + creative_instance_id, event_type); return; } - const NewTabPageAdInfo new_tab_page_ad = + const NewTabPageAdInfo ad = CreateNewTabPageAd(wallpaper_id, creative_new_tab_page_ad); - const auto ad_event = - new_tab_page_ads::AdEventFactory::Build(ads_, event_type); - ad_event->Trigger(new_tab_page_ad); + const auto ad_event = new_tab_page_ads::AdEventFactory::Build(event_type); + ad_event->FireEvent(ad); + + NotifyNewTabPageAdEvent(ad, event_type); }); } +/////////////////////////////////////////////////////////////////////////////// + +void NewTabPageAd::NotifyNewTabPageAdEvent( + const NewTabPageAdInfo& ad, + const NewTabPageAdEventType event_type) { + switch (event_type) { + case NewTabPageAdEventType::kViewed: { + NotifyNewTabPageAdViewed(ad); + break; + } + + case NewTabPageAdEventType::kClicked: { + NotifyNewTabPageAdClicked(ad); + break; + } + } +} + +void NewTabPageAd::NotifyNewTabPageAdViewed( + const NewTabPageAdInfo& ad) { + for (NewTabPageAdObserver& observer : observers_) { + observer.OnNewTabPageAdViewed(ad); + } +} + +void NewTabPageAd::NotifyNewTabPageAdClicked( + const NewTabPageAdInfo& ad) { + for (NewTabPageAdObserver& observer : observers_) { + observer.OnNewTabPageAdClicked(ad); + } +} + +void NewTabPageAd::NotifyNewTabPageAdEventFailed( + const std::string& wallpaper_id, + const std::string& creative_instance_id, + const NewTabPageAdEventType event_type) { + for (NewTabPageAdObserver& observer : observers_) { + observer.OnNewTabPageAdEventFailed(wallpaper_id, + creative_instance_id, event_type); + } +} + } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h index 0d94f2747ed6..e2ee1b05700c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h @@ -8,26 +8,46 @@ #include +#include "bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h" #include "bat/ads/mojom.h" namespace ads { -class AdsImpl; +struct NewTabPageAdInfo; -class NewTabPageAd { +class NewTabPageAd + : public NewTabPageAdObserver { public: - NewTabPageAd( - AdsImpl* ads); + NewTabPageAd(); - ~NewTabPageAd(); + ~NewTabPageAd() override; - void Trigger( + void AddObserver( + NewTabPageAdObserver* observer); + void RemoveObserver( + NewTabPageAdObserver* observer); + + void FireEvent( const std::string& wallpaper_id, const std::string& creative_instance_id, const NewTabPageAdEventType event_type); private: - AdsImpl* ads_; // NOT OWNED + base::ObserverList observers_; + + void NotifyNewTabPageAdEvent( + const NewTabPageAdInfo& ad, + const NewTabPageAdEventType event_type); + + void NotifyNewTabPageAdViewed( + const NewTabPageAdInfo& ad); + void NotifyNewTabPageAdClicked( + const NewTabPageAdInfo& ad); + + void NotifyNewTabPageAdEventFailed( + const std::string& wallpaper_id, + const std::string& creative_instance_id, + const NewTabPageAdEventType event_type); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h new file mode 100644 index 000000000000..0b1a6fa826d8 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h @@ -0,0 +1,40 @@ +/* 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 BAT_ADS_INTERNAL_ADS_NEW_TAB_PAGE_ADS_NEW_TAB_PAGE_AD_OBSERVER_H_ +#define BAT_ADS_INTERNAL_ADS_NEW_TAB_PAGE_ADS_NEW_TAB_PAGE_AD_OBSERVER_H_ + +#include + +#include "base/observer_list.h" +#include "bat/ads/mojom.h" + +namespace ads { + +struct NewTabPageAdInfo; + +class NewTabPageAdObserver : public base::CheckedObserver { + public: + // Invoked when a new tab page ad is viewed + virtual void OnNewTabPageAdViewed( + const NewTabPageAdInfo& ad) {} + + // Invoked when a new tab page ad is clicked + virtual void OnNewTabPageAdClicked( + const NewTabPageAdInfo& ad) {} + + // Invoked when a new tab page ad event fails + virtual void OnNewTabPageAdEventFailed( + const std::string& wallpaper_id, + const std::string& creative_instance_id, + const NewTabPageAdEventType event_type) {} + + protected: + ~NewTabPageAdObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ADS_NEW_TAB_PAGE_ADS_NEW_TAB_PAGE_AD_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.cc new file mode 100644 index 000000000000..98af003384c0 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.cc @@ -0,0 +1,39 @@ +/* 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/ads_client_helper.h" + +#include "bat/ads/internal/logging.h" + +namespace ads { + +namespace { +AdsClient* g_ads_client = nullptr; +} // namespace + +AdsClientHelper::AdsClientHelper( + AdsClient* ads_client) { + DCHECK(ads_client); + DCHECK_EQ(g_ads_client, nullptr); + g_ads_client = ads_client; +} + +AdsClientHelper::~AdsClientHelper() { + DCHECK(g_ads_client); + g_ads_client = nullptr; +} + +// static +AdsClient* AdsClientHelper::Get() { + DCHECK(g_ads_client); + return g_ads_client; +} + +// static +bool AdsClientHelper::HasInstance() { + return g_ads_client; +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.h b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.h new file mode 100644 index 000000000000..168476a904f4 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_helper.h @@ -0,0 +1,27 @@ +/* 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 BAT_ADS_INTERNAL_ADS_CLIENT_HELPER_H_ +#define BAT_ADS_INTERNAL_ADS_CLIENT_HELPER_H_ + +#include "bat/ads/ads_client.h" + +namespace ads { + +class AdsClientHelper { + public: + AdsClientHelper( + AdsClient* ads_client); + + ~AdsClientHelper(); + + static AdsClient* Get(); + + static bool HasInstance(); +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_ADS_CLIENT_HELPER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.h b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.h index 7912ccddbadf..9f7a23ae342a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_client_mock.h @@ -19,21 +19,20 @@ namespace ads { class AdsClientMock : public AdsClient { public: AdsClientMock(); - ~AdsClientMock() override; - MOCK_CONST_METHOD0(GetLocale, std::string()); + ~AdsClientMock() override; MOCK_CONST_METHOD0(IsNetworkConnectionAvailable, bool()); MOCK_CONST_METHOD0(IsForeground, bool()); + MOCK_METHOD0(ShouldShowNotifications, bool()); + MOCK_CONST_METHOD0(CanShowBackgroundNotifications, bool()); MOCK_METHOD1(ShowNotification, void( const AdNotificationInfo& ad_notification)); - MOCK_METHOD0(ShouldShowNotifications, bool()); - MOCK_METHOD1(CloseNotification, void( const std::string& uuid)); @@ -46,19 +45,14 @@ class AdsClientMock : public AdsClient { const std::string& value, ResultCallback callback)); - MOCK_METHOD2(LoadUserModelForId, void( - const std::string& id, - LoadCallback callback)); - - MOCK_METHOD3(RecordP2AEvent, void( - const std::string& name, - const ads::P2AEventType type, - const std::string& value)); - MOCK_METHOD2(Load, void( const std::string& name, LoadCallback callback)); + MOCK_METHOD2(LoadUserModelForId, void( + const std::string& id, + LoadCallback callback)); + MOCK_METHOD1(LoadResourceForId, std::string( const std::string& id)); @@ -68,6 +62,11 @@ class AdsClientMock : public AdsClient { MOCK_METHOD0(OnAdRewardsChanged, void()); + MOCK_METHOD3(RecordP2AEvent, void( + const std::string& name, + const ads::P2AEventType type, + const std::string& value)); + MOCK_METHOD4(Log, void( const char* file, const int line, diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.cc index d0f06ef863bb..e87b08a84f3c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.cc @@ -8,6 +8,7 @@ #include #include +#include "base/time/time.h" #include "bat/ads/ad_notification_info.h" #include "bat/ads/confirmation_type.h" #include "bat/ads/internal/ads_history/filters/ads_history_date_range_filter.h" @@ -20,21 +21,14 @@ #include "bat/ads/new_tab_page_ad_info.h" namespace ads { +namespace history { -AdsHistory::AdsHistory( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -AdsHistory::~AdsHistory() = default; - -AdsHistoryInfo AdsHistory::Get( +AdsHistoryInfo Get( const AdsHistoryInfo::FilterType filter_type, const AdsHistoryInfo::SortType sort_type, const uint64_t from_timestamp, - const uint64_t to_timestamp) const { - std::deque ads_history = ads_->get_client()->GetAdsHistory(); + const uint64_t to_timestamp) { + std::deque ads_history = Client::Get()->GetAdsHistory(); const auto date_range_filter = std::make_unique(); if (date_range_filter) { @@ -60,7 +54,7 @@ AdsHistoryInfo AdsHistory::Get( return normalized_ads_history; } -void AdsHistory::AddAdNotification( +void AddAdNotification( const AdNotificationInfo& ad, const ConfirmationType& confirmation_type) { AdHistoryInfo ad_history; @@ -74,15 +68,15 @@ void AdsHistory::AddAdNotification( ad_history.ad_content.campaign_id = ad.campaign_id; ad_history.ad_content.brand = ad.title; ad_history.ad_content.brand_info = ad.body; - ad_history.ad_content.brand_display_url = GetUrlHost(ad.target_url); + ad_history.ad_content.brand_display_url = GetHostFromUrl(ad.target_url); ad_history.ad_content.brand_url = ad.target_url; ad_history.ad_content.ad_action = confirmation_type; ad_history.category_content.category = ad.category; - ads_->get_client()->AppendAdHistoryToAdsHistory(ad_history); + Client::Get()->AppendAdHistoryToAdsHistory(ad_history); } -void AdsHistory::AddNewTabPageAd( +void AddNewTabPageAd( const NewTabPageAdInfo& ad, const ConfirmationType& confirmation_type) { AdHistoryInfo ad_history; @@ -96,12 +90,13 @@ void AdsHistory::AddNewTabPageAd( ad_history.ad_content.campaign_id = ad.campaign_id; ad_history.ad_content.brand = ad.company_name; ad_history.ad_content.brand_info = ad.alt; - ad_history.ad_content.brand_display_url = GetUrlHost(ad.target_url); + ad_history.ad_content.brand_display_url = GetHostFromUrl(ad.target_url); ad_history.ad_content.brand_url = ad.target_url; ad_history.ad_content.ad_action = confirmation_type; ad_history.category_content.category = ad.category; - ads_->get_client()->AppendAdHistoryToAdsHistory(ad_history); + Client::Get()->AppendAdHistoryToAdsHistory(ad_history); } +} // namespace history } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.h b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.h index ce37d42ccd5d..8cc670004b94 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/ads_history.h @@ -12,36 +12,27 @@ namespace ads { -class AdsImpl; class ConfirmationType; struct AdNotificationInfo; struct NewTabPageAdInfo; -class AdsHistory { - public: - AdsHistory( - AdsImpl* ads); +namespace history { - ~AdsHistory(); +AdsHistoryInfo Get( + const AdsHistoryInfo::FilterType filter_type, + const AdsHistoryInfo::SortType sort_type, + const uint64_t from_timestamp, + const uint64_t to_timestamp); - AdsHistoryInfo Get( - const AdsHistoryInfo::FilterType filter_type, - const AdsHistoryInfo::SortType sort_type, - const uint64_t from_timestamp, - const uint64_t to_timestamp) const; +void AddAdNotification( + const AdNotificationInfo& ad, + const ConfirmationType& confirmation_type); - void AddAdNotification( - const AdNotificationInfo& ad, - const ConfirmationType& confirmation_type); - - void AddNewTabPageAd( - const NewTabPageAdInfo& ad, - const ConfirmationType& confirmation_type); - - private: - AdsImpl* ads_; // NOT OWNED -}; +void AddNewTabPageAd( + const NewTabPageAdInfo& ad, + const ConfirmationType& confirmation_type); +} // namespace history } // namespace ads #endif // BAT_ADS_INTERNAL_ADS_HISTORY_ADS_HISTORY_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter_unittest.cc index 63d7c8f817b2..676a1129d307 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_confirmation_filter_unittest.cc @@ -5,12 +5,9 @@ #include "bat/ads/internal/ads_history/filters/ads_history_confirmation_filter.h" -#include - #include "testing/gtest/include/gtest/gtest.h" #include "bat/ads/ad_history_info.h" #include "bat/ads/internal/container_util.h" -#include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_date_range_filter_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_date_range_filter_unittest.cc index 716f336c0d7b..0c65ad40b7b2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_date_range_filter_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/filters/ads_history_date_range_filter_unittest.cc @@ -5,13 +5,9 @@ #include "bat/ads/internal/ads_history/filters/ads_history_date_range_filter.h" -#include - -#include #include #include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/ad_history_info.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/sorts/ads_history_sort_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/sorts/ads_history_sort_unittest.cc index 958ee790f463..f76211394d06 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_history/sorts/ads_history_sort_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_history/sorts/ads_history_sort_unittest.cc @@ -5,8 +5,6 @@ #include "bat/ads/internal/ads_history/sorts/ads_history_sort_factory.h" -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.cc b/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.cc index 94648b242dec..234d3dbcba34 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.cc @@ -7,14 +7,14 @@ #include +#include "base/time/time.h" #include "bat/ads/ad_history_info.h" +#include "bat/ads/ad_info.h" #include "bat/ads/ad_notification_info.h" #include "bat/ads/ads_client.h" #include "bat/ads/confirmation_type.h" -#include "bat/ads/internal/account/statement.h" -#include "bat/ads/internal/account/wallet.h" +#include "bat/ads/internal/account/account.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ad_rewards/ad_rewards.h" #include "bat/ads/internal/ad_server/ad_server.h" #include "bat/ads/internal/ad_serving/ad_notifications/ad_notification_serving.h" #include "bat/ads/internal/ad_targeting/ad_targeting.h" @@ -27,85 +27,85 @@ #include "bat/ads/internal/ads/ad_notifications/ad_notification.h" #include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" #include "bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/ads_history/ads_history.h" -#include "bat/ads/internal/bundle/bundle.h" +#include "bat/ads/internal/catalog/catalog_issuers_info.h" +#include "bat/ads/internal/catalog/catalog_util.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/confirmations/confirmation_info.h" #include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/conversions/conversions.h" #include "bat/ads/internal/database/database_initialize.h" -#include "bat/ads/internal/features.h" +#include "bat/ads/internal/features/features.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/platform/platform_helper.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" -#include "bat/ads/internal/tabs/tabs.h" -#include "bat/ads/internal/time_util.h" -#include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h" -#include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h" -#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h" +#include "bat/ads/internal/tab_manager/tab_info.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" #include "bat/ads/internal/user_activity/user_activity.h" +#include "bat/ads/new_tab_page_ad_info.h" #include "bat/ads/pref_names.h" +#include "bat/ads/statement_info.h" namespace ads { -using std::placeholders::_1; - namespace { const int kIdleThresholdInSeconds = 15; } // namespace AdsImpl::AdsImpl( AdsClient* ads_client) - : ads_client_(ads_client), - ads_history_(std::make_unique(this)), - ad_notification_(std::make_unique(this)), - ad_notifications_(std::make_unique(this)), - ad_rewards_(std::make_unique(this)), - ad_server_(std::make_unique(this)), - ad_notification_serving_(std::make_unique< - ad_notifications::AdServing>(this)), - ad_targeting_(std::make_unique(this)), - ad_transfer_(std::make_unique(this)), - bundle_(std::make_unique(this)), - client_(std::make_unique(this)), - confirmations_(std::make_unique(this)), - conversions_(std::make_unique(this)), - database_(std::make_unique(this)), - new_tab_page_ad_(std::make_unique(this)), - purchase_intent_classifier_(std::make_unique< - ad_targeting::behavioral::PurchaseIntentClassifier>(this)), + : ads_client_helper_(std::make_unique(ads_client)), page_classifier_(std::make_unique< - ad_targeting::contextual::PageClassifier>(this)), + ad_targeting::contextual::PageClassifier>()), + purchase_intent_classifier_(std::make_unique< + ad_targeting::behavioral::PurchaseIntentClassifier>()), subdivision_targeting_(std::make_unique< - ad_targeting::geographic::SubdivisionTargeting>(this)), - redeem_unblinded_payment_tokens_(std::make_unique< - RedeemUnblindedPaymentTokens>(this)), - redeem_unblinded_token_(std::make_unique(this)), - refill_unblinded_tokens_(std::make_unique(this)), - tabs_(std::make_unique(this)), - user_activity_(std::make_unique()), - wallet_(std::make_unique(this)) { - set_ads_client_for_logging(ads_client_); - - redeem_unblinded_token_->set_delegate(this); - redeem_unblinded_payment_tokens_->set_delegate(this); - refill_unblinded_tokens_->set_delegate(this); + ad_targeting::geographic::SubdivisionTargeting>()), + confirmations_(std::make_unique()), + account_(std::make_unique(confirmations_.get())), + ad_notification_(std::make_unique()), + ad_targeting_(std::make_unique(page_classifier_.get(), + purchase_intent_classifier_.get())), + ad_notification_serving_(std::make_unique< + ad_notifications::AdServing>(ad_targeting_.get(), + subdivision_targeting_.get())), + ad_notifications_(std::make_unique()), + ad_server_(std::make_unique()), + ad_transfer_(std::make_unique()), + client_(std::make_unique()), + conversions_(std::make_unique()), + database_(std::make_unique()), + new_tab_page_ad_(std::make_unique()), + tab_manager_(std::make_unique()), + user_activity_(std::make_unique()) { + account_->AddObserver(this); + ad_notification_->AddObserver(this); + ad_server_->AddObserver(this); + ad_transfer_->AddObserver(this); + conversions_->AddObserver(this); + new_tab_page_ad_->AddObserver(this); +} + +AdsImpl::~AdsImpl() { + account_->RemoveObserver(this); + ad_notification_->RemoveObserver(this); + ad_server_->RemoveObserver(this); + ad_transfer_->RemoveObserver(this); + conversions_->RemoveObserver(this); + new_tab_page_ad_->RemoveObserver(this); } -AdsImpl::~AdsImpl() = default; - bool AdsImpl::IsInitialized() { - if (!is_initialized_ || !ads_client_->GetBooleanPref(prefs::kEnabled)) { + if (!is_initialized_ || + !AdsClientHelper::Get()->GetBooleanPref(prefs::kEnabled)) { return false; } return true; } -bool AdsImpl::IsForeground() const { - return is_foreground_; -} - void AdsImpl::Initialize( InitializeCallback callback) { BLOG(1, "Initializing ads"); @@ -116,8 +116,8 @@ void AdsImpl::Initialize( return; } - const auto initialize_step_2_callback = - std::bind(&AdsImpl::InitializeStep2, this, _1, std::move(callback)); + const auto initialize_step_2_callback = std::bind(&AdsImpl::InitializeStep2, + this, std::placeholders::_1, std::move(callback)); database_->CreateOrOpen(initialize_step_2_callback); } @@ -162,7 +162,16 @@ void AdsImpl::OnPageLoaded( conversions_->MaybeConvert(url); - purchase_intent_classifier_->MaybeExtractIntentSignal(url); + const base::Optional last_visible_tab = + TabManager::Get()->GetLastVisible(); + + std::string last_visible_tab_url; + if (last_visible_tab) { + last_visible_tab_url = last_visible_tab->url; + } + + purchase_intent_classifier_->MaybeExtractIntentSignal(url, + last_visible_tab_url); page_classifier_->MaybeClassifyPage(url, content); } @@ -178,39 +187,33 @@ void AdsImpl::OnUnIdle() { BLOG(1, "Browser state changed to unidle"); + MaybeUpdateCatalog(); + MaybeServeAdNotification(); } void AdsImpl::OnForeground() { - is_foreground_ = true; - - BLOG(1, "Browser window did become active"); + TabManager::Get()->OnForegrounded(); - user_activity_->RecordActivityForType( - UserActivityType::kBrowserWindowDidBecomeActive); + MaybeUpdateCatalog(); MaybeServeAdNotificationsAtRegularIntervals(); } void AdsImpl::OnBackground() { - is_foreground_ = false; - - BLOG(1, "Browser window did enter background"); - - user_activity_->RecordActivityForType( - UserActivityType::kBrowserWindowDidEnterBackground); + TabManager::Get()->OnBackgrounded(); MaybeServeAdNotificationsAtRegularIntervals(); } void AdsImpl::OnMediaPlaying( const int32_t tab_id) { - tabs_->OnMediaPlaying(tab_id); + TabManager::Get()->OnMediaPlaying(tab_id); } void AdsImpl::OnMediaStopped( const int32_t tab_id) { - tabs_->OnMediaStopped(tab_id); + TabManager::Get()->OnMediaStopped(tab_id); } void AdsImpl::OnTabUpdated( @@ -220,23 +223,25 @@ void AdsImpl::OnTabUpdated( const bool is_browser_active, const bool is_incognito) { const bool is_visible = is_active && is_browser_active; - tabs_->OnUpdated(tab_id, url, is_visible, is_incognito); + TabManager::Get()->OnUpdated(tab_id, url, is_visible, is_incognito); } void AdsImpl::OnTabClosed( const int32_t tab_id) { - tabs_->OnClosed(tab_id); + TabManager::Get()->OnClosed(tab_id); + + ad_transfer_->Cancel(tab_id); } void AdsImpl::OnWalletUpdated( const std::string& id, const std::string& seed) { - if (!wallet_->Set(id, seed)) { - BLOG(0, "Failed to update wallet"); + if (!account_->SetWallet(id, seed)) { + BLOG(0, "Failed to set wallet"); return; } - BLOG(1, "Successfully updated wallet"); + BLOG(1, "Successfully set wallet"); } void AdsImpl::OnUserModelUpdated( @@ -261,19 +266,19 @@ bool AdsImpl::GetAdNotification( void AdsImpl::OnAdNotificationEvent( const std::string& uuid, const AdNotificationEventType event_type) { - ad_notification_->Trigger(uuid, event_type); + ad_notification_->FireEvent(uuid, event_type); } void AdsImpl::OnNewTabPageAdEvent( const std::string& wallpaper_id, const std::string& creative_instance_id, const NewTabPageAdEventType event_type) { - new_tab_page_ad_->Trigger(wallpaper_id, creative_instance_id, event_type); + new_tab_page_ad_->FireEvent(wallpaper_id, creative_instance_id, event_type); } void AdsImpl::RemoveAllHistory( RemoveAllHistoryCallback callback) { - client_->RemoveAllHistory(); + Client::Get()->RemoveAllHistory(); callback(SUCCESS); } @@ -283,8 +288,7 @@ void AdsImpl::ReconcileAdRewards() { return; } - const WalletInfo wallet = wallet_->Get(); - ad_rewards_->MaybeReconcile(wallet); + account_->Reconcile(); } AdsHistoryInfo AdsImpl::GetAdsHistory( @@ -292,8 +296,7 @@ AdsHistoryInfo AdsImpl::GetAdsHistory( const AdsHistoryInfo::SortType sort_type, const uint64_t from_timestamp, const uint64_t to_timestamp) { - return ads_history_->Get(filter_type, sort_type, - from_timestamp, to_timestamp); + return history::Get(filter_type, sort_type, from_timestamp, to_timestamp); } void AdsImpl::GetTransactionHistory( @@ -308,8 +311,7 @@ void AdsImpl::GetTransactionHistory( const int64_t to_timestamp = static_cast(base::Time::Now().ToDoubleT()); - Statement statement(this); - statement_of_account = statement.Get(0, to_timestamp); + statement_of_account = account_->GetStatement(0, to_timestamp); callback(/* success */ true, statement_of_account); } @@ -318,8 +320,8 @@ AdContentInfo::LikeAction AdsImpl::ToggleAdThumbUp( const std::string& creative_instance_id, const std::string& creative_set_id, const AdContentInfo::LikeAction& action) { - auto like_action = - client_->ToggleAdThumbUp(creative_instance_id, creative_set_id, action); + auto like_action = Client::Get()->ToggleAdThumbUp(creative_instance_id, + creative_set_id, action); if (like_action == AdContentInfo::LikeAction::kThumbsUp) { confirmations_->ConfirmAd(creative_instance_id, ConfirmationType::kUpvoted); } @@ -331,8 +333,8 @@ AdContentInfo::LikeAction AdsImpl::ToggleAdThumbDown( const std::string& creative_instance_id, const std::string& creative_set_id, const AdContentInfo::LikeAction& action) { - auto like_action = - client_->ToggleAdThumbDown(creative_instance_id, creative_set_id, action); + auto like_action = Client::Get()->ToggleAdThumbDown(creative_instance_id, + creative_set_id, action); if (like_action == AdContentInfo::LikeAction::kThumbsDown) { confirmations_->ConfirmAd(creative_instance_id, ConfirmationType::kDownvoted); @@ -344,28 +346,29 @@ AdContentInfo::LikeAction AdsImpl::ToggleAdThumbDown( CategoryContentInfo::OptAction AdsImpl::ToggleAdOptInAction( const std::string& category, const CategoryContentInfo::OptAction& action) { - return client_->ToggleAdOptInAction(category, action); + return Client::Get()->ToggleAdOptInAction(category, action); } CategoryContentInfo::OptAction AdsImpl::ToggleAdOptOutAction( const std::string& category, const CategoryContentInfo::OptAction& action) { - return client_->ToggleAdOptOutAction(category, action); + return Client::Get()->ToggleAdOptOutAction(category, action); } bool AdsImpl::ToggleSaveAd( const std::string& creative_instance_id, const std::string& creative_set_id, const bool saved) { - return client_->ToggleSaveAd(creative_instance_id, creative_set_id, saved); + return Client::Get()->ToggleSaveAd(creative_instance_id, + creative_set_id, saved); } bool AdsImpl::ToggleFlagAd( const std::string& creative_instance_id, const std::string& creative_set_id, const bool flagged) { - auto flag_ad = - client_->ToggleFlagAd(creative_instance_id, creative_set_id, flagged); + auto flag_ad = Client::Get()->ToggleFlagAd(creative_instance_id, + creative_set_id, flagged); if (flag_ad) { confirmations_->ConfirmAd(creative_instance_id, ConfirmationType::kFlagged); } @@ -384,9 +387,9 @@ void AdsImpl::InitializeStep2( return; } - const auto initialize_step_3_callback = - std::bind(&AdsImpl::InitializeStep3, this, _1, std::move(callback)); - client_->Initialize(initialize_step_3_callback); + const auto initialize_step_3_callback = std::bind(&AdsImpl::InitializeStep3, + this, std::placeholders::_1, std::move(callback)); + Client::Get()->Initialize(initialize_step_3_callback); } void AdsImpl::InitializeStep3( @@ -397,9 +400,9 @@ void AdsImpl::InitializeStep3( return; } - const auto initialize_step_4_callback = - std::bind(&AdsImpl::InitializeStep4, this, _1, std::move(callback)); - confirmations_->Initialize(initialize_step_4_callback); + const auto initialize_step_4_callback = std::bind(&AdsImpl::InitializeStep4, + this, std::placeholders::_1, std::move(callback)); + ConfirmationsState::Get()->Initialize(initialize_step_4_callback); } void AdsImpl::InitializeStep4( @@ -410,8 +413,8 @@ void AdsImpl::InitializeStep4( return; } - const auto initialize_step_5_callback = - std::bind(&AdsImpl::InitializeStep5, this, _1, std::move(callback)); + const auto initialize_step_5_callback = std::bind(&AdsImpl::InitializeStep5, + this, std::placeholders::_1, std::move(callback)); ad_notifications_->Initialize(initialize_step_5_callback); } @@ -423,8 +426,8 @@ void AdsImpl::InitializeStep5( return; } - const auto initialize_step_6_callback = - std::bind(&AdsImpl::InitializeStep6, this, _1, std::move(callback)); + const auto initialize_step_6_callback = std::bind(&AdsImpl::InitializeStep6, + this, std::placeholders::_1, std::move(callback)); conversions_->Initialize(initialize_step_6_callback); } @@ -440,23 +443,11 @@ void AdsImpl::InitializeStep6( BLOG(1, "Successfully initialized ads"); - is_foreground_ = ads_client_->IsForeground(); - - ads_client_->SetIntegerPref(prefs::kIdleThreshold, kIdleThresholdInSeconds); + AdsClientHelper::Get()->SetIntegerPref(prefs::kIdleThreshold, + kIdleThresholdInSeconds); callback(SUCCESS); - ReconcileAdRewards(); - - subdivision_targeting_->MaybeFetchForCurrentLocale(); - - const WalletInfo wallet = wallet_->Get(); - redeem_unblinded_payment_tokens_->MaybeRedeemAfterDelay(wallet); - - PurgeExpiredAdEvents(); - - conversions_->StartTimerIfReady(); - #if defined(OS_ANDROID) // Ad notifications do not sustain a reboot or update, so we should remove // orphaned ad notifications @@ -464,16 +455,26 @@ void AdsImpl::InitializeStep6( ad_notifications_->RemoveAllAfterUpdate(); #endif - features::LogPageProbabilitiesStudy(); + CleanupAdEvents(); - MaybeServeAdNotificationsAtRegularIntervals(); + account_->Reconcile(); + account_->ProcessUnclearedTransactions(); + + confirmations_->RetryAfterDelay(); + + subdivision_targeting_->MaybeFetchForCurrentLocale(); + + conversions_->StartTimerIfReady(); ad_server_->MaybeFetch(); + + features::LogPageProbabilitiesStudy(); + + MaybeServeAdNotificationsAtRegularIntervals(); } -void AdsImpl::PurgeExpiredAdEvents() { - AdEvents ad_events(this); - ad_events.PurgeExpired([]( +void AdsImpl::CleanupAdEvents() { + PurgeExpiredAdEvents([]( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to purge expired ad events"); @@ -484,6 +485,14 @@ void AdsImpl::PurgeExpiredAdEvents() { }); } +void AdsImpl::MaybeUpdateCatalog() { + if (!HasCatalogExpired()) { + return; + } + + ad_server_->MaybeFetch(); +} + void AdsImpl::MaybeServeAdNotification() { if (PlatformHelper::GetInstance()->IsMobile()) { return; @@ -497,53 +506,72 @@ void AdsImpl::MaybeServeAdNotificationsAtRegularIntervals() { return; } - if (is_foreground_ || ads_client_->CanShowBackgroundNotifications()) { + if (TabManager::Get()->IsForegrounded() || + AdsClientHelper::Get()->CanShowBackgroundNotifications()) { ad_notification_serving_->ServeAtRegularIntervals(); } else { ad_notification_serving_->StopServing(); } } -void AdsImpl::OnDidRedeemUnblindedToken( - const ConfirmationInfo& confirmation) { - BLOG(1, "Successfully redeemed unblinded token with confirmation id " - << confirmation.id << ", creative instance id " - << confirmation.creative_instance_id << " and " - << std::string(confirmation.type)); +void AdsImpl::OnAdRewardsChanged() { + AdsClientHelper::Get()->OnAdRewardsChanged(); } -void AdsImpl::OnFailedToRedeemUnblindedToken( - const ConfirmationInfo& confirmation) { - BLOG(1, "Failed to redeem unblinded token with confirmation id " - << confirmation.id << ", creative instance id " - << confirmation.creative_instance_id << " and " - << std::string(confirmation.type)); +void AdsImpl::OnTransactionsChanged() { + AdsClientHelper::Get()->OnAdRewardsChanged(); } -void AdsImpl::OnDidRedeemUnblindedPaymentTokens() { - BLOG(1, "Successfully redeemed unblinded payment tokens"); +void AdsImpl::OnAdNotificationViewed( + const AdNotificationInfo& ad) { + confirmations_->ConfirmAd(ad.creative_instance_id, ConfirmationType::kViewed); +} + +void AdsImpl::OnAdNotificationClicked( + const AdNotificationInfo& ad) { + ad_transfer_->set_last_clicked_ad(ad); + + confirmations_->ConfirmAd(ad.creative_instance_id, + ConfirmationType::kClicked); +} - ReconcileAdRewards(); +void AdsImpl::OnAdNotificationDismissed( + const AdNotificationInfo& ad) { + confirmations_->ConfirmAd(ad.creative_instance_id, + ConfirmationType::kDismissed); } -void AdsImpl::OnFailedToRedeemUnblindedPaymentTokens() { - BLOG(1, "Failed to redeem unblinded payment tokens"); +void AdsImpl::OnCatalogUpdated( + const CatalogIssuersInfo& catalog_issuers) { + confirmations_->SetCatalogIssuers(catalog_issuers); + + account_->TopUpUnblindedTokens(); } -void AdsImpl::OnDidRetryRedeemingUnblindedPaymentTokens() { - BLOG(1, "Retry redeeming unblinded payment tokens"); +void AdsImpl::OnAdTransfer( + const AdInfo& ad) { + confirmations_->ConfirmAd(ad.creative_instance_id, + ConfirmationType::kTransferred); } -void AdsImpl::OnDidRefillUnblindedTokens() { - BLOG(1, "Successfully refilled unblinded tokens"); +void AdsImpl::OnConversion( + const std::string& creative_instance_id) { + confirmations_->ConfirmAd(creative_instance_id, + ConfirmationType::kConversion); } -void AdsImpl::OnFailedToRefillUnblindedTokens() { - BLOG(1, "Failed to refill unblinded tokens"); +void AdsImpl::OnNewTabPageAdViewed( + const NewTabPageAdInfo& ad) { + confirmations_->ConfirmAd(ad.creative_instance_id, + ConfirmationType::kViewed); } -void AdsImpl::OnDidRetryRefillingUnblindedTokens() { - BLOG(1, "Retry refilling unblinded tokens"); +void AdsImpl::OnNewTabPageAdClicked( + const NewTabPageAdInfo& ad) { + ad_transfer_->set_last_clicked_ad(ad); + + confirmations_->ConfirmAd(ad.creative_instance_id, + ConfirmationType::kClicked); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.h b/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.h index f464e05a0343..b8b0c578c911 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/ads_impl.h @@ -12,16 +12,21 @@ #include #include "bat/ads/ads.h" -#include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_delegate.h" -#include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h" -#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens_delegate.h" +#include "bat/ads/internal/account/account_observer.h" +#include "bat/ads/internal/ad_server/ad_server_observer.h" +#include "bat/ads/internal/ad_transfer/ad_transfer_observer.h" +#include "bat/ads/internal/ads/ad_notifications/ad_notification_observer.h" +#include "bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_observer.h" +#include "bat/ads/internal/confirmations/confirmations_observer.h" +#include "bat/ads/internal/conversions/conversions_observer.h" #include "bat/ads/mojom.h" +#include "bat/ads/result.h" namespace ads { namespace ad_notifications { class AdServing; -} // namesapce ad_notifications +} // namespace ad_notifications namespace ad_targeting { @@ -43,38 +48,38 @@ namespace database { class Initialize; } // namespace database +class Account; class AdNotification; class AdNotificationServing; class AdNotifications; -class AdRewards; +class AdsClientHelper; class AdServer; -class AdsHistory; class AdTargeting; class AdTransfer; -class Bundle; class Client; -class ConfirmationType; class Confirmations; +class ConfirmationsState; class Conversions; class NewTabPageAd; -class RedeemUnblindedPaymentTokens; -class RedeemUnblindedToken; -class RefillUnblindedTokens; -class Tabs; +class TabManager; class UserActivity; -class Wallet; - +struct AdInfo; struct AdNotificationInfo; struct AdsHistoryInfo; +struct CatalogIssuersInfo; struct ConfirmationInfo; +struct NewTabPageAdInfo; class AdsImpl : public Ads, - public RedeemUnblindedPaymentTokensDelegate, - public RedeemUnblindedTokenDelegate, - public RefillUnblindedTokensDelegate { + public AccountObserver, + public AdNotificationObserver, + public AdServerObserver, + public AdTransferObserver, + public ConversionsObserver, + public NewTabPageAdObserver { public: - explicit AdsImpl( + AdsImpl( AdsClient* ads_client); ~AdsImpl() override; @@ -82,92 +87,8 @@ class AdsImpl AdsImpl(const AdsImpl&) = delete; AdsImpl& operator=(const AdsImpl&) = delete; - AdsClient* get_ads_client() const { - return ads_client_; - } - - AdNotifications* get_ad_notifications() const { - return ad_notifications_.get(); - } - - AdRewards* get_ad_rewards() const { - return ad_rewards_.get(); - } - - AdServer* get_ad_server() const { - return ad_server_.get(); - } - - AdTargeting* get_ad_targeting() const { - return ad_targeting_.get(); - } - - AdTransfer* get_ad_transfer() const { - return ad_transfer_.get(); - } - - AdsHistory* get_ads_history() const { - return ads_history_.get(); - } - - Bundle* get_bundle() const { - return bundle_.get(); - } - - Client* get_client() const { - return client_.get(); - } - - Confirmations* get_confirmations() const { - return confirmations_.get(); - } - - Conversions* get_conversions() const { - return conversions_.get(); - } - - ad_targeting::contextual::PageClassifier* get_page_classifier() const { - return page_classifier_.get(); - } - - ad_targeting::behavioral::PurchaseIntentClassifier* - get_purchase_intent_classifier() const { - return purchase_intent_classifier_.get(); - } - - RedeemUnblindedPaymentTokens* get_redeem_unblinded_payment_tokens() const { - return redeem_unblinded_payment_tokens_.get(); - } - - RedeemUnblindedToken* get_redeem_unblinded_token() const { - return redeem_unblinded_token_.get(); - } - - RefillUnblindedTokens* get_refill_unblinded_tokens() const { - return refill_unblinded_tokens_.get(); - } - - ad_targeting::geographic::SubdivisionTargeting* - get_subdivision_targeting() const { - return subdivision_targeting_.get(); - } - - Tabs* get_tabs() const { - return tabs_.get(); - } - - UserActivity* get_user_activity() const { - return user_activity_.get(); - } - - Wallet* get_wallet() const { - return wallet_.get(); - } - bool IsInitialized(); - bool IsForeground() const; - // Ads implementation void Initialize( InitializeCallback callback) override; @@ -208,15 +129,15 @@ class AdsImpl const int32_t tab_id) override; void OnWalletUpdated( - const std::string& payment_id, - const std::string& private_key) override; + const std::string& id, + const std::string& seed) override; void OnUserModelUpdated( const std::string& id) override; bool GetAdNotification( const std::string& uuid, - AdNotificationInfo* info) override; + AdNotificationInfo* ad_notification) override; void OnAdNotificationEvent( const std::string& uuid, const AdNotificationEventType event_type) override; @@ -264,6 +185,29 @@ class AdsImpl const bool flagged) override; private: + bool is_initialized_ = false; + + std::unique_ptr ads_client_helper_; + std::unique_ptr page_classifier_; + std::unique_ptr + purchase_intent_classifier_; + std::unique_ptr + subdivision_targeting_; + std::unique_ptr confirmations_; + std::unique_ptr account_; + std::unique_ptr ad_notification_; + std::unique_ptr ad_targeting_; + std::unique_ptr ad_notification_serving_; + std::unique_ptr ad_notifications_; + std::unique_ptr ad_server_; + std::unique_ptr ad_transfer_; + std::unique_ptr client_; + std::unique_ptr conversions_; + std::unique_ptr database_; + std::unique_ptr new_tab_page_ad_; + std::unique_ptr tab_manager_; + std::unique_ptr user_activity_; + void InitializeStep2( const Result result, InitializeCallback callback); @@ -280,60 +224,42 @@ class AdsImpl const Result result, InitializeCallback callback); - void PurgeExpiredAdEvents(); + void CleanupAdEvents(); - void MaybeServeAdNotification(); + void MaybeUpdateCatalog(); + void MaybeServeAdNotification(); void MaybeServeAdNotificationsAtRegularIntervals(); - bool is_initialized_ = false; - - bool is_foreground_ = false; - - AdsClient* ads_client_; // NOT OWNED - - std::unique_ptr ads_history_; - std::unique_ptr ad_notification_; - std::unique_ptr ad_notifications_; - std::unique_ptr ad_rewards_; - std::unique_ptr ad_server_; - std::unique_ptr ad_notification_serving_; - std::unique_ptr ad_targeting_; - std::unique_ptr ad_transfer_; - std::unique_ptr bundle_; - std::unique_ptr client_; - std::unique_ptr confirmations_; - std::unique_ptr conversions_; - std::unique_ptr database_; - std::unique_ptr new_tab_page_ad_; - std::unique_ptr - purchase_intent_classifier_; - std::unique_ptr page_classifier_; - std::unique_ptr - subdivision_targeting_; - std::unique_ptr - redeem_unblinded_payment_tokens_; - std::unique_ptr redeem_unblinded_token_; - std::unique_ptr refill_unblinded_tokens_; - std::unique_ptr tabs_; - std::unique_ptr user_activity_; - std::unique_ptr wallet_; - - // RedeemUnblindedTokenDelegate implementation - void OnDidRedeemUnblindedToken( - const ConfirmationInfo& confirmation) override; - void OnFailedToRedeemUnblindedToken( - const ConfirmationInfo& confirmation) override; - - // RedeemUnblindedPaymentTokensDelegate implementation - void OnDidRedeemUnblindedPaymentTokens() override; - void OnFailedToRedeemUnblindedPaymentTokens() override; - void OnDidRetryRedeemingUnblindedPaymentTokens() override; - - // RefillUnblindedTokensDelegate implementation - void OnDidRefillUnblindedTokens() override; - void OnFailedToRefillUnblindedTokens() override; - void OnDidRetryRefillingUnblindedTokens() override; + // AccountObserver implementation + void OnAdRewardsChanged() override; + void OnTransactionsChanged() override; + + // AdNotificationObserver implementation + void OnAdNotificationViewed( + const AdNotificationInfo& ad) override; + void OnAdNotificationClicked( + const AdNotificationInfo& ad) override; + void OnAdNotificationDismissed( + const AdNotificationInfo& ad) override; + + // AdServerObserver implementation + void OnCatalogUpdated( + const CatalogIssuersInfo& catalog_issuers) override; + + // AdTransferObserver implementation + void OnAdTransfer( + const AdInfo& ad) override; + + // ConversionsObserver implementation + void OnConversion( + const std::string& creative_instance_id) override; + + // NewTabPageAdObserver implementation + void OnNewTabPageAdViewed( + const NewTabPageAdInfo& ad) override; + void OnNewTabPageAdClicked( + const NewTabPageAdInfo& ad) override; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/backoff_timer.h b/vendor/bat-native-ads/src/bat/ads/internal/backoff_timer.h index e40e6958fe1a..5fa6a65c7c22 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/backoff_timer.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/backoff_timer.h @@ -11,8 +11,8 @@ #include #include "base/callback_forward.h" +#include "base/time/time.h" #include "base/timer/timer.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/timer.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.cc b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.cc index 88090dc2c9ae..d1af0a4aad49 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.cc @@ -7,11 +7,12 @@ #include #include +#include #include #include "base/strings/string_split.h" #include "base/strings/string_util.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/bundle/bundle_state.h" #include "bat/ads/internal/catalog/catalog.h" #include "bat/ads/internal/catalog/catalog_creative_set_info.h" @@ -24,239 +25,57 @@ #include "bat/ads/internal/database/tables/geo_targets_database_table.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/platform/platform_helper.h" +#include "bat/ads/result.h" namespace ads { -using std::placeholders::_1; +namespace { -Bundle::Bundle( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -Bundle::~Bundle() = default; - -bool Bundle::UpdateFromCatalog( - const Catalog& catalog) { - // TODO(Terry Mancey): Refactor function to use callbacks - - auto bundle_state = GenerateFromCatalog(catalog); - if (!bundle_state) { - return false; +bool DoesOsSupportCreativeSet( + const CatalogCreativeSetInfo& creative_set) { + if (creative_set.oses.empty()) { + // Creative set supports all OSes + return true; } - catalog_id_ = bundle_state->catalog_id; - catalog_version_ = bundle_state->catalog_version; - catalog_ping_ = bundle_state->catalog_ping; - catalog_last_updated_ = bundle_state->catalog_last_updated; - - // TODO(https://github.com/brave/brave-browser/issues/3661): Merge in diffs - // to Brave Ads catalog instead of rebuilding the database - DeleteCreativeAdNotifications(); - DeleteCreativeNewTabPageAds(); - DeleteCampaigns(); - DeleteCategories(); - DeleteCreativeAds(); - DeleteDayparts(); - DeleteGeoTargets(); - - SaveCreativeAdNotifications(bundle_state->creative_ad_notifications); - - SaveCreativeNewTabPageAds(bundle_state->creative_new_tab_page_ads); - - PurgeExpiredConversions(); - SaveConversions(bundle_state->conversions); - - return true; -} - -std::string Bundle::GetCatalogId() const { - return catalog_id_; -} - -uint64_t Bundle::GetCatalogVersion() const { - return catalog_version_; -} - -uint64_t Bundle::GetCatalogPing() const { - return catalog_ping_ / base::Time::kMillisecondsPerSecond; -} - -void Bundle::DeleteCreativeAdNotifications() { - database::table::CreativeAdNotifications database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete creative ad notifications state"); - return; - } - - BLOG(3, "Successfully deleted creative ad notifications state"); - }); -} - -void Bundle::DeleteCreativeNewTabPageAds() { - database::table::CreativeNewTabPageAds database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete creative new tab page ads state"); - return; - } - - BLOG(3, "Successfully deleted creative new tab page ads state"); - }); -} - -void Bundle::DeleteCampaigns() { - database::table::Campaigns database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete campaigns state"); - return; - } - - BLOG(3, "Successfully deleted campaigns state"); - }); -} - -void Bundle::DeleteCategories() { - database::table::Categories database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete categories state"); - return; - } - - BLOG(3, "Successfully deleted categories state"); - }); -} - -void Bundle::DeleteCreativeAds() { - database::table::CreativeAds database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete creative ads state"); - return; - } - - BLOG(3, "Successfully deleted creative ads state"); - }); -} - -void Bundle::DeleteDayparts() { - database::table::Dayparts database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete dayparts state"); - return; - } - - BLOG(3, "Successfully deleted dayparts state"); - }); -} - -void Bundle::DeleteGeoTargets() { - database::table::GeoTargets database_table(ads_); - database_table.Delete([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to delete geo targets state"); - return; - } - - BLOG(3, "Successfully deleted geo targets state"); - }); -} - -void Bundle::SaveCreativeAdNotifications( - const CreativeAdNotificationList& creative_ad_notifications) { - database::table::CreativeAdNotifications database_table(ads_); - - database_table.Save(creative_ad_notifications, []( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to save creative ad notifications state"); - return; - } - - BLOG(3, "Successfully saved creative ad notifications state"); - }); -} - -void Bundle::SaveCreativeNewTabPageAds( - const CreativeNewTabPageAdList& creative_new_tab_page_ads) { - database::table::CreativeNewTabPageAds database_table(ads_); + const std::string platform_name = + PlatformHelper::GetInstance()->GetPlatformName(); - database_table.Save(creative_new_tab_page_ads, []( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to save creative new tab page ads state"); - return; + for (const auto& os : creative_set.oses) { + if (os.name == platform_name) { + return true; } + } - BLOG(3, "Successfully saved creative new tab page ads state"); - }); + return false; } -void Bundle::PurgeExpiredConversions() { - database::table::Conversions database_table(ads_); - database_table.PurgeExpired([]( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to purge expired conversions"); - return; - } - - BLOG(3, "Successfully purged expired conversions"); - }); -} +} // namespace -void Bundle::SaveConversions( - const ConversionList& conversions) { - database::table::Conversions database_table(ads_); - database_table.Save(conversions, []( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to save conversions state"); - return; - } +Bundle::Bundle() = default; - BLOG(3, "Successfully saved conversions state"); - }); -} +Bundle::~Bundle() = default; -bool Bundle::IsOlderThanOneDay() const { - const base::Time now = base::Time::Now(); +void Bundle::BuildFromCatalog( + const Catalog& catalog) { + const BundleState bundle_state = FromCatalog(catalog); - if (now >= catalog_last_updated_ + base::TimeDelta::FromDays(1)) { - return true; - } + // TODO(https://github.com/brave/brave-browser/issues/3661): Merge in diffs + // to Brave Ads catalog instead of rebuilding the database + DeleteDatabaseTables(); - return false; -} + SaveCreativeAdNotifications(bundle_state.creative_ad_notifications); -bool Bundle::Exists() const { - if (GetCatalogVersion() == 0) { - return false; - } + SaveCreativeNewTabPageAds(bundle_state.creative_new_tab_page_ads); - return true; + PurgeExpiredConversions(); + SaveConversions(bundle_state.conversions); } /////////////////////////////////////////////////////////////////////////////// -// TODO(Terry Mancey): We should consider optimizing memory consumption when -// generating the bundle by saving each campaign individually on the Client -std::unique_ptr Bundle::GenerateFromCatalog( - const Catalog& catalog) { - // TODO(Terry Mancey): Refactor function to use callbacks - +BundleState Bundle::FromCatalog( + const Catalog& catalog) const { CreativeAdNotificationList creative_ad_notifications; CreativeNewTabPageAdList creative_new_tab_page_ads; ConversionList conversions; @@ -467,35 +286,170 @@ std::unique_ptr Bundle::GenerateFromCatalog( } } - auto state = std::make_unique(); - state->catalog_id = catalog.GetId(); - state->catalog_version = catalog.GetVersion(); - state->catalog_ping = catalog.GetPing(); - state->catalog_last_updated = base::Time::Now(); - state->creative_ad_notifications = creative_ad_notifications; - state->creative_new_tab_page_ads = creative_new_tab_page_ads; - state->conversions = conversions; + BundleState bundle_state; + bundle_state.creative_ad_notifications = creative_ad_notifications; + bundle_state.creative_new_tab_page_ads = creative_new_tab_page_ads; + bundle_state.conversions = conversions; - return state; + return bundle_state; } -bool Bundle::DoesOsSupportCreativeSet( - const CatalogCreativeSetInfo& creative_set) { - if (creative_set.oses.empty()) { - // Creative set supports all OSes - return true; - } +void Bundle::DeleteDatabaseTables() { + DeleteCreativeAdNotifications(); + DeleteCreativeNewTabPageAds(); + DeleteCampaigns(); + DeleteCategories(); + DeleteCreativeAds(); + DeleteDayparts(); + DeleteGeoTargets(); +} - const std::string platform_name = - PlatformHelper::GetInstance()->GetPlatformName(); +void Bundle::DeleteCreativeAdNotifications() { + database::table::CreativeAdNotifications database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete creative ad notifications state"); + return; + } - for (const auto& os : creative_set.oses) { - if (os.name == platform_name) { - return true; + BLOG(3, "Successfully deleted creative ad notifications state"); + }); +} + +void Bundle::DeleteCreativeNewTabPageAds() { + database::table::CreativeNewTabPageAds database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete creative new tab page ads state"); + return; } - } - return false; + BLOG(3, "Successfully deleted creative new tab page ads state"); + }); +} + +void Bundle::DeleteCampaigns() { + database::table::Campaigns database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete campaigns state"); + return; + } + + BLOG(3, "Successfully deleted campaigns state"); + }); +} + +void Bundle::DeleteCategories() { + database::table::Categories database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete categories state"); + return; + } + + BLOG(3, "Successfully deleted categories state"); + }); +} + +void Bundle::DeleteCreativeAds() { + database::table::CreativeAds database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete creative ads state"); + return; + } + + BLOG(3, "Successfully deleted creative ads state"); + }); +} + +void Bundle::DeleteDayparts() { + database::table::Dayparts database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete dayparts state"); + return; + } + + BLOG(3, "Successfully deleted dayparts state"); + }); +} + +void Bundle::DeleteGeoTargets() { + database::table::GeoTargets database_table; + database_table.Delete([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to delete geo targets state"); + return; + } + + BLOG(3, "Successfully deleted geo targets state"); + }); +} + +void Bundle::SaveCreativeAdNotifications( + const CreativeAdNotificationList& creative_ad_notifications) { + database::table::CreativeAdNotifications database_table; + + database_table.Save(creative_ad_notifications, []( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to save creative ad notifications state"); + return; + } + + BLOG(3, "Successfully saved creative ad notifications state"); + }); +} + +void Bundle::SaveCreativeNewTabPageAds( + const CreativeNewTabPageAdList& creative_new_tab_page_ads) { + database::table::CreativeNewTabPageAds database_table; + + database_table.Save(creative_new_tab_page_ads, []( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to save creative new tab page ads state"); + return; + } + + BLOG(3, "Successfully saved creative new tab page ads state"); + }); +} + +void Bundle::PurgeExpiredConversions() { + database::table::Conversions database_table; + database_table.PurgeExpired([]( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to purge expired conversions"); + return; + } + + BLOG(3, "Successfully purged expired conversions"); + }); +} + +void Bundle::SaveConversions( + const ConversionList& conversions) { + database::table::Conversions database_table; + database_table.Save(conversions, []( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to save conversions state"); + return; + } + + BLOG(3, "Successfully saved conversions state"); + }); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.h b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.h index 70b8658c71d2..902aee075761 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.h @@ -6,37 +6,29 @@ #ifndef BAT_ADS_INTERNAL_BUNDLE_BUNDLE_H_ #define BAT_ADS_INTERNAL_BUNDLE_BUNDLE_H_ -#include - -#include -#include - #include "bat/ads/internal/bundle/creative_ad_notification_info.h" #include "bat/ads/internal/bundle/creative_new_tab_page_ad_info.h" #include "bat/ads/internal/conversions/conversion_info.h" -#include "bat/ads/internal/time_util.h" -#include "bat/ads/result.h" namespace ads { -class AdsImpl; class Catalog; struct BundleState; -struct CatalogCreativeSetInfo; class Bundle { public: - explicit Bundle( - AdsImpl* ads); + Bundle(); ~Bundle(); - bool UpdateFromCatalog( + void BuildFromCatalog( const Catalog& catalog); - std::string GetCatalogId() const; - uint64_t GetCatalogVersion() const; - uint64_t GetCatalogPing() const; + private: + BundleState FromCatalog( + const Catalog& catalog) const; + + void DeleteDatabaseTables(); void DeleteCreativeAdNotifications(); void DeleteCreativeNewTabPageAds(); @@ -55,47 +47,6 @@ class Bundle { void PurgeExpiredConversions(); void SaveConversions( const ConversionList& conversions); - - bool IsOlderThanOneDay() const; - - bool Exists() const; - - private: - std::unique_ptr GenerateFromCatalog(const Catalog& catalog); - - bool DoesOsSupportCreativeSet( - const CatalogCreativeSetInfo& creative_set); - - void OnCreativeAdNotificationsDeleted( - const Result result); - void OnCreativeNewTabPageAdsDeleted( - const Result result); - void OnCampaignsDeleted( - const Result result); - void OnCategoriesDeleted( - const Result result); - void OnCreativeAdsDeleted( - const Result result); - void OnDaypartsDeleted( - const Result result); - void OnGeoTargetsDeleted( - const Result result); - void OnCreativeAdNotificationsSaved( - const Result result); - void OnCreativeNewTabPageAdsSaved( - const Result result); - - void OnPurgedExpiredConversions( - const Result result); - void OnConversionsSaved( - const Result result); - - std::string catalog_id_; - uint64_t catalog_version_ = 0; - uint64_t catalog_ping_ = 0; - base::Time catalog_last_updated_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle_state.h b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle_state.h index 1fd602917e1a..ee901f007cc9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle_state.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle_state.h @@ -6,14 +6,9 @@ #ifndef BAT_ADS_INTERNAL_BUNDLE_BUNDLE_STATE_H_ #define BAT_ADS_INTERNAL_BUNDLE_BUNDLE_STATE_H_ -#include - -#include - #include "bat/ads/internal/bundle/creative_ad_notification_info.h" #include "bat/ads/internal/bundle/creative_new_tab_page_ad_info.h" #include "bat/ads/internal/conversions/conversion_info.h" -#include "bat/ads/internal/time_util.h" namespace ads { @@ -23,10 +18,6 @@ struct BundleState { const BundleState& state); ~BundleState(); - std::string catalog_id; - uint64_t catalog_version = 0; - uint64_t catalog_ping = 0; - base::Time catalog_last_updated; CreativeAdNotificationList creative_ad_notifications; CreativeNewTabPageAdList creative_new_tab_page_ads; ConversionList conversions; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/bundle/creative_daypart_info.h b/vendor/bat-native-ads/src/bat/ads/internal/bundle/creative_daypart_info.h index c263661a941f..bfb7f0555bf4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/bundle/creative_daypart_info.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/bundle/creative_daypart_info.h @@ -9,7 +9,7 @@ #include #include -#include "bat/ads/internal/time_util.h" +#include "base/time/time.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.cc b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.cc index ae5a1c32e775..20928ed51305 100755 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.cc @@ -5,6 +5,8 @@ #include "bat/ads/internal/catalog/catalog.h" +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/catalog/catalog_issuers_info.h" #include "bat/ads/internal/catalog/catalog_state.h" @@ -13,40 +15,32 @@ namespace ads { -namespace { -const char kCatalogFilename[] = "catalog.json"; -} // namespace - -Catalog::Catalog( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); +Catalog::Catalog() + : catalog_state_(std::make_unique()) { } Catalog::~Catalog() = default; bool Catalog::FromJson( const std::string& json) { - auto catalog_state = std::make_unique(); auto json_schema = - ads_->get_ads_client()->LoadResourceForId(_catalog_schema_resource_id); - auto result = LoadFromJson(catalog_state.get(), json, json_schema); + AdsClientHelper::Get()->LoadResourceForId(_catalog_schema_resource_id); + auto result = LoadFromJson(catalog_state_.get(), json, json_schema); if (result != SUCCESS) { return false; } - catalog_state_.reset(catalog_state.release()); - return true; } -bool Catalog::HasChanged(const std::string& current_catalog_id) { - if (current_catalog_id.empty()) { +bool Catalog::HasChanged( + const std::string& catalog_id) const { + if (catalog_id.empty()) { // First time the catalog has been downloaded, so does not match return true; } - if (current_catalog_id != catalog_state_->catalog_id) { + if (catalog_id != catalog_state_->catalog_id) { return true; } @@ -57,12 +51,12 @@ std::string Catalog::GetId() const { return catalog_state_->catalog_id; } -uint64_t Catalog::GetVersion() const { +int Catalog::GetVersion() const { return catalog_state_->version; } -uint64_t Catalog::GetPing() const { - return catalog_state_->ping; +int64_t Catalog::GetPing() const { + return catalog_state_->ping / base::Time::kMillisecondsPerSecond; } CatalogCampaignList Catalog::GetCampaigns() const { @@ -73,14 +67,4 @@ CatalogIssuersInfo Catalog::GetIssuers() const { return catalog_state_->catalog_issuers; } -void Catalog::Save( - const std::string& json, - ResultCallback callback) { - ads_->get_ads_client()->Save(kCatalogFilename, json, callback); -} - -const std::string& Catalog::get_last_message() const { - return last_message_; -} - } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.h b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.h index f5a1871d69ee..bd6a5b37aaa3 100755 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog.h @@ -11,19 +11,16 @@ #include #include -#include "bat/ads/ads_client.h" #include "bat/ads/internal/catalog/catalog_campaign_info.h" namespace ads { -class AdsImpl; struct CatalogState; struct CatalogIssuersInfo; class Catalog { public: - explicit Catalog( - AdsImpl* ads); + Catalog(); ~Catalog(); @@ -31,26 +28,16 @@ class Catalog { const std::string& json); bool HasChanged( - const std::string& current_catalog_id); + const std::string& catalog_id) const; std::string GetId() const; - uint64_t GetVersion() const; - uint64_t GetPing() const; + int GetVersion() const; + int64_t GetPing() const; CatalogCampaignList GetCampaigns() const; CatalogIssuersInfo GetIssuers() const; - void Save( - const std::string& json, - ResultCallback callback); - - const std::string& get_last_message() const; - private: - AdsImpl* ads_; // NOT OWNED - std::unique_ptr catalog_state_; - - std::string last_message_; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_daypart_info.h b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_daypart_info.h index 4a33a47f9c33..717a2650c1d1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_daypart_info.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_daypart_info.h @@ -9,7 +9,7 @@ #include #include -#include "bat/ads/internal/time_util.h" +#include "base/time/time.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.cc b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.cc index accd8f203f9e..511f117604a9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.cc @@ -117,7 +117,7 @@ bool CatalogIssuersInfo::PublicKeyExists( return true; } -double CatalogIssuersInfo::GetEstimatedRedemptionValue( +base::Optional CatalogIssuersInfo::GetEstimatedRedemptionValue( const std::string& public_key) const { const auto iter = std::find_if(issuers.begin(), issuers.end(), [&public_key](const auto& issuer) { @@ -125,23 +125,26 @@ double CatalogIssuersInfo::GetEstimatedRedemptionValue( }); if (iter == issuers.end()) { - return 0.0; + return base::nullopt; } const CatalogIssuerInfo catalog_issuer = *iter; + std::string name = catalog_issuer.name; if (!re2::RE2::Replace(&name, "BAT", "")) { - BLOG(1, "Failed to estimate redemption value due to invalid catalog " + BLOG(1, "Failed to get estimated redemption value due to invalid catalog " "issuer name"); - return 0.0; + + return base::nullopt; } double estimated_redemption_value; if (!base::StringToDouble(name, &estimated_redemption_value)) { - BLOG(1, "Failed to estimate redemption value due to invalid catalog " + BLOG(1, "Failed to get estimated redemption value due to invalid catalog " "issuer name"); - return 0.0; + + return base::nullopt; } return estimated_redemption_value; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.h b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.h index b5c0a8d83663..445ac27b0d75 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_issuers_info.h @@ -8,6 +8,7 @@ #include +#include "base/optional.h" #include "base/values.h" #include "bat/ads/internal/catalog/catalog_issuer_info.h" @@ -29,7 +30,7 @@ struct CatalogIssuersInfo { bool PublicKeyExists( const std::string& public_key) const; - double GetEstimatedRedemptionValue( + base::Optional GetEstimatedRedemptionValue( const std::string& public_key) const; std::string public_key; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.cc b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.cc index 9acd212173cb..718ec045b107 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.cc @@ -5,6 +5,7 @@ #include "bat/ads/internal/catalog/catalog_state.h" +#include "base/time/time.h" #include "url/gurl.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/json_helper.h" @@ -12,7 +13,7 @@ namespace ads { namespace { -const uint64_t kDefaultCatalogPing = 2 * base::Time::kSecondsPerHour; +const int64_t kDefaultCatalogPing = 2 * base::Time::kSecondsPerHour; } // namespace CatalogState::CatalogState() = default; @@ -35,19 +36,19 @@ Result CatalogState::FromJson( } std::string new_catalog_id; - uint64_t new_version = 0; - uint64_t new_ping = kDefaultCatalogPing * base::Time::kMillisecondsPerSecond; + int new_version = 0; + int64_t new_ping = kDefaultCatalogPing * base::Time::kMillisecondsPerSecond; CatalogCampaignList new_campaigns; CatalogIssuersInfo new_catalog_issuers; new_catalog_id = document["catalogId"].GetString(); - new_version = document["version"].GetUint64(); + new_version = document["version"].GetInt(); if (new_version != 5) { return FAILED; } - new_ping = document["ping"].GetUint64(); + new_ping = document["ping"].GetInt64(); // Campaigns for (const auto& campaign : document["campaigns"].GetArray()) { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.h b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.h index 121cadee6a6f..c7de780df27c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.h @@ -27,8 +27,8 @@ struct CatalogState { const std::string& json_schema); std::string catalog_id; - uint64_t version = 0; - uint64_t ping = 0; + int version = 0; + int64_t ping = 0; CatalogCampaignList campaigns; CatalogIssuersInfo catalog_issuers; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.cc new file mode 100755 index 000000000000..c191b8491e3f --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.cc @@ -0,0 +1,39 @@ +/* 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/catalog/catalog_util.h" + +#include + +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/pref_names.h" + +namespace ads { + +namespace { +const int kCatalogLifespanInDays = 1; +} + +bool DoesCatalogExist() { + return AdsClientHelper::Get()->GetIntegerPref(prefs::kCatalogVersion) > 0; +} + +bool HasCatalogExpired() { + const base::Time now = base::Time::Now(); + + const int64_t catalog_last_updated = + AdsClientHelper::Get()->GetInt64Pref(prefs::kCatalogLastUpdated); + + const base::Time time = base::Time::FromDoubleT(catalog_last_updated); + + if (now < time + base::TimeDelta::FromDays(kCatalogLifespanInDays)) { + return false; + } + + return true; +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.h b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.h new file mode 100755 index 000000000000..99b1a4f26ff2 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_util.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 BAT_ADS_INTERNAL_CATALOG_CATALOG_UTIL_H_ +#define BAT_ADS_INTERNAL_CATALOG_CATALOG_UTIL_H_ + +#include "base/time/time.h" + +namespace ads { + +bool DoesCatalogExist(); + +bool HasCatalogExpired(); + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_CATALOG_CATALOG_UTIL_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/client/client.cc b/vendor/bat-native-ads/src/bat/ads/internal/client/client.cc index 3bec8526a8b6..73c5c78f1f5c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/client/client.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/client/client.cc @@ -12,18 +12,17 @@ #include "bat/ads/ad_history_info.h" #include "bat/ads/category_content_info.h" #include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/features.h" +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/internal/features/features.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/json_helper.h" namespace ads { -using std::placeholders::_1; -using std::placeholders::_2; - namespace { +Client* g_client = nullptr; + const char kClientFilename[] = "client.json"; // Maximum entries based upon 7 days of history for 20 ads per day, 3 @@ -57,15 +56,27 @@ FilteredCategoryList::iterator FindFilteredCategory( } // namespace -Client::Client( - AdsImpl* ads) - : is_initialized_(false), - ads_(ads), - client_(new ClientInfo()) { - (void)ads_; +Client::Client() + : client_(new ClientInfo()) { + DCHECK_EQ(g_client, nullptr); + g_client = this; +} + +Client::~Client() { + DCHECK(g_client); + g_client = nullptr; } -Client::~Client() = default; +// static +Client* Client::Get() { + DCHECK(g_client); + return g_client; +} + +// static +bool Client::HasInstance() { + return g_client; +} FilteredAdList Client::get_filtered_ads() const { return client_->ad_preferences.filtered_ads; @@ -447,8 +458,8 @@ void Client::Save() { BLOG(9, "Saving client state"); auto json = client_->ToJson(); - auto callback = std::bind(&Client::OnSaved, this, _1); - ads_->get_ads_client()->Save(kClientFilename, json, callback); + auto callback = std::bind(&Client::OnSaved, this, std::placeholders::_1); + AdsClientHelper::Get()->Save(kClientFilename, json, callback); } void Client::OnSaved( @@ -465,8 +476,9 @@ void Client::OnSaved( void Client::Load() { BLOG(3, "Loading client state"); - auto callback = std::bind(&Client::OnLoaded, this, _1, _2); - ads_->get_ads_client()->Load(kClientFilename, callback); + auto callback = std::bind(&Client::OnLoaded, this, std::placeholders::_1, + std::placeholders::_2); + AdsClientHelper::Get()->Load(kClientFilename, callback); } void Client::OnLoaded( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/client/client.h b/vendor/bat-native-ads/src/bat/ads/internal/client/client.h index 34ba377f22b0..3a45e8e158cc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/client/client.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/client/client.h @@ -13,6 +13,7 @@ #include #include +#include "base/time/time.h" #include "bat/ads/ads.h" #include "bat/ads/internal/ad_targeting/behavioral/purchase_intent_classifier/purchase_intent_signal_history_info.h" #include "bat/ads/internal/ad_targeting/contextual/page_classifier/page_classifier.h" @@ -26,18 +27,20 @@ namespace ads { -class AdsImpl; struct AdContentInfo; struct AdHistoryInfo; struct CategoryContentInfo; class Client { public: - explicit Client( - AdsImpl* ads); + Client(); ~Client(); + static Client* Get(); + + static bool HasInstance(); + void Initialize( InitializeCallback callback); @@ -105,7 +108,7 @@ class Client { void RemoveAllHistory(); private: - bool is_initialized_; + bool is_initialized_ = false; InitializeCallback callback_; @@ -117,8 +120,6 @@ class Client { bool FromJson(const std::string& json); - AdsImpl* ads_; // NOT OWNED - std::unique_ptr client_; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/client/client_info.cc b/vendor/bat-native-ads/src/bat/ads/internal/client/client_info.cc index 24cc4de13b5b..61d30bdaa06b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/client/client_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/client/client_info.cc @@ -5,8 +5,8 @@ #include "bat/ads/internal/client/client_info.h" +#include "base/time/time.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/json_helper.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.cc b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.cc index 06bd795ab7bb..0efae546857b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.cc @@ -9,42 +9,44 @@ #include -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" +#include "bat/ads/internal/catalog/catalog_issuers_info.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" +#include "bat/ads/internal/time_formatting_util.h" +#include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h" namespace ads { -using std::placeholders::_1; -using std::placeholders::_2; - namespace { - -const char kConfirmationsFilename[] = "confirmations.json"; - -const uint64_t kRetryAfterSeconds = 5 * base::Time::kSecondsPerMinute; - +const int64_t kRetryAfterSeconds = 5 * base::Time::kSecondsPerMinute; } // namespace -Confirmations::Confirmations( - AdsImpl* ads) - : ads_(ads), - state_(std::make_unique(ads_)) { - DCHECK(ads_); +Confirmations::Confirmations() + : confirmations_state_(std::make_unique()), + redeem_unblinded_token_(std::make_unique()) { + redeem_unblinded_token_->set_delegate(this); } -Confirmations::~Confirmations() = default; +Confirmations::~Confirmations() { + redeem_unblinded_token_->set_delegate(nullptr); +} -void Confirmations::Initialize( - InitializeCallback callback) { - callback_ = callback; +void Confirmations::set_ad_rewards( + AdRewards* ad_rewards) { + ConfirmationsState::Get()->set_ad_rewards(ad_rewards); +} - Load(); +void Confirmations::AddObserver( + ConfirmationsObserver* observer) { + observers_.AddObserver(observer); } -CatalogIssuersInfo Confirmations::GetCatalogIssuers() const { - return state_->get_catalog_issuers(); +void Confirmations::RemoveObserver( + ConfirmationsObserver* observer) { + observers_.RemoveObserver(observer); } void Confirmations::SetCatalogIssuers( @@ -59,184 +61,195 @@ void Confirmations::SetCatalogIssuers( } const CatalogIssuersInfo current_catalog_issuers = - state_->get_catalog_issuers(); + ConfirmationsState::Get()->get_catalog_issuers(); const bool public_key_was_rotated = !current_catalog_issuers.public_key.empty() && current_catalog_issuers.public_key != catalog_issuers.public_key; - state_->set_catalog_issuers(catalog_issuers); + ConfirmationsState::Get()->set_catalog_issuers(catalog_issuers); if (public_key_was_rotated) { - state_->get_unblinded_tokens()->RemoveAllTokens(); + ConfirmationsState::Get()->get_unblinded_tokens()->RemoveAllTokens(); } - Save(); -} - -base::Time Confirmations::get_next_token_redemption_date() const { - return state_->get_next_token_redemption_date(); -} - -void Confirmations::set_next_token_redemption_date( - const base::Time& next_token_redemption_date) { - state_->set_next_token_redemption_date(next_token_redemption_date); - Save(); + ConfirmationsState::Get()->Save(); } void Confirmations::ConfirmAd( const std::string& creative_instance_id, - const ConfirmationType confirmation_type) { - BLOG(1, "Confirming " << std::string(confirmation_type) << " ad for " - "creative instance id " << creative_instance_id); + const ConfirmationType& confirmation_type) { + BLOG(1, "Confirming " << std::string(confirmation_type) + << " ad for creative instance id " << creative_instance_id); + + if (ConfirmationsState::Get()->get_unblinded_tokens()->IsEmpty()) { + BLOG(1, "There are no unblinded tokens"); + + BLOG(3, "Failed to confirm ad with creative instance id " + << creative_instance_id); + + return; + } + + const privacy::UnblindedTokenInfo unblinded_token + = ConfirmationsState::Get()->get_unblinded_tokens()->GetToken(); + + ConfirmationsState::Get()->get_unblinded_tokens()->RemoveToken( + unblinded_token); + ConfirmationsState::Get()->Save(); - ads_->get_redeem_unblinded_token()->Redeem( - creative_instance_id, confirmation_type); + redeem_unblinded_token_->Redeem(creative_instance_id, + confirmation_type, unblinded_token); } -void Confirmations::RetryFailedConfirmationsAfterDelay() { - if (failed_confirmations_timer_.IsRunning()) { +void Confirmations::RetryAfterDelay() { + if (retry_timer_.IsRunning()) { return; } - const base::Time time = failed_confirmations_timer_.StartWithPrivacy( + const base::Time time = retry_timer_.StartWithPrivacy( base::TimeDelta::FromSeconds(kRetryAfterSeconds), - base::BindOnce(&Confirmations::RetryFailedConfirmations, - base::Unretained(this))); + base::BindOnce(&Confirmations::Retry, base::Unretained(this))); BLOG(1, "Retry failed confirmations " << FriendlyDateAndTime(time)); } -TransactionList Confirmations::get_transactions() const { - return state_->get_transactions(); -} +/////////////////////////////////////////////////////////////////////////////// -void Confirmations::AppendTransaction( - const double estimated_redemption_value, - const ConfirmationType confirmation_type) { - TransactionInfo transaction; +void Confirmations::CreateNewConfirmationAndAppendToRetryQueue( + const ConfirmationInfo& confirmation) { + if (ConfirmationsState::Get()->get_unblinded_tokens()->IsEmpty()) { + AppendToRetryQueue(confirmation); + return; + } - transaction.timestamp = static_cast(base::Time::Now().ToDoubleT()); - transaction.estimated_redemption_value = estimated_redemption_value; - transaction.confirmation_type = std::string(confirmation_type); + const privacy::UnblindedTokenInfo unblinded_token = + ConfirmationsState::Get()->get_unblinded_tokens()->GetToken(); - state_->append_transaction(transaction); - Save(); + ConfirmationsState::Get()->get_unblinded_tokens()->RemoveToken( + unblinded_token); + ConfirmationsState::Get()->Save(); - ads_->get_ads_client()->OnAdRewardsChanged(); + const ConfirmationInfo new_confirmation = CreateConfirmationInfo( + confirmation.creative_instance_id, confirmation.type, unblinded_token); + + AppendToRetryQueue(new_confirmation); } -void Confirmations::AppendConfirmationToRetryQueue( +void Confirmations::AppendToRetryQueue( const ConfirmationInfo& confirmation) { - state_->append_confirmation(confirmation); - Save(); + ConfirmationsState::Get()->append_failed_confirmation(confirmation); + ConfirmationsState::Get()->Save(); BLOG(1, "Added confirmation id " << confirmation.id << ", creative instance " "id " << confirmation.creative_instance_id << " and " << std::string(confirmation.type) << " to the confirmations queue"); - - RetryFailedConfirmationsAfterDelay(); -} - -privacy::UnblindedTokens* Confirmations::get_unblinded_tokens() { - return state_->get_unblinded_tokens(); } -privacy::UnblindedTokens* Confirmations::get_unblinded_payment_tokens() { - return state_->get_unblinded_payment_tokens(); -} +void Confirmations::RemoveFromRetryQueue( + const ConfirmationInfo& confirmation) { + if (!ConfirmationsState::Get()->remove_failed_confirmation(confirmation)) { + BLOG(0, "Failed to remove confirmation id " << confirmation.id + << ", creative instance id " << confirmation.creative_instance_id + << " and " << std::string(confirmation.type) + << " from the confirmations queue"); -void Confirmations::Save() { - if (!is_initialized_) { return; } - BLOG(9, "Saving confirmations state"); + BLOG(1, "Removed confirmation id " << confirmation.id << ", creative " + "instance id " << confirmation.creative_instance_id << " and " + << std::string(confirmation.type) << " from the confirmations queue"); - const std::string json = state_->ToJson(); - auto callback = std::bind(&Confirmations::OnSaved, this, _1); - ads_->get_ads_client()->Save(kConfirmationsFilename, json, callback); + ConfirmationsState::Get()->Save(); } -/////////////////////////////////////////////////////////////////////////////// - -void Confirmations::RetryFailedConfirmations() { - ConfirmationList confirmations = state_->get_confirmations(); - if (confirmations.empty()) { +void Confirmations::Retry() { + ConfirmationList failed_confirmations = + ConfirmationsState::Get()->get_failed_confirmations(); + if (failed_confirmations.empty()) { BLOG(1, "No failed confirmations to retry"); return; } - ConfirmationInfo confirmation(confirmations.front()); - RemoveConfirmationFromRetryQueue(confirmation); + ConfirmationInfo confirmation = failed_confirmations.front(); + RemoveFromRetryQueue(confirmation); - ads_->get_redeem_unblinded_token()->Redeem(confirmation); + redeem_unblinded_token_->Redeem(confirmation); - RetryFailedConfirmationsAfterDelay(); + RetryAfterDelay(); } -void Confirmations::RemoveConfirmationFromRetryQueue( - const ConfirmationInfo& confirmation) { - if (!state_->remove_confirmation(confirmation)) { - BLOG(0, "Failed to remove confirmation id " << confirmation.id - << ", creative instance id " << confirmation.creative_instance_id - << " and " << std::string(confirmation.type) << " from " - "the confirmations queue"); - +void Confirmations::OnDidRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const privacy::UnblindedTokenInfo& unblinded_payment_token) { + if (ConfirmationsState::Get()->get_unblinded_payment_tokens()-> + TokenExists(unblinded_payment_token)) { + BLOG(1, "Unblinded payment token is a duplicate"); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ false); return; } - BLOG(1, "Removed confirmation id " << confirmation.id << ", creative " - "instance id " << confirmation.creative_instance_id << " and " << - std::string(confirmation.type) << " from the confirmations queue"); + BLOG(1, "Successfully redeemed unblinded token with confirmation id " + << confirmation.id << ", creative instance id " + << confirmation.creative_instance_id << " and " + << std::string(confirmation.type)); - Save(); -} + ConfirmationsState::Get()->get_unblinded_payment_tokens()->AddTokens( + {unblinded_payment_token}); + ConfirmationsState::Get()->Save(); -void Confirmations::OnSaved( - const Result result) { - if (result != SUCCESS) { - BLOG(0, "Failed to save confirmations state"); + const CatalogIssuersInfo catalog_issuers; + const base::Optional estimated_redemption_value = + catalog_issuers.GetEstimatedRedemptionValue( + unblinded_payment_token.public_key.encode_base64()); + if (!estimated_redemption_value) { + BLOG(1, "Invalid estimated redemption value"); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ false); return; } - BLOG(9, "Successfully saved confirmations state"); -} - -void Confirmations::Load() { - BLOG(3, "Loading confirmations state"); + BLOG(1, "Added 1 unblinded payment token with an estimated redemption value " + "of " << *estimated_redemption_value << " BAT, you now have " + << ConfirmationsState::Get()->get_unblinded_payment_tokens()->Count() + << " unblinded payment tokens"); - auto callback = std::bind(&Confirmations::OnLoaded, this, _1, _2); - ads_->get_ads_client()->Load(kConfirmationsFilename, callback); + NotifyConfirmAd(*estimated_redemption_value, confirmation); } -void Confirmations::OnLoaded( - const Result result, - const std::string& json) { - if (result != SUCCESS) { - BLOG(3, "Confirmations state does not exist, creating default state"); - - is_initialized_ = true; +void Confirmations::OnFailedToRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const bool should_retry) { + BLOG(1, "Failed to redeem unblinded token with confirmation id " + << confirmation.id << ", creative instance id " + << confirmation.creative_instance_id << " and " + << std::string(confirmation.type)); - state_.reset(new ConfirmationsState(ads_)); - Save(); - } else { - if (!state_->FromJson(json)) { - BLOG(0, "Failed to load confirmations state"); - - BLOG(3, "Failed to parse confirmations state: " << json); - - callback_(FAILED); - return; + if (should_retry) { + if (!confirmation.created) { + CreateNewConfirmationAndAppendToRetryQueue(confirmation); + } else { + AppendToRetryQueue(confirmation); } + } - BLOG(3, "Successfully loaded confirmations state"); + NotifyConfirmAdFailed(confirmation); +} - is_initialized_ = true; +void Confirmations::NotifyConfirmAd( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation) { + for (ConfirmationsObserver& observer : observers_) { + observer.OnConfirmAd(estimated_redemption_value, confirmation); } +} - callback_(SUCCESS); +void Confirmations::NotifyConfirmAdFailed( + const ConfirmationInfo& confirmation) { + for (ConfirmationsObserver& observer : observers_) { + observer.OnConfirmAdFailed(confirmation); + } } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.h b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.h index dfae4e19aeda..4352cbc0095a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations.h @@ -10,79 +10,75 @@ #include #include "bat/ads/ads.h" -#include "bat/ads/internal/catalog/catalog_issuers_info.h" -#include "bat/ads/internal/confirmations/confirmations_state.h" +#include "bat/ads/internal/confirmations/confirmations_observer.h" #include "bat/ads/internal/timer.h" +#include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h" #include "bat/ads/result.h" namespace ads { -class AdsImpl; +class AdRewards; +class ConfirmationsState; +class RedeemUnblindedToken; +struct CatalogIssuersInfo; +struct UnblindedTokenInfo; -namespace privacy { -class UnblindedTokens; -} // namespace privacy - -class Confirmations { +class Confirmations + : public RedeemUnblindedTokenDelegate { public: - Confirmations( - AdsImpl* ads); + Confirmations(); + + ~Confirmations() override; - ~Confirmations(); + // TODO(https://github.com/brave/brave-browser/issues/12563): Decouple Brave + // Ads rewards state from confirmations + void set_ad_rewards( + AdRewards* ad_rewards); - void Initialize( - InitializeCallback callback); + void AddObserver( + ConfirmationsObserver* observer); + void RemoveObserver( + ConfirmationsObserver* observer); - CatalogIssuersInfo GetCatalogIssuers() const; void SetCatalogIssuers( const CatalogIssuersInfo& catalog_issuers); - base::Time get_next_token_redemption_date() const; - void set_next_token_redemption_date( - const base::Time& next_token_redemption_date); - void ConfirmAd( const std::string& creative_instance_id, - const ConfirmationType confirmation_type); - - void RetryFailedConfirmationsAfterDelay(); - - TransactionList get_transactions() const; - - void AppendTransaction( - const double estimated_redemption_value, - const ConfirmationType confirmation_type); - - void AppendConfirmationToRetryQueue( - const ConfirmationInfo& confirmation); - - privacy::UnblindedTokens* get_unblinded_tokens(); + const ConfirmationType& confirmation_type); - privacy::UnblindedTokens* get_unblinded_payment_tokens(); - - void Save(); + void RetryAfterDelay(); private: - bool is_initialized_ = false; + base::ObserverList observers_; - InitializeCallback callback_; + std::unique_ptr confirmations_state_; + std::unique_ptr redeem_unblinded_token_; - Timer failed_confirmations_timer_; - void RetryFailedConfirmations(); - void RemoveConfirmationFromRetryQueue( + Timer retry_timer_; + void CreateNewConfirmationAndAppendToRetryQueue( + const ConfirmationInfo& confirmation); + void AppendToRetryQueue( const ConfirmationInfo& confirmation); + void RemoveFromRetryQueue( + const ConfirmationInfo& confirmation); + void Retry(); - void OnSaved( - const Result result); + void NotifyConfirmAd( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation); - void Load(); - void OnLoaded( - const Result result, - const std::string& json); + void NotifyConfirmAdFailed( + const ConfirmationInfo& confirmation); - AdsImpl* ads_; // NOT OWNED + // RedeemUnblindedTokenDelegate implementation + void OnDidRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const privacy::UnblindedTokenInfo& unblinded_payment_token) override; - std::unique_ptr state_; + void OnFailedToRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const bool should_retry) override; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_observer.h new file mode 100644 index 000000000000..a4d1d44eb98f --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_observer.h @@ -0,0 +1,32 @@ +/* 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 BAT_ADS_INTERNAL_CONFIRMATIONS_CONFIRMATIONS_OBSERVER_H_ +#define BAT_ADS_INTERNAL_CONFIRMATIONS_CONFIRMATIONS_OBSERVER_H_ + +#include "base/observer_list.h" + +namespace ads { + +struct ConfirmationInfo; + +class ConfirmationsObserver : public base::CheckedObserver { + public: + // Invoked when an ad confirmation is successful + virtual void OnConfirmAd( + const double estimated_redemption_value, + const ConfirmationInfo& confirmation) {} + + // Invoked when an ad confirmation fails + virtual void OnConfirmAdFailed( + const ConfirmationInfo& confirmation) {} + + protected: + ~ConfirmationsObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_CONFIRMATIONS_CONFIRMATIONS_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.cc b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.cc index eb975a75c9a1..c41625d87f06 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.cc @@ -13,27 +13,185 @@ #include "base/json/json_writer.h" #include "base/strings/string_number_conversions.h" #include "wrapper.hpp" -#include "bat/ads/internal/ad_rewards/ad_rewards.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/account/ad_rewards/ad_rewards.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/legacy_migration/legacy_migration_util.h" namespace ads { using challenge_bypass_ristretto::PublicKey; using challenge_bypass_ristretto::UnblindedToken; -ConfirmationsState::ConfirmationsState( - AdsImpl* ads) - : ads_(ads), - unblinded_tokens_(std::make_unique(ads_)), - unblinded_payment_tokens_(std::make_unique< - privacy::UnblindedTokens>(ads_)) { - DCHECK(ads_); +namespace { + +ConfirmationsState* g_confirmations_state = nullptr; + +const char kConfirmationsFilename[] = "confirmations.json"; + +} // namespace + +ConfirmationsState::ConfirmationsState() + : unblinded_tokens_(std::make_unique()), + unblinded_payment_tokens_(std::make_unique()) { + DCHECK_EQ(g_confirmations_state, nullptr); + g_confirmations_state = this; +} + +ConfirmationsState::~ConfirmationsState() { + DCHECK(g_confirmations_state); + g_confirmations_state = nullptr; +} + +// static +ConfirmationsState* ConfirmationsState::Get() { + DCHECK(g_confirmations_state); + return g_confirmations_state; +} + +// static +bool ConfirmationsState::HasInstance() { + return g_confirmations_state; +} + +void ConfirmationsState::set_ad_rewards( + AdRewards* ad_rewards) { + DCHECK(ad_rewards); + ad_rewards_ = ad_rewards; +} + +void ConfirmationsState::Initialize( + InitializeCallback callback) { + callback_ = callback; + + Load(); +} + +void ConfirmationsState::Load() { + BLOG(3, "Loading confirmations state"); + + AdsClientHelper::Get()->Load(kConfirmationsFilename, [=]( + const Result result, + const std::string& json) { + if (result != SUCCESS) { + BLOG(3, "Confirmations state does not exist, creating default state"); + + is_initialized_ = true; + + Save(); + } else { + if (!FromJson(json)) { + BLOG(0, "Failed to load confirmations state"); + + BLOG(3, "Failed to parse confirmations state: " << json); + + callback_(FAILED); + return; + } + + BLOG(3, "Successfully loaded confirmations state"); + + is_initialized_ = true; + } + + callback_(SUCCESS); + }); +} + +void ConfirmationsState::Save() { + if (!is_initialized_) { + return; + } + + BLOG(9, "Saving confirmations state"); + + const std::string json = ToJson(); + AdsClientHelper::Get()->Save(kConfirmationsFilename, json, []( + const Result result) { + if (result != SUCCESS) { + BLOG(0, "Failed to save confirmations state"); + return; + } + + BLOG(9, "Successfully saved confirmations state"); + }); +} + +CatalogIssuersInfo ConfirmationsState::get_catalog_issuers() const { + return catalog_issuers_; +} + +void ConfirmationsState::set_catalog_issuers( + const CatalogIssuersInfo& catalog_issuers) { + DCHECK(is_initialized_); + catalog_issuers_ = catalog_issuers; +} + +ConfirmationList ConfirmationsState::get_failed_confirmations() const { + DCHECK(is_initialized_); + return failed_confirmations_; +} + +void ConfirmationsState::append_failed_confirmation( + const ConfirmationInfo& confirmation) { + DCHECK(is_initialized_); + failed_confirmations_.push_back(confirmation); +} + +bool ConfirmationsState::remove_failed_confirmation( + const ConfirmationInfo& confirmation) { + DCHECK(is_initialized_); + + const auto iter = std::find_if(failed_confirmations_.begin(), + failed_confirmations_.end(), + [&confirmation](const ConfirmationInfo& info) { + return (info.id == confirmation.id); + }); + + if (iter == failed_confirmations_.end()) { + return false; + } + + failed_confirmations_.erase(iter); + + return true; } -ConfirmationsState::~ConfirmationsState() = default; +TransactionList ConfirmationsState::get_transactions() const { + DCHECK(is_initialized_); + return transactions_; +} + +void ConfirmationsState::add_transaction( + const TransactionInfo& transaction) { + DCHECK(is_initialized_); + transactions_.push_back(transaction); +} + +base::Time ConfirmationsState::get_next_token_redemption_date() const { + DCHECK(is_initialized_); + return next_token_redemption_date_; +} + +void ConfirmationsState::set_next_token_redemption_date( + const base::Time& next_token_redemption_date) { + DCHECK(is_initialized_); + next_token_redemption_date_ = next_token_redemption_date; +} + +privacy::UnblindedTokens* ConfirmationsState::get_unblinded_tokens() const { + DCHECK(is_initialized_); + return unblinded_tokens_.get(); +} + +privacy::UnblindedTokens* +ConfirmationsState::get_unblinded_payment_tokens() const { + DCHECK(is_initialized_); + return unblinded_payment_tokens_.get(); +} + +/////////////////////////////////////////////////////////////////////////////// std::string ConfirmationsState::ToJson() { base::Value dictionary(base::Value::Type::DICTIONARY); @@ -49,12 +207,13 @@ std::string ConfirmationsState::ToJson() { next_token_redemption_date_.ToDoubleT())))); // Confirmations - base::Value confirmations = GetConfirmationsAsDictionary(confirmations_); + base::Value failed_confirmations = + GetFailedConfirmationsAsDictionary(failed_confirmations_); dictionary.SetKey("confirmations", - base::Value(std::move(confirmations))); + base::Value(std::move(failed_confirmations))); // Ad rewards - base::Value ad_rewards = ads_->get_ad_rewards()->GetAsDictionary(); + base::Value ad_rewards = ad_rewards_->GetAsDictionary(); dictionary.SetKey("ads_rewards", base::Value(std::move(ad_rewards))); @@ -101,8 +260,8 @@ bool ConfirmationsState::FromJson( BLOG(1, "Failed to parse next token redemption date"); } - if (!ParseConfirmationsFromDictionary(dictionary)) { - BLOG(1, "Failed to parse confirmations"); + if (!ParseFailedConfirmationsFromDictionary(dictionary)) { + BLOG(1, "Failed to parse failed confirmations"); } if (!ParseAdRewardsFromDictionary(dictionary)) { @@ -124,69 +283,6 @@ bool ConfirmationsState::FromJson( return true; } -CatalogIssuersInfo ConfirmationsState::get_catalog_issuers() const { - return catalog_issuers_; -} - -void ConfirmationsState::set_catalog_issuers( - const CatalogIssuersInfo& catalog_issuers) { - catalog_issuers_ = catalog_issuers; -} - -ConfirmationList ConfirmationsState::get_confirmations() const { - return confirmations_; -} - -void ConfirmationsState::append_confirmation( - const ConfirmationInfo& confirmation) { - confirmations_.push_back(confirmation); -} - -bool ConfirmationsState::remove_confirmation( - const ConfirmationInfo& confirmation) { - const auto iter = std::find_if(confirmations_.begin(), confirmations_.end(), - [&confirmation](const ConfirmationInfo& info) { - return (info.id == confirmation.id); - }); - - if (iter == confirmations_.end()) { - return false; - } - - confirmations_.erase(iter); - - return true; -} - -TransactionList ConfirmationsState::get_transactions() const { - return transactions_; -} - -void ConfirmationsState::append_transaction( - const TransactionInfo& transaction) { - transactions_.push_back(transaction); -} - -base::Time ConfirmationsState::get_next_token_redemption_date() const { - return next_token_redemption_date_; -} - -void ConfirmationsState::set_next_token_redemption_date( - const base::Time& next_token_redemption_date) { - next_token_redemption_date_ = next_token_redemption_date; -} - -privacy::UnblindedTokens* ConfirmationsState::get_unblinded_tokens() const { - return unblinded_tokens_.get(); -} - -privacy::UnblindedTokens* -ConfirmationsState::get_unblinded_payment_tokens() const { - return unblinded_payment_tokens_.get(); -} - -/////////////////////////////////////////////////////////////////////////////// - bool ConfirmationsState::ParseCatalogIssuersFromDictionary( base::DictionaryValue* dictionary) { DCHECK(dictionary); @@ -204,7 +300,7 @@ bool ConfirmationsState::ParseCatalogIssuersFromDictionary( return true; } -base::Value ConfirmationsState::GetConfirmationsAsDictionary( +base::Value ConfirmationsState::GetFailedConfirmationsAsDictionary( const ConfirmationList& confirmations) const { base::Value dictionary(base::Value::Type::DICTIONARY); @@ -258,23 +354,23 @@ base::Value ConfirmationsState::GetConfirmationsAsDictionary( return dictionary; } -bool ConfirmationsState::GetConfirmationsFromDictionary( +bool ConfirmationsState::GetFailedConfirmationsFromDictionary( base::Value* dictionary, ConfirmationList* confirmations) { DCHECK(dictionary); DCHECK(confirmations); // Confirmations - const base::Value* confirmations_list = + const base::Value* failed_confirmations = dictionary->FindListKey("failed_confirmations"); - if (!confirmations_list) { - BLOG(0, "Confirmations dictionary missing confirmations list"); + if (!failed_confirmations) { + BLOG(0, "Failed confirmations dictionary missing failed confirmations"); return false; } - ConfirmationList new_confirmations; + ConfirmationList new_failed_confirmations; - for (const auto& value : confirmations_list->GetList()) { + for (const auto& value : failed_confirmations->GetList()) { const base::DictionaryValue* confirmation_dictionary = nullptr; if (!value.GetAsDictionary(&confirmation_dictionary)) { BLOG(0, "Confirmation should be a dictionary"); @@ -387,26 +483,26 @@ bool ConfirmationsState::GetConfirmationsFromDictionary( confirmation_dictionary->FindBoolKey("created"); confirmation.created = created.value_or(true); - new_confirmations.push_back(confirmation); + new_failed_confirmations.push_back(confirmation); } - *confirmations = new_confirmations; + *confirmations = new_failed_confirmations; return true; } -bool ConfirmationsState::ParseConfirmationsFromDictionary( +bool ConfirmationsState::ParseFailedConfirmationsFromDictionary( base::DictionaryValue* dictionary) { DCHECK(dictionary); - base::Value* confirmations_dictionary = + base::Value* failed_confirmations_dictionary = dictionary->FindDictKey("confirmations"); - if (!confirmations_dictionary) { + if (!failed_confirmations_dictionary) { return false; } - if (!GetConfirmationsFromDictionary(confirmations_dictionary, - &confirmations_)) { + if (!GetFailedConfirmationsFromDictionary(failed_confirmations_dictionary, + &failed_confirmations_)) { return false; } @@ -552,7 +648,7 @@ bool ConfirmationsState::ParseAdRewardsFromDictionary( return false; } - ads_->get_ad_rewards()->SetFromDictionary(ad_rewards_dictionary); + ad_rewards_->SetFromDictionary(ad_rewards_dictionary); return true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.h b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.h index e2bc05bfc598..d915dfb99792 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/confirmations/confirmations_state.h @@ -6,20 +6,19 @@ #ifndef BAT_ADS_INTERNAL_CONFIRMATIONS_CCONFIRMATIONS_STATE_H_ #define BAT_ADS_INTERNAL_CONFIRMATIONS_CCONFIRMATIONS_STATE_H_ -#include - #include #include +#include "base/time/time.h" #include "base/values.h" +#include "bat/ads/ads.h" #include "bat/ads/internal/confirmations/confirmation_info.h" #include "bat/ads/internal/catalog/catalog_issuers_info.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/transaction_info.h" namespace ads { -class AdsImpl; +class AdRewards; namespace privacy { class UnblindedTokens; @@ -27,52 +26,68 @@ class UnblindedTokens; class ConfirmationsState { public: - ConfirmationsState( - AdsImpl* ads); + ConfirmationsState(); ~ConfirmationsState(); - std::string ToJson(); - bool FromJson( - const std::string& json); + static ConfirmationsState* Get(); + + static bool HasInstance(); + + // TODO(https://github.com/brave/brave-browser/issues/12563): Decouple Brave + // Ads rewards state from confirmations + void set_ad_rewards( + AdRewards* ad_rewards); + + void Initialize( + InitializeCallback callback); + + void Load(); + void Save(); CatalogIssuersInfo get_catalog_issuers() const; void set_catalog_issuers( const CatalogIssuersInfo& catalog_issuers); - ConfirmationList get_confirmations() const; - void append_confirmation( + ConfirmationList get_failed_confirmations() const; + void append_failed_confirmation( const ConfirmationInfo& confirmation); - bool remove_confirmation( + bool remove_failed_confirmation( const ConfirmationInfo& confirmation); TransactionList get_transactions() const; - void append_transaction( + void add_transaction( const TransactionInfo& transaction); base::Time get_next_token_redemption_date() const; void set_next_token_redemption_date( const base::Time& next_token_redemption_date); - privacy::UnblindedTokens* get_unblinded_tokens() const; privacy::UnblindedTokens* get_unblinded_payment_tokens() const; private: - AdsImpl* ads_; // NOT OWNED + bool is_initialized_ = false; + InitializeCallback callback_; + + AdRewards* ad_rewards_ = nullptr; // NOT OWNED + + std::string ToJson(); + bool FromJson( + const std::string& json); CatalogIssuersInfo catalog_issuers_; bool ParseCatalogIssuersFromDictionary( base::DictionaryValue* dictionary); - ConfirmationList confirmations_; - base::Value GetConfirmationsAsDictionary( + ConfirmationList failed_confirmations_; + base::Value GetFailedConfirmationsAsDictionary( const ConfirmationList& confirmations) const; - bool GetConfirmationsFromDictionary( + bool GetFailedConfirmationsFromDictionary( base::Value* dictionary, ConfirmationList* confirmations); - bool ParseConfirmationsFromDictionary( + bool ParseFailedConfirmationsFromDictionary( base::DictionaryValue* dictionary); TransactionList transactions_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.cc b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.cc index 338c824c211b..27cf010bd058 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.cc @@ -15,23 +15,21 @@ #include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/strings/string_number_conversions.h" +#include "base/time/time.h" #include "brave_base/random.h" +#include "bat/ads/ads.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/conversions/sorts/conversions_sort_factory.h" -#include "bat/ads/internal/database/tables/conversions_database_table.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" +#include "bat/ads/internal/database/tables/conversions_database_table.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/internal/url_util.h" #include "bat/ads/pref_names.h" namespace ads { -using std::placeholders::_1; -using std::placeholders::_2; - namespace { const char kConversionsFilename[] = "ad_conversions.json"; @@ -41,10 +39,10 @@ const char kConversionTimestampKey[] = "timestamp_in_seconds"; const char kConversionCreativeSetIdKey[] = "creative_set_id"; const char kConversionCreativeInstanceIdKey[] = "uuid"; -const int kConversionFrequency = +const int64_t kConvertAfterSeconds = base::Time::kHoursPerDay * base::Time::kSecondsPerHour; -const int kDebugConversionFrequency = 10 * base::Time::kSecondsPerMinute; -const int kExpiredConversionFrequency = 5 * base::Time::kSecondsPerMinute; +const int64_t kDebugConvertAfterSeconds = 10 * base::Time::kSecondsPerMinute; +const int64_t kExpiredConvertAfterSeconds = 1 * base::Time::kSecondsPerMinute; bool HasObservationWindowForAdEventExpired( const int observation_window, @@ -63,15 +61,20 @@ bool HasObservationWindowForAdEventExpired( } // namespace -Conversions::Conversions( - AdsImpl* ads) - : is_initialized_(false), - ads_(ads) { - DCHECK(ads_); -} +Conversions::Conversions() = default; Conversions::~Conversions() = default; +void Conversions::AddObserver( + ConversionsObserver* observer) { + observers_.AddObserver(observer); +} + +void Conversions::RemoveObserver( + ConversionsObserver* observer) { + observers_.RemoveObserver(observer); +} + void Conversions::Initialize( InitializeCallback callback) { callback_ = callback; @@ -88,7 +91,7 @@ void Conversions::MaybeConvert( return; } - if (!UrlHasScheme(url)) { + if (!DoesUrlHaveSchemeHTTPOrHTTPS(url)) { BLOG(1, "URL is not supported for conversions"); return; } @@ -115,7 +118,7 @@ void Conversions::StartTimerIfReady() { /////////////////////////////////////////////////////////////////////////////// bool Conversions::ShouldAllow() const { - return ads_->get_ads_client()->GetBooleanPref( + return AdsClientHelper::Get()->GetBooleanPref( prefs::kShouldAllowConversionTracking); } @@ -123,7 +126,7 @@ void Conversions::CheckUrl( const std::string& url) { BLOG(1, "Checking URL for conversions"); - database::table::AdEvents ad_events_database_table(ads_); + database::table::AdEvents ad_events_database_table; ad_events_database_table.GetAll([=]( const Result result, const AdEventList& ad_events) { @@ -132,7 +135,7 @@ void Conversions::CheckUrl( return; } - database::table::Conversions conversions_database_table(ads_); + database::table::Conversions conversions_database_table; conversions_database_table.GetAll([=]( const Result result, const ConversionList& conversions) { @@ -232,7 +235,7 @@ ConversionList Conversions::FilterConversions( const auto iter = std::remove_if(filtered_conversions.begin(), filtered_conversions.end(), [&url](const ConversionInfo& conversion) { - return !UrlMatchesPattern(url, conversion.url_pattern); + return !DoesUrlMatchPattern(url, conversion.url_pattern); }); filtered_conversions.erase(iter, filtered_conversions.end()); @@ -263,8 +266,7 @@ void Conversions::AddItemToQueue( static_cast(base::Time::Now().ToDoubleT()); conversion_ad_event.confirmation_type = ConfirmationType::kConversion; - AdEvents ad_events(ads_); - ad_events.Log(conversion_ad_event, []( + LogAdEvent(conversion_ad_event, []( const Result result) { if (result != Result::SUCCESS) { BLOG(1, "Failed to log conversion event"); @@ -277,7 +279,7 @@ void Conversions::AddItemToQueue( ConversionQueueItemInfo queue_item; const uint64_t rand_delay = brave_base::random::Geometric( - _is_debug ? kDebugConversionFrequency : kConversionFrequency); + _is_debug ? kDebugConvertAfterSeconds : kConvertAfterSeconds); const uint64_t now = static_cast(base::Time::Now().ToDoubleT()); @@ -323,20 +325,21 @@ void Conversions::ProcessQueueItem( const std::string friendly_date_and_time = FriendlyDateAndTime(queue_item.timestamp_in_seconds); + const std::string creative_set_id = queue_item.creative_set_id; + const std::string creative_instance_id = queue_item.creative_instance_id; + if (!queue_item.IsValid()) { BLOG(1, "Failed to convert ad with creative instance id " - << queue_item.creative_instance_id << " and creative set id " - << queue_item.creative_set_id << " " << friendly_date_and_time); - } else { - const std::string creative_set_id = queue_item.creative_set_id; - const std::string creative_instance_id = queue_item.creative_instance_id; + << creative_instance_id << " and creative set id " << creative_set_id + << " " << friendly_date_and_time); + NotifyConversionFailed(creative_instance_id); + } else { BLOG(1, "Successfully converted ad with creative instance id " << creative_instance_id << " and creative set id " << creative_set_id << " " << friendly_date_and_time); - ads_->get_confirmations()->ConfirmAd(creative_instance_id, - ConfirmationType::kConversion); + NotifyConversion(creative_instance_id); } RemoveItemFromQueue(queue_item.creative_instance_id); @@ -360,14 +363,14 @@ void Conversions::StartTimer( const base::Time now = base::Time::Now(); const base::Time timestamp = - base::Time::FromDoubleT(queue_item.timestamp_in_seconds); + base::Time::FromDoubleT(queue_item.timestamp_in_seconds); base::TimeDelta delay; if (now < timestamp) { delay = timestamp - now; } else { - const uint64_t rand_delay = brave_base::random::Geometric( - kExpiredConversionFrequency); + const uint64_t rand_delay = + brave_base::random::Geometric(kExpiredConvertAfterSeconds); delay = base::TimeDelta::FromSeconds(rand_delay); } @@ -387,8 +390,8 @@ void Conversions::Save() { BLOG(9, "Saving conversions state"); std::string json = ToJson(); - auto callback = std::bind(&Conversions::OnSaved, this, _1); - ads_->get_ads_client()->Save(kConversionsFilename, json, callback); + auto callback = std::bind(&Conversions::OnSaved, this, std::placeholders::_1); + AdsClientHelper::Get()->Save(kConversionsFilename, json, callback); } void Conversions::OnSaved( @@ -436,8 +439,9 @@ base::Value Conversions::GetAsList() { void Conversions::Load() { BLOG(3, "Loading conversions state"); - auto callback = std::bind(&Conversions::OnLoaded, this, _1, _2); - ads_->get_ads_client()->Load(kConversionsFilename, callback); + auto callback = std::bind(&Conversions::OnLoaded, this, + std::placeholders::_1, std::placeholders::_2); + AdsClientHelper::Get()->Load(kConversionsFilename, callback); } void Conversions::OnLoaded( @@ -575,4 +579,18 @@ bool Conversions::GetFromDictionary( return true; } +void Conversions::NotifyConversion( + const std::string& creative_instance_id) { + for (ConversionsObserver& observer : observers_) { + observer.OnConversion(creative_instance_id); + } +} + +void Conversions::NotifyConversionFailed( + const std::string& creative_instance_id) { + for (ConversionsObserver& observer : observers_) { + observer.OnConversionFailed(creative_instance_id); + } +} + } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.h b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.h index fcdf5c98f906..16555919fd47 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions.h @@ -12,21 +12,25 @@ #include "base/values.h" #include "bat/ads/ads.h" #include "bat/ads/internal/ad_events/ad_event_info.h" +#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/conversions/conversion_info.h" #include "bat/ads/internal/conversions/conversion_queue_item_info.h" +#include "bat/ads/internal/conversions/conversions_observer.h" #include "bat/ads/internal/timer.h" namespace ads { -class AdsImpl; - class Conversions { public: - Conversions( - AdsImpl* ads); + Conversions(); ~Conversions(); + void AddObserver( + ConversionsObserver* observer); + void RemoveObserver( + ConversionsObserver* observer); + void Initialize( InitializeCallback callback); @@ -38,9 +42,11 @@ class Conversions { void StartTimerIfReady(); private: - bool is_initialized_; + bool is_initialized_ = false; InitializeCallback callback_; + base::ObserverList observers_; + ConversionQueueItemList queue_; Timer timer_; @@ -88,7 +94,11 @@ class Conversions { const base::DictionaryValue* dictionary, ConversionQueueItemInfo* info) const; - AdsImpl* ads_; // NOT OWNED + void NotifyConversion( + const std::string& creative_instance_id); + + void NotifyConversionFailed( + const std::string& creative_instance_id); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_observer.h b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_observer.h new file mode 100644 index 000000000000..892b05fc6e8b --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_observer.h @@ -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/. */ + +#ifndef BAT_ADS_INTERNAL_CONVERSIONS_CONVERSIONS_OBSERVER_H_ +#define BAT_ADS_INTERNAL_CONVERSIONS_CONVERSIONS_OBSERVER_H_ + +#include + +#include "base/observer_list.h" + +namespace ads { + +class ConversionsObserver : public base::CheckedObserver { + public: + // Invoked when an ad is transferred + virtual void OnConversion( + const std::string& creative_instance_id) {} + + // Invoked when an ad fails to transfer + virtual void OnConversionFailed( + const std::string& creative_instance_id) {} + + protected: + ~ConversionsObserver() override = default; +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_CONVERSIONS_CONVERSIONS_OBSERVER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_unittest.cc index c943b1cb7a39..752758cb5f9b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/conversions/conversions_unittest.cc @@ -5,106 +5,41 @@ #include "bat/ads/internal/conversions/conversions.h" -#include - -#include -#include #include -#include -#include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" #include "base/strings/stringprintf.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" #include "bat/ads/internal/ad_events/ad_events.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.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/conversions_database_table.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsConversionsTest : public ::testing::Test { +class BatAdsConversionsTest : public UnitTestBase { protected: BatAdsConversionsTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - conversions_database_table_(std::make_unique< - database::table::Conversions>(ads_.get())), + : conversions_(std::make_unique()), ad_events_database_table_(std::make_unique< - database::table::AdEvents>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsConversionsTest() override { - // You can do clean-up work that doesn't throw exceptions here + database::table::AdEvents>()), + conversions_database_table_(std::make_unique< + database::table::Conversions>()) { } - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods + ~BatAdsConversionsTest() override = default; void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + UnitTestBase::SetUp(); - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) + conversions_->Initialize([]( + const Result result) { + ASSERT_EQ(Result::SUCCESS, result); + }); } - // Objects declared here can be used by all tests in the test case - void SaveConversions( const ConversionList& conversions) { conversions_database_table_->Save(conversions, []( @@ -117,43 +52,35 @@ class BatAdsConversionsTest : public ::testing::Test { const int observation_window) { base::Time time = base::Time::Now(); time += base::TimeDelta::FromDays(observation_window); + return static_cast(time.ToDoubleT()); } - void TriggerAdEvent( + void FireAdEvent( const std::string& creative_set_id, const ConfirmationType confirmation_type) { AdEventInfo ad_event; ad_event.creative_instance_id = "7a3b6d9f-d0b7-4da6-8988-8d5b8938c94f"; ad_event.creative_set_id = creative_set_id; - ad_event.timestamp = base::Time::Now().ToDoubleT(); + ad_event.timestamp = Now(); ad_event.confirmation_type = confirmation_type; - AdEvents ad_events(ads_.get()); - ad_events.Log(ad_event, + LogAdEvent(ad_event, [](const Result result) { ASSERT_EQ(Result::SUCCESS, result); }); } - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr conversions_database_table_; + std::unique_ptr conversions_; std::unique_ptr ad_events_database_table_; - std::unique_ptr database_; + std::unique_ptr conversions_database_table_; }; TEST_F(BatAdsConversionsTest, ShouldNotAllowConversionTracking) { // Arrange ads_client_mock_->SetBooleanPref( - ads::prefs::kShouldAllowConversionTracking, false); + prefs::kShouldAllowConversionTracking, false); ConversionList conversions; @@ -169,7 +96,7 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); // Act - ads_->get_conversions()->MaybeConvert("https://www.foobar.com/signup"); + conversions_->MaybeConvert("https://www.foobar.com/signup"); // Assert const std::string condition = base::StringPrintf( @@ -201,10 +128,10 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar"); + conversions_->MaybeConvert("https://www.foo.com/bar"); // Assert const std::string condition = base::StringPrintf( @@ -239,11 +166,11 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kClicked); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kClicked); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar/baz"); + conversions_->MaybeConvert("https://www.foo.com/bar/baz"); // Assert const std::string condition = base::StringPrintf( @@ -287,15 +214,15 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion_1.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion_1.creative_set_id, ConfirmationType::kViewed); - TriggerAdEvent(conversion_2.creative_set_id, ConfirmationType::kViewed); - TriggerAdEvent(conversion_2.creative_set_id, ConfirmationType::kClicked); + FireAdEvent(conversion_2.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion_2.creative_set_id, ConfirmationType::kClicked); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/qux"); + conversions_->MaybeConvert("https://www.foo.com/qux"); - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar/baz"); + conversions_->MaybeConvert("https://www.foo.com/bar/baz"); // Assert const std::string condition = base::StringPrintf( @@ -337,11 +264,11 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kDismissed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kDismissed); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/quxbarbaz"); + conversions_->MaybeConvert("https://www.foo.com/quxbarbaz"); // Assert const std::string condition = base::StringPrintf( @@ -376,14 +303,14 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kDismissed); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kTransferred); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kFlagged); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kUpvoted); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kDownvoted); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kDismissed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kTransferred); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kFlagged); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kUpvoted); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kDownvoted); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar"); + conversions_->MaybeConvert("https://www.foo.com/bar"); // Assert const std::string condition = base::StringPrintf( @@ -404,10 +331,10 @@ TEST_F(BatAdsConversionsTest, // Arrange const std::string creative_set_id = "3519f52c-46a4-4c48-9c2b-c264c0067f04"; - TriggerAdEvent(creative_set_id, ConfirmationType::kViewed); + FireAdEvent(creative_set_id, ConfirmationType::kViewed); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar"); + conversions_->MaybeConvert("https://www.foo.com/bar"); // Assert const std::string condition = "creative_set_id = 'foobar' AND " @@ -438,12 +365,12 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar"); + conversions_->MaybeConvert("https://www.foo.com/bar"); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar"); + conversions_->MaybeConvert("https://www.foo.com/bar"); // Assert const std::string condition = base::StringPrintf( @@ -478,10 +405,10 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/qux"); + conversions_->MaybeConvert("https://www.foo.com/qux"); // Assert const std::string condition = base::StringPrintf( @@ -513,13 +440,13 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); task_environment_.FastForwardBy(base::TimeDelta::FromDays(3) - base::TimeDelta::FromMinutes(1)); // Act - ads_->get_conversions()->MaybeConvert("https://foo.bar.com/qux"); + conversions_->MaybeConvert("https://foo.bar.com/qux"); // Assert const std::string condition = base::StringPrintf( @@ -554,12 +481,12 @@ TEST_F(BatAdsConversionsTest, SaveConversions(conversions); - TriggerAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); + FireAdEvent(conversion.creative_set_id, ConfirmationType::kViewed); task_environment_.FastForwardBy(base::TimeDelta::FromDays(3)); // Act - ads_->get_conversions()->MaybeConvert("https://www.foo.com/bar/qux"); + conversions_->MaybeConvert("https://www.foo.com/bar/qux"); // Assert const std::string condition = base::StringPrintf( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/conversions/sorts/conversions_sort_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/conversions/sorts/conversions_sort_unittest.cc index fd490d1563a9..f908358740c1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/conversions/sorts/conversions_sort_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/conversions/sorts/conversions_sort_unittest.cc @@ -5,6 +5,8 @@ #include "bat/ads/internal/conversions/sorts/conversions_sort_factory.h" +#include + #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.cc index 8092f0a47459..5253757a15cf 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.cc @@ -8,7 +8,7 @@ #include #include -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_migration.h" #include "bat/ads/internal/database/database_version.h" #include "bat/ads/internal/logging.h" @@ -16,13 +16,7 @@ namespace ads { namespace database { -using std::placeholders::_1; - -Initialize::Initialize( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Initialize::Initialize() = default; Initialize::~Initialize() = default; @@ -37,8 +31,9 @@ void Initialize::CreateOrOpen( transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&Initialize::OnCreateOrOpen, this, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&Initialize::OnCreateOrOpen, this, std::placeholders::_1, + callback)); } std::string Initialize::get_last_message() const { @@ -67,7 +62,7 @@ void Initialize::OnCreateOrOpen( const int version = response->result->get_value()->get_int_value(); - Migration migration(ads_); + Migration migration; migration.FromVersion(version, callback); } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.h b/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.h index 87fb8a7b89e6..de0c1c7dfb6a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/database_initialize.h @@ -19,8 +19,7 @@ namespace database { class Initialize { public: - explicit Initialize( - AdsImpl* ads); + Initialize(); ~Initialize(); @@ -35,8 +34,6 @@ class Initialize { ResultCallback callback); std::string last_message_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace database diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.cc index b48e2fa21fa2..9ca26f156f05 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.cc @@ -8,7 +8,7 @@ #include #include -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_util.h" #include "bat/ads/internal/database/database_version.h" #include "bat/ads/internal/database/tables/ad_events_database_table.h" @@ -25,13 +25,7 @@ namespace ads { namespace database { -using std::placeholders::_1; - -Migration::Migration( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Migration::Migration() = default; Migration::~Migration() = default; @@ -59,8 +53,8 @@ void Migration::FromVersion( transaction->compatible_version = compatible_version(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void Migration::ToVersion( @@ -68,31 +62,31 @@ void Migration::ToVersion( const int to_version) { DCHECK(transaction); - table::Conversions conversions_database_table(ads_); + table::Conversions conversions_database_table; conversions_database_table.Migrate(transaction, to_version); - table::AdEvents ad_events_database_table(ads_); + table::AdEvents ad_events_database_table; ad_events_database_table.Migrate(transaction, to_version); - table::Campaigns campaigns_database_table(ads_); + table::Campaigns campaigns_database_table; campaigns_database_table.Migrate(transaction, to_version); - table::Categories categories_database_table(ads_); + table::Categories categories_database_table; categories_database_table.Migrate(transaction, to_version); - table::CreativeAdNotifications creative_ad_notifications_database_table(ads_); + table::CreativeAdNotifications creative_ad_notifications_database_table; creative_ad_notifications_database_table.Migrate(transaction, to_version); - table::CreativeNewTabPageAds creative_new_tab_page_ads_database_table(ads_); + table::CreativeNewTabPageAds creative_new_tab_page_ads_database_table; creative_new_tab_page_ads_database_table.Migrate(transaction, to_version); - table::CreativeAds creative_ads_database_table(ads_); + table::CreativeAds creative_ads_database_table; creative_ads_database_table.Migrate(transaction, to_version); - table::GeoTargets geo_targets_database_table(ads_); + table::GeoTargets geo_targets_database_table; geo_targets_database_table.Migrate(transaction, to_version); - table::Dayparts dayparts_database_table(ads_); + table::Dayparts dayparts_database_table; dayparts_database_table.Migrate(transaction, to_version); } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.h b/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.h index 3b51d830eaab..9f71ba712a15 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.h @@ -11,15 +11,13 @@ namespace ads { -class AdsImpl; class DatabaseUtil; namespace database { class Migration { public: - explicit Migration( - AdsImpl* ads); + Migration(); ~Migration(); @@ -31,8 +29,6 @@ class Migration { void ToVersion( DBTransaction* transaction, const int to_version); - - AdsImpl* ads_; // NOT OWNED }; } // namespace database diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.cc index fb2c621f2ea5..e0347c063e87 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.cc @@ -9,28 +9,22 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "ad_events"; } // namespace -AdEvents::AdEvents( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AdEvents::AdEvents() = default; AdEvents::~AdEvents() = default; @@ -43,8 +37,8 @@ void AdEvents::LogEvent( ad_event }); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void AdEvents::GetIf( @@ -105,8 +99,8 @@ void AdEvents::PurgeExpired( transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string AdEvents::get_table_name() const { @@ -152,8 +146,9 @@ void AdEvents::RunTransaction( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&AdEvents::OnGetAdEvents, this, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&AdEvents::OnGetAdEvents, this, std::placeholders::_1, + callback)); } void AdEvents::InsertOrUpdate( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.h index a0a2cbc37d40..06a7f3a4964e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/ad_events_database_table.h @@ -19,15 +19,12 @@ namespace ads { using GetAdEventsCallback = std::function; -class AdsImpl; - namespace database { namespace table { class AdEvents : public Table { public: - explicit AdEvents( - AdsImpl* ads); + AdEvents(); ~AdEvents() override; @@ -79,8 +76,6 @@ class AdEvents : public Table { DBTransaction* transaction); void MigrateToV5( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.cc index b60cc0bc5a41..4cc30da09f72 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.cc @@ -9,7 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" @@ -19,17 +19,11 @@ namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "campaigns"; } // namespace -Campaigns::Campaigns( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Campaigns::Campaigns() = default; Campaigns::~Campaigns() = default; @@ -39,8 +33,8 @@ void Campaigns::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void Campaigns::InsertOrUpdate( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.h index 79ba741df429..0fac0e75bccd 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/campaigns_database_table.h @@ -14,15 +14,12 @@ namespace ads { -class AdsImpl; - namespace database { namespace table { class Campaigns : public Table { public: - explicit Campaigns( - AdsImpl* ads); + Campaigns(); ~Campaigns() override; @@ -54,8 +51,6 @@ class Campaigns : public Table { DBTransaction* transaction); void MigrateToV3( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.cc index 8af3c2e19e12..9271c4a4ac8c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.cc @@ -9,7 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" @@ -19,17 +19,11 @@ namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "categories"; } // namespace -Categories::Categories( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Categories::Categories() = default; Categories::~Categories() = default; @@ -55,8 +49,8 @@ void Categories::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string Categories::get_table_name() const { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.h index eb01d57c7520..c4e9236be9a8 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/categories_database_table.h @@ -14,15 +14,12 @@ namespace ads { -class AdsImpl; - namespace database { namespace table { class Categories : public Table { public: - explicit Categories( - AdsImpl* ads); + Categories(); ~Categories() override; @@ -61,8 +58,6 @@ class Categories : public Table { DBTransaction* transaction); void MigrateToV3( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.cc index ad79f5a29e48..281faba4e1d7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.cc @@ -9,28 +9,23 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "ad_conversions"; } // namespace -Conversions::Conversions( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Conversions::Conversions() = default; Conversions::~Conversions() = default; @@ -46,8 +41,8 @@ void Conversions::Save( InsertOrUpdate(transaction.get(), conversions); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void Conversions::GetAll( @@ -62,7 +57,7 @@ void Conversions::GetAll( "FROM %s AS ac " "WHERE %s < expiry_timestamp", get_table_name().c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::READ; @@ -79,8 +74,9 @@ void Conversions::GetAll( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&Conversions::OnGetConversions, this, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&Conversions::OnGetConversions, this, std::placeholders::_1, + callback)); } void Conversions::PurgeExpired( @@ -91,7 +87,7 @@ void Conversions::PurgeExpired( "DELETE FROM %s " "WHERE %s >= expiry_timestamp", get_table_name().c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::EXECUTE; @@ -99,8 +95,8 @@ void Conversions::PurgeExpired( transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string Conversions::get_table_name() const { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.h index c578b76caea4..db512ee3eaa2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table.h @@ -19,15 +19,12 @@ namespace ads { using GetConversionsCallback = std::function; -class AdsImpl; - namespace database { namespace table { class Conversions : public Table { public: - explicit Conversions( - AdsImpl* ads); + Conversions(); ~Conversions() override; @@ -73,8 +70,6 @@ class Conversions : public Table { DBTransaction* transaction); void MigrateToV1( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_test.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_test.cc new file mode 100644 index 000000000000..ea2a24772c16 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_test.cc @@ -0,0 +1,56 @@ +/* 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/database/tables/conversions_database_table.h" + +#include "net/http/http_status_code.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" + +// npm run test -- brave_unit_tests --filter=BatAds* + +namespace ads { + +class BatAdsConversionsDatabaseTableIntegrationTest : public UnitTestBase { + protected: + BatAdsConversionsDatabaseTableIntegrationTest() = default; + + ~BatAdsConversionsDatabaseTableIntegrationTest() override = default; + + void SetUp() override { + UnitTestBase::SetUpForTesting(/* integration_test */ true); + } +}; + +TEST_F(BatAdsConversionsDatabaseTableIntegrationTest, + GetConversionsFromCatalogEndpoint) { + // Arrange + const URLEndpoints endpoints = { + { + "/v5/catalog", { + { + net::HTTP_OK, "/catalog.json" + } + } + } + }; + + MockUrlRequest(ads_client_mock_, endpoints); + + InitializeAds(); + + // Act + + // Assert + database::table::Conversions conversions; + conversions.GetAll([]( + const Result result, + const ConversionList& conversions) { + EXPECT_EQ(Result::SUCCESS, result); + EXPECT_EQ(2UL, conversions.size()); + }); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_unittest.cc index e2c5ce5a2cde..583ca5fe5313 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/conversions_database_table_unittest.cc @@ -5,90 +5,25 @@ #include "bat/ads/internal/database/tables/conversions_database_table.h" -#include - #include -#include -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" + #include "bat/ads/internal/container_util.h" -#include "bat/ads/internal/conversions/conversion_info.h" -#include "bat/ads/internal/database/database_initialize.h" -#include "bat/ads/internal/platform/platform_helper_mock.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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsConversionsDatabaseTableTest : public ::testing::Test { +class BatAdsConversionsDatabaseTableTest : public UnitTestBase { protected: BatAdsConversionsDatabaseTableTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - database_table_(std::make_unique< - database::table::Conversions>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsConversionsDatabaseTableTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) + : database_table_(std::make_unique()) { } - // Objects declared here can be used by all tests in the test case + ~BatAdsConversionsDatabaseTableTest() override = default; - void CreateOrOpenDatabase() { - database::Initialize initialize(ads_.get()); - initialize.CreateOrOpen([]( - const Result result) { - ASSERT_EQ(Result::SUCCESS, result); - }); - } - - void SaveDatabase( + void Save( const ConversionList conversions) { database_table_->Save(conversions, []( const Result result) { @@ -110,27 +45,16 @@ class BatAdsConversionsDatabaseTableTest : public ::testing::Test { return static_cast(time.ToDoubleT()); } - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; std::unique_ptr database_table_; - std::unique_ptr database_; }; TEST_F(BatAdsConversionsDatabaseTableTest, EmptySave) { // Arrange - CreateOrOpenDatabase(); - ConversionList conversions = {}; // Act - SaveDatabase(conversions); + Save(conversions); // Assert const ConversionList expected_conversions = conversions; @@ -146,8 +70,6 @@ TEST_F(BatAdsConversionsDatabaseTableTest, TEST_F(BatAdsConversionsDatabaseTableTest, SaveConversions) { // Arrange - CreateOrOpenDatabase(); - ConversionList conversions; ConversionInfo info_1; @@ -167,7 +89,7 @@ TEST_F(BatAdsConversionsDatabaseTableTest, conversions.push_back(info_2); // Act - SaveDatabase(conversions); + Save(conversions); // Assert const ConversionList expected_conversions = conversions; @@ -182,9 +104,7 @@ TEST_F(BatAdsConversionsDatabaseTableTest, TEST_F(BatAdsConversionsDatabaseTableTest, DoNotSaveDuplicateConversion) { - // Arrange - CreateOrOpenDatabase(); - + // Arrange; ConversionList conversions; ConversionInfo info; @@ -195,10 +115,10 @@ TEST_F(BatAdsConversionsDatabaseTableTest, info.expiry_timestamp = CalculateExpiryTimestamp(info.observation_window); conversions.push_back(info); - SaveDatabase(conversions); + Save(conversions); // Act - SaveDatabase(conversions); + Save(conversions); // Assert const ConversionList expected_conversions = conversions; @@ -214,8 +134,6 @@ TEST_F(BatAdsConversionsDatabaseTableTest, TEST_F(BatAdsConversionsDatabaseTableTest, PurgeExpiredConversions) { // Arrange - CreateOrOpenDatabase(); - ConversionList conversions; ConversionInfo info_1; @@ -242,10 +160,10 @@ TEST_F(BatAdsConversionsDatabaseTableTest, info_3.expiry_timestamp = CalculateExpiryTimestamp(info_3.observation_window); conversions.push_back(info_3); - SaveDatabase(conversions); + Save(conversions); // Act - task_environment_.FastForwardBy(base::TimeDelta::FromDays(4)); + FastForwardClockBy(base::TimeDelta::FromDays(4)); PurgeExpired(); @@ -265,8 +183,6 @@ TEST_F(BatAdsConversionsDatabaseTableTest, TEST_F(BatAdsConversionsDatabaseTableTest, SaveConversionWithMatchingCreativeSetIdAndTypeAndUrlPattern) { // Arrange - CreateOrOpenDatabase(); - ConversionList conversions; ConversionInfo info_1; @@ -277,7 +193,7 @@ TEST_F(BatAdsConversionsDatabaseTableTest, info_1.expiry_timestamp = CalculateExpiryTimestamp(info_1.observation_window); conversions.push_back(info_1); - SaveDatabase(conversions); + Save(conversions); // Act ConversionInfo info_2; // Should supersede info_1 @@ -288,7 +204,7 @@ TEST_F(BatAdsConversionsDatabaseTableTest, info_2.expiry_timestamp = CalculateExpiryTimestamp(info_2.observation_window); conversions.push_back(info_2); - SaveDatabase(conversions); + Save(conversions); // Assert ConversionList expected_conversions; @@ -302,51 +218,6 @@ TEST_F(BatAdsConversionsDatabaseTableTest, }); } -TEST_F(BatAdsConversionsDatabaseTableTest, - GetConversionsFromCatalogEndpoint) { - // Arrange - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - const URLEndpoints endpoints = { - { - "/v5/catalog", { - { - net::HTTP_OK, "/catalog.json" - } - } - } - }; - - MockUrlRequest(ads_client_mock_, endpoints); - - Initialize(ads_); - - // Act - - // Assert - database_table_->GetAll([]( - const Result result, - const ConversionList& conversions) { - EXPECT_EQ(Result::SUCCESS, result); - EXPECT_EQ(2UL, conversions.size()); - }); -} - TEST_F(BatAdsConversionsDatabaseTableTest, TableName) { // Arrange diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.cc index 74a53389babc..4123d1b7efcd 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.cc @@ -10,20 +10,19 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/container_util.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "creative_ad_notifications"; @@ -32,16 +31,13 @@ const int kDefaultBatchSize = 50; } // namespace -CreativeAdNotifications::CreativeAdNotifications( - AdsImpl* ads) +CreativeAdNotifications::CreativeAdNotifications() : batch_size_(kDefaultBatchSize), - ads_(ads), - campaigns_database_table_(std::make_unique(ads_)), - categories_database_table_(std::make_unique(ads_)), - creative_ads_database_table_(std::make_unique(ads_)), - dayparts_database_table_(std::make_unique(ads_)), - geo_targets_database_table_(std::make_unique(ads_)) { - DCHECK(ads_); + campaigns_database_table_(std::make_unique()), + categories_database_table_(std::make_unique()), + creative_ads_database_table_(std::make_unique()), + dayparts_database_table_(std::make_unique()), + geo_targets_database_table_(std::make_unique()) { } CreativeAdNotifications::~CreativeAdNotifications() = default; @@ -74,8 +70,8 @@ void CreativeAdNotifications::Save( transaction.get(), creative_ads); } - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void CreativeAdNotifications::Delete( @@ -84,8 +80,8 @@ void CreativeAdNotifications::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void CreativeAdNotifications::GetForCategories( @@ -133,7 +129,7 @@ void CreativeAdNotifications::GetForCategories( "AND %s BETWEEN cam.start_at_timestamp AND cam.end_at_timestamp", get_table_name().c_str(), BuildBindingParameterPlaceholder(categories.size()).c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::READ; @@ -171,9 +167,9 @@ void CreativeAdNotifications::GetForCategories( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&CreativeAdNotifications::OnGetForCategories, this, _1, - categories, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&CreativeAdNotifications::OnGetForCategories, this, + std::placeholders::_1, categories, callback)); } void CreativeAdNotifications::GetAll( @@ -213,7 +209,7 @@ void CreativeAdNotifications::GetAll( "ON dp.campaign_id = can.campaign_id " "WHERE %s BETWEEN cam.start_at_timestamp AND cam.end_at_timestamp", get_table_name().c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::READ; @@ -245,8 +241,9 @@ void CreativeAdNotifications::GetAll( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&CreativeAdNotifications::OnGetAll, this, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&CreativeAdNotifications::OnGetAll, this, + std::placeholders::_1, callback)); } void CreativeAdNotifications::set_batch_size( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.h index 4e60f7a0e146..f5ed668a3d75 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table.h @@ -27,15 +27,12 @@ namespace ads { using GetCreativeAdNotificationsCallback = std::function&, const CreativeAdNotificationList&)>; -class AdsImpl; - namespace database { namespace table { class CreativeAdNotifications : public Table { public: - explicit CreativeAdNotifications( - AdsImpl* ads); + CreativeAdNotifications(); ~CreativeAdNotifications() override; @@ -102,8 +99,6 @@ class CreativeAdNotifications : public Table { int batch_size_; - AdsImpl* ads_; // NOT OWNED - std::unique_ptr campaigns_database_table_; std::unique_ptr categories_database_table_; std::unique_ptr creative_ads_database_table_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_test.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_test.cc new file mode 100644 index 000000000000..1ef89d2dc8c8 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_test.cc @@ -0,0 +1,63 @@ +/* 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/database/tables/creative_ad_notifications_database_table.h" + +#include "net/http/http_status_code.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" + +// npm run test -- brave_unit_tests --filter=BatAds* + +namespace ads { + +class BatAdsCreativeAdNotificationsDatabaseTableIntegrationTest + : public UnitTestBase { + protected: + BatAdsCreativeAdNotificationsDatabaseTableIntegrationTest() = default; + + ~BatAdsCreativeAdNotificationsDatabaseTableIntegrationTest() override + = default; + + void SetUp() override { + UnitTestBase::SetUpForTesting(/* integration_test */ true); + } +}; + +TEST_F(BatAdsCreativeAdNotificationsDatabaseTableIntegrationTest, + GetCreativeAdNotificationsFromCatalogEndpoint) { + // Arrange + const URLEndpoints endpoints = { + { + "/v5/catalog", { + { + net::HTTP_OK, "/catalog.json" + } + } + } + }; + + MockUrlRequest(ads_client_mock_, endpoints); + + InitializeAds(); + + // Act + + // Assert + const std::vector categories = { + "Technology & Computing" + }; + + database::table::CreativeAdNotifications creative_ad_notifications; + creative_ad_notifications.GetForCategories(categories, []( + const Result result, + const CategoryList& categories, + const CreativeAdNotificationList& creative_ad_notifications) { + EXPECT_EQ(Result::SUCCESS, result); + EXPECT_EQ(2UL, creative_ad_notifications.size()); + }); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_unittest.cc index d98acd48a2f4..c3d47ed08476 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ad_notifications_database_table_unittest.cc @@ -5,91 +5,24 @@ #include "bat/ads/internal/database/tables/creative_ad_notifications_database_table.h" -#include - -#include -#include -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_notification_info.h" #include "bat/ads/internal/container_util.h" -#include "bat/ads/internal/database/database_initialize.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsCreativeAdNotificationsDatabaseTableTest : public ::testing::Test { +class BatAdsCreativeAdNotificationsDatabaseTableTest : public UnitTestBase { protected: BatAdsCreativeAdNotificationsDatabaseTableTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - database_table_(std::make_unique< - database::table::CreativeAdNotifications>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsCreativeAdNotificationsDatabaseTableTest() override { - // You can do clean-up work that doesn't throw exceptions here + : database_table_(std::make_unique< + database::table::CreativeAdNotifications>()) { } - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - } + ~BatAdsCreativeAdNotificationsDatabaseTableTest() override = default; - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - void CreateOrOpenDatabase() { - database::Initialize initialize(ads_.get()); - initialize.CreateOrOpen([]( - const Result result) { - ASSERT_EQ(Result::SUCCESS, result); - }); - } - - void SaveDatabase( + void Save( const CreativeAdNotificationList creative_ad_notifications) { database_table_->Save(creative_ad_notifications, []( const Result result) { @@ -97,27 +30,16 @@ class BatAdsCreativeAdNotificationsDatabaseTableTest : public ::testing::Test { }); } - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; std::unique_ptr database_table_; - std::unique_ptr database_; }; TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, SaveEmptyCreativeAdNotifications) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications = {}; // Act - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Assert } @@ -125,8 +47,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, SaveCreativeAdNotifications) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -171,7 +91,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, creative_ad_notifications.push_back(info_2); // Act - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Assert const CreativeAdNotificationList expected_creative_ad_notifications = @@ -197,8 +117,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, // Arrange database_table_->set_batch_size(2); - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -263,7 +181,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, creative_ad_notifications.push_back(info_3); // Act - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Assert const CreativeAdNotificationList expected_creative_ad_notifications = @@ -287,8 +205,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, DoNotSaveDuplicateCreativeAdNotifications) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -312,10 +228,10 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info.ptr = 1.0; creative_ad_notifications.push_back(info); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Assert const CreativeAdNotificationList expected_creative_ad_notifications = @@ -339,8 +255,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetCreativeAdNotifications) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -384,7 +298,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info_2.ptr = 1.0; creative_ad_notifications.push_back(info_2); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act @@ -410,8 +324,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetCreativeAdNotificationsForEmptyCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -435,7 +347,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info.ptr = 1.0; creative_ad_notifications.push_back(info); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act @@ -458,8 +370,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetCreativeAdNotificationsForNonExistentCategory) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -483,7 +393,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info.ptr = 1.0; creative_ad_notifications.push_back(info); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act @@ -508,8 +418,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetCreativeAdNotificationsFromMultipleCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -573,7 +481,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info_3.ptr = 1.0; creative_ad_notifications.push_back(info_3); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act @@ -601,8 +509,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetNonExpiredCreativeAdNotifications) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -611,7 +517,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info_1.creative_set_id = "c2ba3e7d-f688-4bc4-a053-cbe7ac1e6123"; info_1.campaign_id = "84197fc8-830a-4a8e-8339-7a70c2bfa104"; info_1.start_at_timestamp = DistantPast(); - info_1.end_at_timestamp = static_cast(base::Time::Now().ToDoubleT()); + info_1.end_at_timestamp = Now(); info_1.daily_cap = 1; info_1.advertiser_id = "5484a63f-eb99-4ba5-a3b0-8c25d3c0e4b2"; info_1.priority = 2; @@ -646,10 +552,10 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info_2.ptr = 1.0; creative_ad_notifications.push_back(info_2); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Assert CreativeAdNotificationList expected_creative_ad_notifications; @@ -673,8 +579,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, GetCreativeAdNotificationsMatchingCaseInsensitiveCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeAdNotificationList creative_ad_notifications; CreativeDaypartInfo daypart_info; @@ -718,7 +622,7 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, info_2.ptr = 1.0; creative_ad_notifications.push_back(info_2); - SaveDatabase(creative_ad_notifications); + Save(creative_ad_notifications); // Act @@ -741,56 +645,6 @@ TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, }); } -TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, - GetCreativeAdNotificationsFromCatalogEndpoint) { - // Arrange - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - const URLEndpoints endpoints = { - { - "/v5/catalog", { - { - net::HTTP_OK, "/catalog.json" - } - } - } - }; - - MockUrlRequest(ads_client_mock_, endpoints); - - Initialize(ads_); - - // Act - - // Assert - const std::vector categories = { - "Technology & Computing" - }; - - database_table_->GetForCategories(categories, []( - const Result result, - const CategoryList& categories, - const CreativeAdNotificationList& creative_ad_notifications) { - EXPECT_EQ(Result::SUCCESS, result); - EXPECT_EQ(2UL, creative_ad_notifications.size()); - }); -} - TEST_F(BatAdsCreativeAdNotificationsDatabaseTableTest, TableName) { // Arrange diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.cc index b85cbf927544..76bc5b87545e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.cc @@ -8,7 +8,7 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" @@ -18,17 +18,11 @@ namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "creative_ads"; } // namespace -CreativeAds::CreativeAds( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +CreativeAds::CreativeAds() = default; CreativeAds::~CreativeAds() = default; @@ -54,8 +48,8 @@ void CreativeAds::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string CreativeAds::get_table_name() const { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.h index 884e27bd5ed5..da393ae69c64 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_ads_database_table.h @@ -14,15 +14,12 @@ namespace ads { -class AdsImpl; - namespace database { namespace table { class CreativeAds : public Table { public: - explicit CreativeAds( - AdsImpl* ads); + CreativeAds(); ~CreativeAds() override; @@ -61,8 +58,6 @@ class CreativeAds : public Table { DBTransaction* transaction); void MigrateToV6( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.cc index 82530758d903..1ccf83b3ef9a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.cc @@ -10,19 +10,19 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/container_util.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" #include "bat/ads/internal/logging.h" +#include "bat/ads/internal/time_formatting_util.h" namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "creative_new_tab_page_ads"; @@ -31,16 +31,13 @@ const int kDefaultBatchSize = 50; } // namespace -CreativeNewTabPageAds::CreativeNewTabPageAds( - AdsImpl* ads) +CreativeNewTabPageAds::CreativeNewTabPageAds() : batch_size_(kDefaultBatchSize), - ads_(ads), - campaigns_database_table_(std::make_unique(ads_)), - categories_database_table_(std::make_unique(ads_)), - creative_ads_database_table_(std::make_unique(ads_)), - dayparts_database_table_(std::make_unique(ads_)), - geo_targets_database_table_(std::make_unique(ads_)) { - DCHECK(ads_); + campaigns_database_table_(std::make_unique()), + categories_database_table_(std::make_unique()), + creative_ads_database_table_(std::make_unique()), + dayparts_database_table_(std::make_unique()), + geo_targets_database_table_(std::make_unique()) { } CreativeNewTabPageAds::~CreativeNewTabPageAds() = default; @@ -73,8 +70,8 @@ void CreativeNewTabPageAds::Save( transaction.get(), creative_ads); } - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void CreativeNewTabPageAds::Delete( @@ -83,8 +80,8 @@ void CreativeNewTabPageAds::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } void CreativeNewTabPageAds::GetForCreativeInstanceId( @@ -164,9 +161,9 @@ void CreativeNewTabPageAds::GetForCreativeInstanceId( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&CreativeNewTabPageAds::OnGetForCreativeInstanceId, this, _1, - creative_instance_id, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&CreativeNewTabPageAds::OnGetForCreativeInstanceId, this, + std::placeholders::_1, creative_instance_id, callback)); } void CreativeNewTabPageAds::GetForCategories( @@ -214,7 +211,7 @@ void CreativeNewTabPageAds::GetForCategories( "AND %s BETWEEN cam.start_at_timestamp AND cam.end_at_timestamp", get_table_name().c_str(), BuildBindingParameterPlaceholder(categories.size()).c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::READ; @@ -252,9 +249,9 @@ void CreativeNewTabPageAds::GetForCategories( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&CreativeNewTabPageAds::OnGetForCategories, this, _1, - categories, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&CreativeNewTabPageAds::OnGetForCategories, this, + std::placeholders::_1, categories, callback)); } void CreativeNewTabPageAds::GetAll( @@ -294,7 +291,7 @@ void CreativeNewTabPageAds::GetAll( "ON dp.campaign_id = can.campaign_id " "WHERE %s BETWEEN cam.start_at_timestamp AND cam.end_at_timestamp", get_table_name().c_str(), - NowAsString().c_str()); + TimeAsTimestampString(base::Time::Now()).c_str()); DBCommandPtr command = DBCommand::New(); command->type = DBCommand::Type::READ; @@ -326,8 +323,9 @@ void CreativeNewTabPageAds::GetAll( DBTransactionPtr transaction = DBTransaction::New(); transaction->commands.push_back(std::move(command)); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&CreativeNewTabPageAds::OnGetAll, this, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&CreativeNewTabPageAds::OnGetAll, this, std::placeholders::_1, + callback)); } void CreativeNewTabPageAds::set_batch_size( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h index 7df8a9340ff0..9fcb55dd62fb 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h @@ -30,15 +30,12 @@ using GetCreativeNewTabPageAdCallback = std::function&, const CreativeNewTabPageAdList&)>; -class AdsImpl; - namespace database { namespace table { class CreativeNewTabPageAds : public Table { public: - explicit CreativeNewTabPageAds( - AdsImpl* ads); + CreativeNewTabPageAds(); ~CreativeNewTabPageAds() override; @@ -106,8 +103,6 @@ class CreativeNewTabPageAds : public Table { int batch_size_; - AdsImpl* ads_; // NOT OWNED - std::unique_ptr campaigns_database_table_; std::unique_ptr categories_database_table_; std::unique_ptr creative_ads_database_table_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_test.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_test.cc new file mode 100644 index 000000000000..85026db51725 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_test.cc @@ -0,0 +1,62 @@ +/* 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/database/tables/creative_new_tab_page_ads_database_table.h" + +#include "net/http/http_status_code.h" +#include "bat/ads/internal/unittest_base.h" +#include "bat/ads/internal/unittest_util.h" + +// npm run test -- brave_unit_tests --filter=BatAds* + +namespace ads { + +class BatAdsCreativeNewTabPageAdsDatabaseTableIntegrationTest + : public UnitTestBase { + protected: + BatAdsCreativeNewTabPageAdsDatabaseTableIntegrationTest() = default; + + ~BatAdsCreativeNewTabPageAdsDatabaseTableIntegrationTest() override = default; + + void SetUp() override { + UnitTestBase::SetUpForTesting(/* integration_test */ true); + } +}; + +TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableIntegrationTest, + GetCreativeNewTabPageAdsFromCatalogEndpoint) { + // Arrange + const URLEndpoints endpoints = { + { + "/v5/catalog", { + { + net::HTTP_OK, "/catalog.json" + } + } + } + }; + + MockUrlRequest(ads_client_mock_, endpoints); + + InitializeAds(); + + // Act + + // Assert + const std::vector categories = { + "Technology & Computing" + }; + + database::table::CreativeNewTabPageAds creative_new_tab_page_ads; + creative_new_tab_page_ads.GetForCategories(categories, []( + const Result result, + const CategoryList& categories, + const CreativeNewTabPageAdList& creative_new_tab_page_ads) { + EXPECT_EQ(Result::SUCCESS, result); + EXPECT_EQ(1UL, creative_new_tab_page_ads.size()); + }); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_unittest.cc index 9f881c4a795d..39a210cba15c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table_unittest.cc @@ -5,91 +5,24 @@ #include "bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h" -#include - -#include -#include -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_new_tab_page_ad_info.h" #include "bat/ads/internal/container_util.h" -#include "bat/ads/internal/database/database_initialize.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsCreativeNewTabPageAdsDatabaseTableTest : public ::testing::Test { +class BatAdsCreativeNewTabPageAdsDatabaseTableTest : public UnitTestBase { protected: BatAdsCreativeNewTabPageAdsDatabaseTableTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - database_table_(std::make_unique< - database::table::CreativeNewTabPageAds>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsCreativeNewTabPageAdsDatabaseTableTest() override { - // You can do clean-up work that doesn't throw exceptions here + : database_table_(std::make_unique< + database::table::CreativeNewTabPageAds>()) { } - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - void CreateOrOpenDatabase() { - database::Initialize initialize(ads_.get()); - initialize.CreateOrOpen([]( - const Result result) { - ASSERT_EQ(Result::SUCCESS, result); - }); - } + ~BatAdsCreativeNewTabPageAdsDatabaseTableTest() override = default; - void SaveDatabase( + void Save( const CreativeNewTabPageAdList creative_new_tab_page_ads) { database_table_->Save(creative_new_tab_page_ads, []( const Result result) { @@ -97,27 +30,16 @@ class BatAdsCreativeNewTabPageAdsDatabaseTableTest : public ::testing::Test { }); } - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; std::unique_ptr database_table_; - std::unique_ptr database_; }; TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, SaveEmptyCreativeNewTabPageAds) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads = {}; // Act - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Assert } @@ -125,8 +47,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, SaveCreativeNewTabPageAds) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -171,7 +91,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, creative_new_tab_page_ads.push_back(info_2); // Act - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Assert const CreativeNewTabPageAdList expected_creative_new_tab_page_ads = @@ -197,8 +117,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, // Arrange database_table_->set_batch_size(2); - CreateOrOpenDatabase(); - CreativeDaypartInfo daypart_info; CreativeNewTabPageAdList creative_new_tab_page_ads; @@ -263,7 +181,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, creative_new_tab_page_ads.push_back(info_3); // Act - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Assert const CreativeNewTabPageAdList expected_creative_new_tab_page_ads = @@ -287,8 +205,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, DoNotSaveDuplicateCreativeNewTabPageAds) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -312,10 +228,10 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info.ptr = 1.0; creative_new_tab_page_ads.push_back(info); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Assert const CreativeNewTabPageAdList expected_creative_new_tab_page_ads = @@ -339,7 +255,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetForCategories) { // Arrange - CreateOrOpenDatabase(); CreativeNewTabPageAdList creative_new_tab_page_ads; @@ -384,7 +299,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info_2.ptr = 1.0; creative_new_tab_page_ads.push_back(info_2); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -410,8 +325,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsForCreativeInstanceId) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -435,7 +348,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info.ptr = 1.0; creative_new_tab_page_ads.push_back(info); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -458,8 +371,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsForNonExistentCreativeInstanceId) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -483,7 +394,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info.ptr = 1.0; creative_new_tab_page_ads.push_back(info); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -502,8 +413,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsForEmptyCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -527,7 +436,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info.ptr = 1.0; creative_new_tab_page_ads.push_back(info); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -550,8 +459,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsForNonExistentCategory) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -575,7 +482,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info.ptr = 1.0; creative_new_tab_page_ads.push_back(info); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -600,8 +507,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsFromMultipleCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -665,7 +570,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info_3.ptr = 1.0; creative_new_tab_page_ads.push_back(info_3); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -693,8 +598,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetNonExpiredCreativeNewTabPageAds) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -703,7 +606,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info_1.creative_set_id = "c2ba3e7d-f688-4bc4-a053-cbe7ac1e6123"; info_1.campaign_id = "84197fc8-830a-4a8e-8339-7a70c2bfa104"; info_1.start_at_timestamp = DistantPast(); - info_1.end_at_timestamp = static_cast(base::Time::Now().ToDoubleT()); + info_1.end_at_timestamp = Now(); info_1.daily_cap = 1; info_1.advertiser_id = "5484a63f-eb99-4ba5-a3b0-8c25d3c0e4b2"; info_1.priority = 2; @@ -738,10 +641,10 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info_2.ptr = 1.0; creative_new_tab_page_ads.push_back(info_2); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Assert CreativeNewTabPageAdList expected_creative_new_tab_page_ads; @@ -765,8 +668,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, GetCreativeNewTabPageAdsMatchingCaseInsensitiveCategories) { // Arrange - CreateOrOpenDatabase(); - CreativeNewTabPageAdList creative_new_tab_page_ads; CreativeDaypartInfo daypart_info; @@ -810,7 +711,7 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, info_2.ptr = 1.0; creative_new_tab_page_ads.push_back(info_2); - SaveDatabase(creative_new_tab_page_ads); + Save(creative_new_tab_page_ads); // Act @@ -833,56 +734,6 @@ TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, }); } -TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, - GetCreativeNewTabPageAdsFromCatalogEndpoint) { - // Arrange - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - const URLEndpoints endpoints = { - { - "/v5/catalog", { - { - net::HTTP_OK, "/catalog.json" - } - } - } - }; - - MockUrlRequest(ads_client_mock_, endpoints); - - Initialize(ads_); - - // Act - - // Assert - const std::vector categories = { - "Technology & Computing" - }; - - database_table_->GetForCategories(categories, []( - const Result result, - const CategoryList& categories, - const CreativeNewTabPageAdList& creative_new_tab_page_ads) { - EXPECT_EQ(Result::SUCCESS, result); - EXPECT_EQ(1UL, creative_new_tab_page_ads.size()); - }); -} - TEST_F(BatAdsCreativeNewTabPageAdsDatabaseTableTest, TableName) { // Arrange diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.cc index 654283d397c7..8d47d0228ebe 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.cc @@ -9,7 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" @@ -21,17 +21,11 @@ namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "dayparts"; } // namespace -Dayparts::Dayparts( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +Dayparts::Dayparts() = default; Dayparts::~Dayparts() = default; @@ -58,8 +52,8 @@ void Dayparts::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string Dayparts::get_table_name() const { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.h index d3739ab671fc..a8543dce8aad 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/dayparts_database_table.h @@ -14,15 +14,12 @@ namespace ads { -class AdsImpl; - namespace database { namespace table { class Dayparts : public Table { public: - explicit Dayparts( - AdsImpl* ads); + Dayparts(); ~Dayparts() override; @@ -54,8 +51,6 @@ class Dayparts : public Table { DBTransaction* transaction); void MigrateToV6( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.cc b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.cc index 6609b23e7166..36b28b16372d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.cc @@ -8,7 +8,7 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/database/database_statement_util.h" #include "bat/ads/internal/database/database_table_util.h" #include "bat/ads/internal/database/database_util.h" @@ -18,17 +18,11 @@ namespace ads { namespace database { namespace table { -using std::placeholders::_1; - namespace { const char kTableName[] = "geo_targets"; } // namespace -GeoTargets::GeoTargets( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +GeoTargets::GeoTargets() = default; GeoTargets::~GeoTargets() = default; @@ -54,8 +48,8 @@ void GeoTargets::Delete( util::Delete(transaction.get(), get_table_name()); - ads_->get_ads_client()->RunDBTransaction(std::move(transaction), - std::bind(&OnResultCallback, _1, callback)); + AdsClientHelper::Get()->RunDBTransaction(std::move(transaction), + std::bind(&OnResultCallback, std::placeholders::_1, callback)); } std::string GeoTargets::get_table_name() const { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.h b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.h index 4758cddf3ed7..c6df23ddc322 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/database/tables/geo_targets_database_table.h @@ -14,15 +14,12 @@ namespace ads { -class AdsImpl; - namespace database { namespace table { class GeoTargets : public Table { public: - explicit GeoTargets( - AdsImpl* ads); + GeoTargets(); ~GeoTargets() override; @@ -61,8 +58,6 @@ class GeoTargets : public Table { DBTransaction* transaction); void MigrateToV3( DBTransaction* transaction); - - AdsImpl* ads_; // NOT OWNED }; } // namespace table diff --git a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.cc b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.cc index c004b472f1c5..57fb828021da 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.cc @@ -10,7 +10,7 @@ #include #include -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" #include "bat/ads/internal/client/client.h" #include "bat/ads/internal/eligible_ads/eligible_ads_util.h" #include "bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h" @@ -29,9 +29,9 @@ bool ShouldCapLastDeliveredAd( } // namespace EligibleAds::EligibleAds( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting) + : subdivision_targeting_(subdivision_targeting) { + DCHECK(subdivision_targeting_); } EligibleAds::~EligibleAds() = default; @@ -61,14 +61,14 @@ CreativeAdNotificationList EligibleAds::RemoveSeenAdvertisersAndRoundRobinIfNeeded( const CreativeAdNotificationList& ads) const { const std::map seen_advertisers = - ads_->get_client()->GetSeenAdvertisers(); + Client::Get()->GetSeenAdvertisers(); CreativeAdNotificationList eligible_ads = FilterSeenAdvertisers(ads, seen_advertisers); if (eligible_ads.empty()) { BLOG(1, "All advertisers have been shown, so round robin"); - ads_->get_client()->ResetSeenAdvertisers(ads); + Client::Get()->ResetSeenAdvertisers(ads); eligible_ads = ads; } @@ -78,13 +78,13 @@ EligibleAds::RemoveSeenAdvertisersAndRoundRobinIfNeeded( CreativeAdNotificationList EligibleAds::RemoveSeenAdsAndRoundRobinIfNeeded( const CreativeAdNotificationList& ads) const { const std::map seen_ads = - ads_->get_client()->GetSeenAdNotifications(); + Client::Get()->GetSeenAdNotifications(); CreativeAdNotificationList eligible_ads = FilterSeenAds(ads, seen_ads); if (eligible_ads.empty()) { BLOG(1, "All ads have been shown, so round robin"); - ads_->get_client()->ResetSeenAdNotifications(ads); + Client::Get()->ResetSeenAdNotifications(ads); eligible_ads = ads; } @@ -97,7 +97,7 @@ CreativeAdNotificationList EligibleAds::FrequencyCap( const AdEventList& ad_events) const { CreativeAdNotificationList eligible_ads = ads; - FrequencyCapping frequency_capping(ads_, ad_events); + FrequencyCapping frequency_capping(subdivision_targeting_, ad_events); const auto iter = std::remove_if(eligible_ads.begin(), eligible_ads.end(), [&frequency_capping, &last_delivered_ad](CreativeAdInfo& ad) { return frequency_capping.ShouldExcludeAd(ad) || diff --git a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.h b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.h index 754155eeb5fb..d20dfc543fd4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.h @@ -11,14 +11,18 @@ namespace ads { -class AdsImpl; +namespace ad_targeting { +namespace geographic { +class SubdivisionTargeting; +} // namespace geographic +} // namespace ad_targeting namespace ad_notifications { class EligibleAds { public: EligibleAds( - AdsImpl* ads); + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting); ~EligibleAds(); @@ -28,8 +32,10 @@ class EligibleAds { const AdEventList& ad_events); private: + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting_; + CreativeAdNotificationList RemoveSeenAdvertisersAndRoundRobinIfNeeded( - const CreativeAdNotificationList& ads) const; + const CreativeAdNotificationList& ads) const; CreativeAdNotificationList RemoveSeenAdsAndRoundRobinIfNeeded( const CreativeAdNotificationList& ads) const; @@ -38,8 +44,6 @@ class EligibleAds { const CreativeAdNotificationList& ads, const CreativeAdInfo& last_delivered_ad, const AdEventList& ad_events) const; - - AdsImpl* ads_; // NOT OWNED }; } // namespace ad_notifications diff --git a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications_unittest.cc index ca532f9a28c8..1daa11d40550 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications_unittest.cc @@ -6,95 +6,28 @@ #include "bat/ads/internal/eligible_ads/ad_notifications/eligible_ad_notifications.h" #include -#include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" #include "base/strings/string_number_conversions.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/client/client.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" #include "bat/ads/internal/container_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace ad_notifications { -class BatAdsEligibleAdNotificationsTest : public ::testing::Test { +class BatAdsEligibleAdNotificationsTest : public UnitTestBase { protected: BatAdsEligibleAdNotificationsTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - eligible_ads_(std::make_unique(ads_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsEligibleAdNotificationsTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); + : subdivision_targeting_(std::make_unique< + ad_targeting::geographic::SubdivisionTargeting>()), + eligible_ads_(std::make_unique( + subdivision_targeting_.get())) { } - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case + ~BatAdsEligibleAdNotificationsTest() override = default; CreativeAdNotificationList GetAds( const int count) { @@ -119,17 +52,9 @@ class BatAdsEligibleAdNotificationsTest : public ::testing::Test { return ads; } - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; + std::unique_ptr + subdivision_targeting_; std::unique_ptr eligible_ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; }; TEST_F(BatAdsEligibleAdNotificationsTest, @@ -155,11 +80,11 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdNotification("1"); - ads_->get_client()->UpdateSeenAdNotification("2"); - ads_->get_client()->UpdateSeenAdNotification("3"); - ads_->get_client()->UpdateSeenAdNotification("4"); - ads_->get_client()->UpdateSeenAdNotification("5"); + Client::Get()->UpdateSeenAdNotification("1"); + Client::Get()->UpdateSeenAdNotification("2"); + Client::Get()->UpdateSeenAdNotification("3"); + Client::Get()->UpdateSeenAdNotification("4"); + Client::Get()->UpdateSeenAdNotification("5"); // Act const CreativeAdNotificationList eligible_ads = @@ -184,10 +109,10 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdNotification("1"); - ads_->get_client()->UpdateSeenAdNotification("2"); - ads_->get_client()->UpdateSeenAdNotification("4"); - ads_->get_client()->UpdateSeenAdNotification("5"); + Client::Get()->UpdateSeenAdNotification("1"); + Client::Get()->UpdateSeenAdNotification("2"); + Client::Get()->UpdateSeenAdNotification("4"); + Client::Get()->UpdateSeenAdNotification("5"); // Act const CreativeAdNotificationList eligible_ads = @@ -217,12 +142,12 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdNotification("1"); - ads_->get_client()->UpdateSeenAdNotification("2"); - ads_->get_client()->UpdateSeenAdNotification("3"); - ads_->get_client()->UpdateSeenAdNotification("4"); - ads_->get_client()->UpdateSeenAdNotification("5"); - ads_->get_client()->UpdateSeenAdNotification("6"); + Client::Get()->UpdateSeenAdNotification("1"); + Client::Get()->UpdateSeenAdNotification("2"); + Client::Get()->UpdateSeenAdNotification("3"); + Client::Get()->UpdateSeenAdNotification("4"); + Client::Get()->UpdateSeenAdNotification("5"); + Client::Get()->UpdateSeenAdNotification("6"); // Act const CreativeAdNotificationList eligible_ads = @@ -240,8 +165,8 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdvertiser("1"); - ads_->get_client()->UpdateSeenAdvertiser("2"); + Client::Get()->UpdateSeenAdvertiser("1"); + Client::Get()->UpdateSeenAdvertiser("2"); // Act const CreativeAdNotificationList eligible_ads = @@ -271,7 +196,7 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdvertiser("1"); + Client::Get()->UpdateSeenAdvertiser("1"); // Act const CreativeAdNotificationList eligible_ads = @@ -311,9 +236,9 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdvertiser("1"); - ads_->get_client()->UpdateSeenAdvertiser("2"); - ads_->get_client()->UpdateSeenAdvertiser("3"); + Client::Get()->UpdateSeenAdvertiser("1"); + Client::Get()->UpdateSeenAdvertiser("2"); + Client::Get()->UpdateSeenAdvertiser("3"); // Act const CreativeAdNotificationList eligible_ads = @@ -331,15 +256,15 @@ TEST_F(BatAdsEligibleAdNotificationsTest, const CreativeAdInfo last_delivered_ad; - ads_->get_client()->UpdateSeenAdNotification("1"); - ads_->get_client()->UpdateSeenAdNotification("2"); - ads_->get_client()->UpdateSeenAdvertiser("1"); - ads_->get_client()->UpdateSeenAdNotification("3"); - ads_->get_client()->UpdateSeenAdNotification("4"); - ads_->get_client()->UpdateSeenAdvertiser("2"); - ads_->get_client()->UpdateSeenAdNotification("5"); - ads_->get_client()->UpdateSeenAdNotification("6"); - ads_->get_client()->UpdateSeenAdvertiser("3"); + Client::Get()->UpdateSeenAdNotification("1"); + Client::Get()->UpdateSeenAdNotification("2"); + Client::Get()->UpdateSeenAdvertiser("1"); + Client::Get()->UpdateSeenAdNotification("3"); + Client::Get()->UpdateSeenAdNotification("4"); + Client::Get()->UpdateSeenAdvertiser("2"); + Client::Get()->UpdateSeenAdNotification("5"); + Client::Get()->UpdateSeenAdNotification("6"); + Client::Get()->UpdateSeenAdvertiser("3"); // Act const CreativeAdNotificationList eligible_ads = diff --git a/vendor/bat-native-ads/src/bat/ads/internal/features.cc b/vendor/bat-native-ads/src/bat/ads/internal/features/features.cc similarity index 91% rename from vendor/bat-native-ads/src/bat/ads/internal/features.cc rename to vendor/bat-native-ads/src/bat/ads/internal/features/features.cc index 7097e6048b5c..b4686c6f1a0a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/features.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/features/features.cc @@ -3,7 +3,7 @@ * 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/features.h" +#include "bat/ads/internal/features/features.h" #include "base/metrics/field_trial.h" #include "base/metrics/field_trial_params.h" @@ -14,12 +14,15 @@ namespace ads { namespace features { namespace { + const char kPageProbabilitiesStudyName[] = "PageProbabilitiesHistoryStudy"; + const int kDefaultHistorySize = 5; + } // namespace -// Controls behaviour of the contextual ad matching mechanism, e.g. by -// adjusting the number of page classifications used to infer user interest. +// Controls behavior of the contextual ad matching mechanism, e.g. by adjusting +// the number of page classifications used to infer user interest const base::Feature kContextualAdsControl { "ContextualAdsControl", base::FEATURE_DISABLED_BY_DEFAULT }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/features.h b/vendor/bat-native-ads/src/bat/ads/internal/features/features.h similarity index 100% rename from vendor/bat-native-ads/src/bat/ads/internal/features.h rename to vendor/bat-native-ads/src/bat/ads/internal/features/features.h diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.cc index cb6516d224b6..f3c44d281b24 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.cc @@ -5,7 +5,7 @@ #include "bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h" @@ -38,67 +38,67 @@ namespace ads { namespace ad_notifications { FrequencyCapping::FrequencyCapping( - AdsImpl* ads, + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting, const AdEventList& ad_events) - : ads_(ads), + : subdivision_targeting_(subdivision_targeting), ad_events_(ad_events) { - DCHECK(ads_); + DCHECK(subdivision_targeting_); } FrequencyCapping::~FrequencyCapping() = default; bool FrequencyCapping::IsAdAllowed() { - AllowNotificationsFrequencyCap allow_notifications_frequency_cap(ads_); + AllowNotificationsFrequencyCap allow_notifications_frequency_cap; if (!ShouldAllow(&allow_notifications_frequency_cap)) { return false; } - NetworkConnectionFrequencyCap network_connection_frequency_cap(ads_); + NetworkConnectionFrequencyCap network_connection_frequency_cap; if (!ShouldAllow(&network_connection_frequency_cap)) { return false; } - BrowserIsActiveFrequencyCap browser_is_active_frequency_cap(ads_); + BrowserIsActiveFrequencyCap browser_is_active_frequency_cap; if (!ShouldAllow(&browser_is_active_frequency_cap)) { return false; } - DoNotDisturbFrequencyCap do_not_disturb_frequency_cap(ads_); + DoNotDisturbFrequencyCap do_not_disturb_frequency_cap; if (!ShouldAllow(&do_not_disturb_frequency_cap)) { return false; } - CatalogFrequencyCap catalog_frequency_cap(ads_); + CatalogFrequencyCap catalog_frequency_cap; if (!ShouldAllow(&catalog_frequency_cap)) { return false; } - UnblindedTokensFrequencyCap unblinded_tokens_frequency_cap(ads_); + UnblindedTokensFrequencyCap unblinded_tokens_frequency_cap; if (!ShouldAllow(&unblinded_tokens_frequency_cap)) { return false; } - UserActivityFrequencyCap user_activity_frequency_cap(ads_); + UserActivityFrequencyCap user_activity_frequency_cap; if (!ShouldAllow(&user_activity_frequency_cap)) { return false; } - MediaFrequencyCap media_frequency_cap(ads_); + MediaFrequencyCap media_frequency_cap; if (!ShouldAllow(&media_frequency_cap)) { return false; } - AdsPerDayFrequencyCap ads_per_day_frequency_cap(ads_, ad_events_); + AdsPerDayFrequencyCap ads_per_day_frequency_cap(ad_events_); if (!ShouldAllow(&ads_per_day_frequency_cap)) { return false; } - AdsPerHourFrequencyCap ads_per_hour_frequency_cap(ads_, ad_events_); + AdsPerHourFrequencyCap ads_per_hour_frequency_cap(ad_events_); if (!ShouldAllow(&ads_per_hour_frequency_cap)) { return false; } - MinimumWaitTimeFrequencyCap minimum_wait_time_frequency_cap(ads_, ad_events_); + MinimumWaitTimeFrequencyCap minimum_wait_time_frequency_cap(ad_events_); if (!ShouldAllow(&minimum_wait_time_frequency_cap)) { return false; } @@ -110,58 +110,58 @@ bool FrequencyCapping::ShouldExcludeAd( const CreativeAdInfo& ad) { bool should_exclude = false; - DailyCapFrequencyCap daily_cap_frequency_cap(ads_, ad_events_); + DailyCapFrequencyCap daily_cap_frequency_cap(ad_events_); if (ShouldExclude(ad, &daily_cap_frequency_cap)) { should_exclude = true; } - PerDayFrequencyCap per_day_frequency_cap(ads_, ad_events_); + PerDayFrequencyCap per_day_frequency_cap(ad_events_); if (ShouldExclude(ad, &per_day_frequency_cap)) { should_exclude = true; } - PerHourFrequencyCap per_hour_frequency_cap(ads_, ad_events_); + PerHourFrequencyCap per_hour_frequency_cap(ad_events_); if (ShouldExclude(ad, &per_hour_frequency_cap)) { should_exclude = true; } - TotalMaxFrequencyCap total_max_frequency_cap(ads_, ad_events_); + TotalMaxFrequencyCap total_max_frequency_cap(ad_events_); if (ShouldExclude(ad, &total_max_frequency_cap)) { should_exclude = true; } - ConversionFrequencyCap conversion_frequency_cap(ads_, ad_events_); + ConversionFrequencyCap conversion_frequency_cap(ad_events_); if (ShouldExclude(ad, &conversion_frequency_cap)) { should_exclude = true; } - SubdivisionTargetingFrequencyCap subdivision_frequency_cap(ads_); + SubdivisionTargetingFrequencyCap + subdivision_frequency_cap(subdivision_targeting_); if (ShouldExclude(ad, &subdivision_frequency_cap)) { should_exclude = true; } - DaypartFrequencyCap daypart_frequency_cap(ads_); + DaypartFrequencyCap daypart_frequency_cap; if (ShouldExclude(ad, &daypart_frequency_cap)) { should_exclude = true; } - DismissedFrequencyCap dismissed_frequency_cap(ads_, ad_events_); + DismissedFrequencyCap dismissed_frequency_cap(ad_events_); if (ShouldExclude(ad, &dismissed_frequency_cap)) { should_exclude = true; } - TransferredFrequencyCap transferred_frequency_cap(ads_, ad_events_); + TransferredFrequencyCap transferred_frequency_cap(ad_events_); if (ShouldExclude(ad, &transferred_frequency_cap)) { should_exclude = true; } - MarkedToNoLongerReceiveFrequencyCap - marked_to_no_longer_receive_frequency_cap(ads_); + MarkedToNoLongerReceiveFrequencyCap marked_to_no_longer_receive_frequency_cap; if (ShouldExclude(ad, &marked_to_no_longer_receive_frequency_cap)) { should_exclude = true; } - MarkedAsInappropriateFrequencyCap marked_as_inappropriate_frequency_cap(ads_); + MarkedAsInappropriateFrequencyCap marked_as_inappropriate_frequency_cap; if (ShouldExclude(ad, &marked_as_inappropriate_frequency_cap)) { should_exclude = true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h index 511b3ad804b4..d820fb47c980 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_notifications/ad_notifications_frequency_capping.h @@ -10,15 +10,20 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; +namespace ad_targeting { +namespace geographic { +class SubdivisionTargeting; +} // namespace geographic +} // namespace ad_targeting + namespace ad_notifications { class FrequencyCapping { public: FrequencyCapping( - AdsImpl* ads, + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting, const AdEventList& ad_events); ~FrequencyCapping(); @@ -34,7 +39,7 @@ class FrequencyCapping { const CreativeAdInfo& ad); private: - AdsImpl* ads_; // NOT OWNED + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting_; AdEventList ad_events_; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.cc index 03b441c6afd9..d0cada67cbef 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.cc @@ -8,10 +8,9 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/conversions/conversions.h" -#include "bat/ads/internal/logging.h" +#include "bat/ads/pref_names.h" namespace ads { @@ -20,11 +19,8 @@ const uint64_t kConversionFrequencyCap = 1; } // namespace ConversionFrequencyCap::ConversionFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } ConversionFrequencyCap::~ConversionFrequencyCap() = default; @@ -56,7 +52,8 @@ std::string ConversionFrequencyCap::get_last_message() const { bool ConversionFrequencyCap::ShouldAllow( const CreativeAdInfo& ad) { - if (ad.conversion && !ads_->get_conversions()->ShouldAllow()) { + if (ad.conversion && !AdsClientHelper::Get()->GetBooleanPref( + prefs::kShouldAllowConversionTracking)) { return false; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h index 998120405a91..de0e0eafc387 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h @@ -9,19 +9,16 @@ #include #include "bat/ads/internal/ad_events/ad_event_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h" namespace ads { -class AdsImpl; struct CreativeAdInfo; class ConversionFrequencyCap : public ExclusionRule { public: ConversionFrequencyCap( - AdsImpl* ads_, const AdEventList& ad_events); ~ConversionFrequencyCap() override; @@ -35,8 +32,6 @@ class ConversionFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc index e958cdb67ee7..89a3841f609d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc @@ -5,30 +5,15 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -40,77 +25,11 @@ const std::vector kCreativeSetIds = { } // namespace -class BatAdsConversionFrequencyCapTest : public ::testing::Test { +class BatAdsConversionFrequencyCapTest : public UnitTestBase { protected: - BatAdsConversionFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsConversionFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + BatAdsConversionFrequencyCapTest() = default; - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsConversionFrequencyCapTest() override = default; }; TEST_F(BatAdsConversionFrequencyCapTest, @@ -121,9 +40,8 @@ TEST_F(BatAdsConversionFrequencyCapTest, const AdEventList ad_events; - ConversionFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + ConversionFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -146,9 +64,8 @@ TEST_F(BatAdsConversionFrequencyCapTest, ad_events.push_back(ad_event); - ConversionFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + ConversionFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -168,9 +85,8 @@ TEST_F(BatAdsConversionFrequencyCapTest, ad_events.push_back(ad_event); - ConversionFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + ConversionFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -193,9 +109,8 @@ TEST_F(BatAdsConversionFrequencyCapTest, ad_events.push_back(ad_event); - ConversionFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + ConversionFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.cc index 90149e7609b6..9e6d779aba9f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.cc @@ -10,20 +10,16 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { DailyCapFrequencyCap::DailyCapFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } DailyCapFrequencyCap::~DailyCapFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h index c5fe70781c69..e5668cc15de1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h @@ -9,19 +9,16 @@ #include #include "bat/ads/internal/ad_events/ad_event_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h" namespace ads { -class AdsImpl; struct CreativeAdInfo; class DailyCapFrequencyCap : public ExclusionRule { public: DailyCapFrequencyCap( - AdsImpl* ads_, const AdEventList& ad_events); ~DailyCapFrequencyCap() override; @@ -35,8 +32,6 @@ class DailyCapFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap_unittest.cc index ed7e085a830d..a65a6f3d17c2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap_unittest.cc @@ -5,30 +5,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -40,77 +24,11 @@ const std::vector kCampaignIds = { } // namespace -class BatAdsDailyCapFrequencyCapTest : public ::testing::Test { +class BatAdsDailyCapFrequencyCapTest : public UnitTestBase { protected: - BatAdsDailyCapFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsDailyCapFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); + BatAdsDailyCapFrequencyCapTest() = default; - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsDailyCapFrequencyCapTest() override = default; }; TEST_F(BatAdsDailyCapFrequencyCapTest, @@ -122,9 +40,8 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, const AdEventList ad_events; - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -145,9 +62,8 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, ad_events.push_back(ad_event); - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -171,9 +87,8 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, ad_events.push_back(ad_event); - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert @@ -194,11 +109,10 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, ad_events.push_back(ad_event); - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(23)); // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -219,11 +133,10 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, ad_events.push_back(ad_event); - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -245,9 +158,8 @@ TEST_F(BatAdsDailyCapFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - DailyCapFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + DailyCapFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.cc index 161442c22482..2f1ada4d1d13 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.cc @@ -6,9 +6,10 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" +#include "bat/ads/internal/time_util.h" namespace ads { @@ -32,11 +33,7 @@ bool DoesMatchTimeSlot( } // namespace -DaypartFrequencyCap::DaypartFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +DaypartFrequencyCap::DaypartFrequencyCap() = default; DaypartFrequencyCap::~DaypartFrequencyCap() = default; @@ -65,9 +62,9 @@ bool DaypartFrequencyCap::DoesRespectCap( const base::Time now = base::Time::Now(); - const int local_minutes_for_today = ConvertTimeToLocalMinutesForToday(now); + const int local_minutes_for_today = ConvertHoursAndMinutesToMinutes(now); - const std::string local_day_of_week = GetLocalDayOfWeek(now); + const std::string local_day_of_week = GetLocalWeekDay(now); for (const CreativeDaypartInfo& daypart : ad.dayparts) { if (!DoesMatchDayOfWeek(daypart, local_day_of_week)) { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h index 5dd1c02909c8..c9b2b9be2970 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h @@ -8,19 +8,16 @@ #include -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h" namespace ads { -class AdsImpl; struct CreativeAdInfo; class DaypartFrequencyCap : public ExclusionRule { public: - DaypartFrequencyCap( - AdsImpl* ads); + DaypartFrequencyCap(); ~DaypartFrequencyCap() override; @@ -35,8 +32,6 @@ class DaypartFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap_unittest.cc index 094b560d676f..407511cd2a41 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap_unittest.cc @@ -5,107 +5,23 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" #include "base/strings/string_number_conversions.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" -#include "bat/ads/internal/time_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeSetId[] = "654f10df-fbc4-4a92-8d43-2edf73734a60"; - } // namespace -class BatAdsDaypartFrequencyCapTest : public ::testing::Test { +class BatAdsDaypartFrequencyCapTest : public UnitTestBase { protected: - BatAdsDaypartFrequencyCapTest() - : ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - DaypartFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsDaypartFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + BatAdsDaypartFrequencyCapTest() = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsDaypartFrequencyCapTest() override = default; }; TEST_F(BatAdsDaypartFrequencyCapTest, @@ -115,7 +31,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.creative_set_id = kCreativeSetId; // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -139,7 +56,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -162,7 +80,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -201,7 +120,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info_3); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -240,7 +160,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info_3); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_TRUE(should_exclude); @@ -268,7 +189,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_TRUE(should_exclude); @@ -293,7 +215,8 @@ TEST_F(BatAdsDaypartFrequencyCapTest, ad.dayparts.push_back(daypart_info); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + DaypartFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_TRUE(should_exclude); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.cc index a63389a4db51..d17bef2f4d7a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.cc @@ -8,19 +8,15 @@ #include #include "base/strings/stringprintf.h" +#include "base/time/time.h" #include "bat/ads/internal/ads_history/sorts/ads_history_sort_factory.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/time_util.h" namespace ads { DismissedFrequencyCap::DismissedFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } DismissedFrequencyCap::~DismissedFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h index 418e195cc38f..d271792f2c2d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h @@ -13,13 +13,11 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; class DismissedFrequencyCap : public ExclusionRule { public: DismissedFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~DismissedFrequencyCap() override; @@ -33,8 +31,6 @@ class DismissedFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap_unittest.cc index edfe0d3bd827..1f66ddf351f4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap_unittest.cc @@ -5,30 +5,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -42,77 +26,11 @@ const std::vector kCampaignIds = { } // namespace -class BatAdsDismissedFrequencyCapTest : public ::testing::Test { +class BatAdsDismissedFrequencyCapTest : public UnitTestBase { protected: - BatAdsDismissedFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsDismissedFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } + BatAdsDismissedFrequencyCapTest() = default; - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsDismissedFrequencyCapTest() override = default; }; TEST_F(BatAdsDismissedFrequencyCapTest, @@ -124,9 +42,8 @@ TEST_F(BatAdsDismissedFrequencyCapTest, const AdEventList ad_events; - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -153,14 +70,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); + FastForwardClockBy(base::TimeDelta::FromHours(47)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -189,14 +105,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); + FastForwardClockBy(base::TimeDelta::FromHours(47)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -225,14 +140,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); + FastForwardClockBy(base::TimeDelta::FromHours(48)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -261,14 +175,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); + FastForwardClockBy(base::TimeDelta::FromHours(47)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -297,14 +210,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); + FastForwardClockBy(base::TimeDelta::FromHours(48)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -335,14 +247,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); + FastForwardClockBy(base::TimeDelta::FromHours(48)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -373,14 +284,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); + FastForwardClockBy(base::TimeDelta::FromHours(47)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -413,14 +323,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); + FastForwardClockBy(base::TimeDelta::FromHours(47)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert @@ -453,14 +362,13 @@ TEST_F(BatAdsDismissedFrequencyCapTest, ad_events.push_back(ad_event); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(5)); + FastForwardClockBy(base::TimeDelta::FromMinutes(5)); } - DismissedFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); + FastForwardClockBy(base::TimeDelta::FromHours(48)); // Act + DismissedFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.cc index 045e90ced874..5a3eb0d77d34 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.cc @@ -6,18 +6,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/client/client.h" +#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/client/preferences/flagged_ad_info.h" namespace ads { -MarkedAsInappropriateFrequencyCap::MarkedAsInappropriateFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +MarkedAsInappropriateFrequencyCap:: +MarkedAsInappropriateFrequencyCap() = default; MarkedAsInappropriateFrequencyCap:: ~MarkedAsInappropriateFrequencyCap() = default; @@ -40,7 +36,7 @@ std::string MarkedAsInappropriateFrequencyCap::get_last_message() const { bool MarkedAsInappropriateFrequencyCap::DoesRespectCap( const CreativeAdInfo& ad) { - const FlaggedAdList flagged_ads = ads_->get_client()->get_flagged_ads(); + const FlaggedAdList flagged_ads = Client::Get()->get_flagged_ads(); if (flagged_ads.empty()) { return true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h index c6140d9107c0..8f4340f354e2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h @@ -12,13 +12,11 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; class MarkedAsInappropriateFrequencyCap : public ExclusionRule { public: - MarkedAsInappropriateFrequencyCap( - AdsImpl* ads); + MarkedAsInappropriateFrequencyCap(); ~MarkedAsInappropriateFrequencyCap() override; @@ -33,8 +31,6 @@ class MarkedAsInappropriateFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap_unittest.cc index 21e90423867c..f78bdb89da57 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap_unittest.cc @@ -5,112 +5,22 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/client/client.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeSetId[] = "654f10df-fbc4-4a92-8d43-2edf73734a60"; - } // namespace -class BatAdsMarkedAsInappropriateFrequencyCapTest : public ::testing::Test { +class BatAdsMarkedAsInappropriateFrequencyCapTest : public UnitTestBase { protected: - BatAdsMarkedAsInappropriateFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - MarkedAsInappropriateFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsMarkedAsInappropriateFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); + BatAdsMarkedAsInappropriateFrequencyCapTest() = default; - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsMarkedAsInappropriateFrequencyCapTest() override = default; }; TEST_F(BatAdsMarkedAsInappropriateFrequencyCapTest, @@ -120,7 +30,8 @@ TEST_F(BatAdsMarkedAsInappropriateFrequencyCapTest, ad.creative_set_id = kCreativeSetId; // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + MarkedAsInappropriateFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -129,17 +40,15 @@ TEST_F(BatAdsMarkedAsInappropriateFrequencyCapTest, TEST_F(BatAdsMarkedAsInappropriateFrequencyCapTest, DoNotAllowAdIfMarkedAsInappropriate) { // Arrange - ads_client_mock_->SetBooleanPref( - prefs::kShouldAllowConversionTracking, false); - CreativeAdInfo ad; ad.creative_set_id = kCreativeSetId; - ads_->get_client()->ToggleFlagAd(ad.creative_instance_id, + Client::Get()->ToggleFlagAd(ad.creative_instance_id, ad.creative_set_id, false); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + MarkedAsInappropriateFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_TRUE(should_exclude); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.cc index f1aeeec79b01..15b524ebd0c3 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.cc @@ -8,18 +8,14 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/client/client.h" +#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/client/preferences/filtered_ad_info.h" namespace ads { -MarkedToNoLongerReceiveFrequencyCap::MarkedToNoLongerReceiveFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +MarkedToNoLongerReceiveFrequencyCap:: +MarkedToNoLongerReceiveFrequencyCap() = default; MarkedToNoLongerReceiveFrequencyCap:: ~MarkedToNoLongerReceiveFrequencyCap() = default; @@ -42,7 +38,7 @@ std::string MarkedToNoLongerReceiveFrequencyCap::get_last_message() const { bool MarkedToNoLongerReceiveFrequencyCap::DoesRespectCap( const CreativeAdInfo& ad) { - const FilteredAdList filtered_ads = ads_->get_client()->get_filtered_ads(); + const FilteredAdList filtered_ads = Client::Get()->get_filtered_ads(); if (filtered_ads.empty()) { return true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.h index 341beb053569..ddd63d9751be 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.h @@ -12,14 +12,12 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; class MarkedToNoLongerReceiveFrequencyCap : public ExclusionRule { public: - MarkedToNoLongerReceiveFrequencyCap( - AdsImpl* ads); + MarkedToNoLongerReceiveFrequencyCap(); ~MarkedToNoLongerReceiveFrequencyCap() override; @@ -34,8 +32,6 @@ class MarkedToNoLongerReceiveFrequencyCap std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap_unittest.cc index 793cffbacba1..c5994fbdd039 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap_unittest.cc @@ -5,113 +5,22 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/marked_to_no_longer_receive_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/ad_content_info.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/client/client.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeSetId[] = "654f10df-fbc4-4a92-8d43-2edf73734a60"; - } // namespace -class BatAdsMarkedToNoLongerReceiveFrequencyCapTest : public ::testing::Test { +class BatAdsMarkedToNoLongerReceiveFrequencyCapTest : public UnitTestBase { protected: - BatAdsMarkedToNoLongerReceiveFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - MarkedToNoLongerReceiveFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsMarkedToNoLongerReceiveFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); + BatAdsMarkedToNoLongerReceiveFrequencyCapTest() = default; - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsMarkedToNoLongerReceiveFrequencyCapTest() override = default; }; TEST_F(BatAdsMarkedToNoLongerReceiveFrequencyCapTest, @@ -121,7 +30,8 @@ TEST_F(BatAdsMarkedToNoLongerReceiveFrequencyCapTest, ad.creative_set_id = kCreativeSetId; // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + MarkedToNoLongerReceiveFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_FALSE(should_exclude); @@ -130,17 +40,15 @@ TEST_F(BatAdsMarkedToNoLongerReceiveFrequencyCapTest, TEST_F(BatAdsMarkedToNoLongerReceiveFrequencyCapTest, DoNotAllowAdIfMarkedToNoLongerReceive) { // Arrange - ads_client_mock_->SetBooleanPref( - prefs::kShouldAllowConversionTracking, false); - CreativeAdInfo ad; ad.creative_set_id = kCreativeSetId; - ads_->get_client()->ToggleAdThumbDown(ad.creative_instance_id, + Client::Get()->ToggleAdThumbDown(ad.creative_instance_id, ad.creative_set_id, AdContentInfo::LikeAction::kThumbsUp); // Act - const bool should_exclude = frequency_cap_->ShouldExclude(ad); + MarkedToNoLongerReceiveFrequencyCap frequency_cap; + const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert EXPECT_TRUE(should_exclude); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.cc index 8687745ffa5e..f2c0d1ad1332 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.cc @@ -9,7 +9,6 @@ #include "base/strings/stringprintf.h" #include "bat/ads/ad_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/logging.h" namespace ads { @@ -19,11 +18,8 @@ const uint64_t kNewTabPageAdUuidFrequencyCap = 1; } // namespace NewTabPageAdUuidFrequencyCap::NewTabPageAdUuidFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } NewTabPageAdUuidFrequencyCap::~NewTabPageAdUuidFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h index 06d96e3efb88..67fc6048f24d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h @@ -13,13 +13,11 @@ namespace ads { -class AdsImpl; struct AdInfo; class NewTabPageAdUuidFrequencyCap : public ExclusionRule { public: NewTabPageAdUuidFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~NewTabPageAdUuidFrequencyCap() override; @@ -35,8 +33,6 @@ class NewTabPageAdUuidFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap_unittest.cc index a474150351a4..9bcafe1beaf6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap_unittest.cc @@ -5,30 +5,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -40,77 +24,11 @@ const std::vector kUuids = { } // namespace -class BatAdsNewTabPageAdUuidFrequencyCapTest : public ::testing::Test { +class BatAdsNewTabPageAdUuidFrequencyCapTest : public UnitTestBase{ protected: - BatAdsNewTabPageAdUuidFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsNewTabPageAdUuidFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); + BatAdsNewTabPageAdUuidFrequencyCapTest() = default; - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsNewTabPageAdUuidFrequencyCapTest() override = default; }; TEST_F(BatAdsNewTabPageAdUuidFrequencyCapTest, @@ -121,9 +39,8 @@ TEST_F(BatAdsNewTabPageAdUuidFrequencyCapTest, const AdEventList ad_events; - NewTabPageAdUuidFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdUuidFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -146,9 +63,8 @@ TEST_F(BatAdsNewTabPageAdUuidFrequencyCapTest, ad_events.push_back(ad_event); - NewTabPageAdUuidFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdUuidFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert @@ -168,9 +84,8 @@ TEST_F(BatAdsNewTabPageAdUuidFrequencyCapTest, ad_events.push_back(ad_event); - NewTabPageAdUuidFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdUuidFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.cc index 845353106539..7c83ecd2370f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.cc @@ -10,20 +10,16 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { PerDayFrequencyCap::PerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } PerDayFrequencyCap::~PerDayFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.h index 82afe9445b64..e866055e18c4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.h @@ -9,19 +9,16 @@ #include #include "bat/ads/internal/ad_events/ad_event_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h" namespace ads { -class AdsImpl; struct CreativeAdInfo; class PerDayFrequencyCap : public ExclusionRule { public: PerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~PerDayFrequencyCap() override; @@ -35,8 +32,6 @@ class PerDayFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap_unittest.cc index c09ac288cf56..63fd83f461fc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap_unittest.cc @@ -5,109 +5,23 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/per_day_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeSetId[] = "654f10df-fbc4-4a92-8d43-2edf73734a60"; - } // namespace - -class BatAdsPerDayFrequencyCapTest : public ::testing::Test { +class BatAdsPerDayFrequencyCapTest : public UnitTestBase { protected: - BatAdsPerDayFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsPerDayFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); + BatAdsPerDayFrequencyCapTest() = default; - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsPerDayFrequencyCapTest() override = default; }; TEST_F(BatAdsPerDayFrequencyCapTest, @@ -119,9 +33,8 @@ TEST_F(BatAdsPerDayFrequencyCapTest, const AdEventList ad_events; - PerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + PerDayFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -142,9 +55,8 @@ TEST_F(BatAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); - PerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + PerDayFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -166,11 +78,10 @@ TEST_F(BatAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - PerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); + FastForwardClockBy(base::TimeDelta::FromDays(1)); // Act + PerDayFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -192,11 +103,10 @@ TEST_F(BatAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - PerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(23)); + FastForwardClockBy(base::TimeDelta::FromHours(23)); // Act + PerDayFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -218,9 +128,8 @@ TEST_F(BatAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - PerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + PerDayFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.cc index 47a50b36fc8d..8c842bd6528e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.cc @@ -10,12 +10,11 @@ #include #include "base/strings/stringprintf.h" +#include "base/time/time.h" #include "bat/ads/confirmation_type.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { @@ -24,11 +23,8 @@ const uint64_t kPerHourFrequencyCap = 1; } // namespace PerHourFrequencyCap::PerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } PerHourFrequencyCap::~PerHourFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.h index 5df22ede4eb7..687ff97f2e33 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.h @@ -9,19 +9,16 @@ #include #include "bat/ads/internal/ad_events/ad_event_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h" namespace ads { -class AdsImpl; struct CreativeAdInfo; class PerHourFrequencyCap : public ExclusionRule { public: PerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~PerHourFrequencyCap() override; @@ -35,8 +32,6 @@ class PerHourFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap_unittest.cc index fc9689ab1622..7cf573600644 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap_unittest.cc @@ -5,108 +5,23 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/per_hour_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsPerHourFrequencyCapTest : public ::testing::Test { +class BatAdsPerHourFrequencyCapTest : public UnitTestBase { protected: - BatAdsPerHourFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsPerHourFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); + BatAdsPerHourFrequencyCapTest() = default; - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsPerHourFrequencyCapTest() override = default; }; TEST_F(BatAdsPerHourFrequencyCapTest, @@ -117,9 +32,8 @@ TEST_F(BatAdsPerHourFrequencyCapTest, const AdEventList ad_events; - PerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + PerHourFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -139,11 +53,10 @@ TEST_F(BatAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); - PerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Act + PerHourFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -163,11 +76,10 @@ TEST_F(BatAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); - PerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act + PerHourFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.cc index 9b06903e811c..4cfba09249b0 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.cc @@ -11,7 +11,6 @@ #include "base/strings/stringprintf.h" #include "brave/components/l10n/browser/locale_helper.h" #include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/locale/subdivision_code_util.h" #include "bat/ads/internal/logging.h" @@ -60,9 +59,9 @@ bool DoesAdTargetSubdivision( } // namespace SubdivisionTargetingFrequencyCap::SubdivisionTargetingFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting) + : subdivision_targeting_(subdivision_targeting) { + DCHECK(subdivision_targeting_); } SubdivisionTargetingFrequencyCap::~SubdivisionTargetingFrequencyCap() = default; @@ -88,16 +87,16 @@ bool SubdivisionTargetingFrequencyCap::DoesRespectCap( const std::string locale = brave_l10n::LocaleHelper::GetInstance()->GetLocale(); - if (!ads_->get_subdivision_targeting()->ShouldAllowForLocale(locale)) { + if (!subdivision_targeting_->ShouldAllowForLocale(locale)) { return !DoesAdTargetSubdivision(ad); } - if (ads_->get_subdivision_targeting()->IsDisabled()) { + if (subdivision_targeting_->IsDisabled()) { return !DoesAdTargetSubdivision(ad); } const std::string subdivision_targeting_code = - ads_->get_subdivision_targeting()->GetAdsSubdivisionTargetingCode(); + subdivision_targeting_->GetAdsSubdivisionTargetingCode(); if (subdivision_targeting_code.empty()) { return false; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.h index 5d09837b1c55..1bbbbf705aa6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.h @@ -13,13 +13,18 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; +namespace ad_targeting { +namespace geographic { +class SubdivisionTargeting; +} // namespace geographic +} // namespace ad_targeting + class SubdivisionTargetingFrequencyCap : public ExclusionRule { public: SubdivisionTargetingFrequencyCap( - AdsImpl* ads); + ad_targeting::geographic::SubdivisionTargeting* subdivision_targeting); ~SubdivisionTargetingFrequencyCap() override; @@ -34,7 +39,8 @@ class SubdivisionTargetingFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED + ad_targeting::geographic::SubdivisionTargeting* + subdivision_targeting_; // NOT OWNED std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap_unittest.cc index 2651a072b449..983895af37b4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap_unittest.cc @@ -6,109 +6,35 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/subdivision_targeting_frequency_cap.h" #include +#include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" +#include "bat/ads/internal/ad_targeting/geographic/subdivision/subdivision_targeting.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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeSetId[] = "654f10df-fbc4-4a92-8d43-2edf73734a60"; - } // namespace -class BatAdsSubdivisionTargetingFrequencyCapTest : public ::testing::Test { +class BatAdsSubdivisionTargetingFrequencyCapTest : public UnitTestBase { protected: BatAdsSubdivisionTargetingFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - SubdivisionTargetingFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); + : subdivision_targeting_(std::make_unique< + ad_targeting::geographic::SubdivisionTargeting>()), + frequency_cap_(std::make_unique( + subdivision_targeting_.get())) { } - ~BatAdsSubdivisionTargetingFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + ~BatAdsSubdivisionTargetingFrequencyCapTest() override = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; + std::unique_ptr + subdivision_targeting_; std::unique_ptr frequency_cap_; - std::unique_ptr database_; }; TEST_F(BatAdsSubdivisionTargetingFrequencyCapTest, @@ -219,12 +145,11 @@ TEST_F(BatAdsSubdivisionTargetingFrequencyCapTest, TEST_F(BatAdsSubdivisionTargetingFrequencyCapTest, DoNotAllowAdIfSubdivisionTargetingIsNotSupportedForSubdivisionGeoTarget) { // Arrange - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-GB")); + MockLocaleHelper(locale_helper_mock_, "en-XX"); CreativeAdInfo ad; ad.creative_set_id = kCreativeSetId; - ad.geo_targets = { "GB-DEV" }; + ad.geo_targets = { "XX-DEV" }; // Act const bool should_exclude = frequency_cap_->ShouldExclude(ad); @@ -236,12 +161,11 @@ TEST_F(BatAdsSubdivisionTargetingFrequencyCapTest, TEST_F(BatAdsSubdivisionTargetingFrequencyCapTest, AllowAdIfSubdivisionTargetingIsNotSupportedForNonSubdivisionGeoTarget) { // Arrange - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-GB")); + MockLocaleHelper(locale_helper_mock_, "en-XX"); CreativeAdInfo ad; ad.creative_set_id = kCreativeSetId; - ad.geo_targets = { "GB" }; + ad.geo_targets = { "XX" }; // Act const bool should_exclude = frequency_cap_->ShouldExclude(ad); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.cc index 0f05feb1c1b1..7d33e1189a5d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.cc @@ -6,18 +6,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h" #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/logging.h" namespace ads { TotalMaxFrequencyCap::TotalMaxFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } TotalMaxFrequencyCap::~TotalMaxFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h index c8b51a580951..6dc206cb8ac6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h @@ -13,13 +13,11 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; class TotalMaxFrequencyCap : public ExclusionRule { public: TotalMaxFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~TotalMaxFrequencyCap() override; @@ -33,8 +31,6 @@ class TotalMaxFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap_unittest.cc index 762d971c757a..1c455114302f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap_unittest.cc @@ -5,30 +5,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/total_max_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -40,77 +24,11 @@ const std::vector kCreativeSetIds = { } // namespace -class BatAdsTotalMaxFrequencyCapTest : public ::testing::Test { +class BatAdsTotalMaxFrequencyCapTest : public UnitTestBase { protected: - BatAdsTotalMaxFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsTotalMaxFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + BatAdsTotalMaxFrequencyCapTest() = default; - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsTotalMaxFrequencyCapTest() override = default; }; TEST_F(BatAdsTotalMaxFrequencyCapTest, @@ -122,9 +40,8 @@ TEST_F(BatAdsTotalMaxFrequencyCapTest, const AdEventList ad_events; - TotalMaxFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TotalMaxFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -145,9 +62,8 @@ TEST_F(BatAdsTotalMaxFrequencyCapTest, ad_events.push_back(ad_event); - TotalMaxFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TotalMaxFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -172,9 +88,8 @@ TEST_F(BatAdsTotalMaxFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - TotalMaxFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TotalMaxFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert @@ -190,9 +105,8 @@ TEST_F(BatAdsTotalMaxFrequencyCapTest, const AdEventList ad_events; - TotalMaxFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TotalMaxFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -214,9 +128,8 @@ TEST_F(BatAdsTotalMaxFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - TotalMaxFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TotalMaxFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.cc index b26e0ae82289..9ad8c7b07785 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.cc @@ -10,11 +10,10 @@ #include #include "base/strings/stringprintf.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" namespace ads { @@ -23,11 +22,8 @@ const uint64_t kTransferredFrequencyCap = 1; } // namespace TransferredFrequencyCap::TransferredFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } TransferredFrequencyCap::~TransferredFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.h index 6c25fef6ccb3..abc3a2ec0e2c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.h @@ -13,13 +13,11 @@ namespace ads { -class AdsImpl; struct CreativeAdInfo; class TransferredFrequencyCap : public ExclusionRule { public: TransferredFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~TransferredFrequencyCap() override; @@ -33,8 +31,6 @@ class TransferredFrequencyCap : public ExclusionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap_unittest.cc index 8e453abd0ec2..403a7846abf9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap_unittest.cc @@ -5,30 +5,14 @@ #include "bat/ads/internal/frequency_capping/exclusion_rules/transferred_frequency_cap.h" -#include #include -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { @@ -42,77 +26,11 @@ const std::vector kCampaignIds = { } // namespace -class BatAdsTransferredFrequencyCapTest : public ::testing::Test { +class BatAdsTransferredFrequencyCapTest : public UnitTestBase { protected: - BatAdsTransferredFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsTransferredFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + BatAdsTransferredFrequencyCapTest() = default; - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsTransferredFrequencyCapTest() override = default; }; TEST_F(BatAdsTransferredFrequencyCapTest, @@ -124,9 +42,8 @@ TEST_F(BatAdsTransferredFrequencyCapTest, const AdEventList ad_events; - TransferredFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + TransferredFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -151,11 +68,10 @@ TEST_F(BatAdsTransferredFrequencyCapTest, ad_events.push_back(ad_event); - TransferredFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); // Act + TransferredFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert @@ -176,11 +92,10 @@ TEST_F(BatAdsTransferredFrequencyCapTest, ad_events.push_back(ad_event); - TransferredFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(47)); // Act + TransferredFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -201,11 +116,10 @@ TEST_F(BatAdsTransferredFrequencyCapTest, ad_events.push_back(ad_event); - TransferredFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); // Act + TransferredFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad); // Assert @@ -230,11 +144,10 @@ TEST_F(BatAdsTransferredFrequencyCapTest, ad_events.push_back(ad_event); - TransferredFrequencyCap frequency_cap(ads_.get(), ad_events); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(48)); // Act + TransferredFrequencyCap frequency_cap(ad_events); const bool should_exclude = frequency_cap.ShouldExclude(ad_1); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_unittest_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_unittest_util.cc index 95fb18d10cd3..4c45bf0e4e3c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_unittest_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_unittest_util.cc @@ -8,7 +8,7 @@ #include #include "base/guid.h" -#include "bat/ads/internal/time_util.h" +#include "base/time/time.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.cc index f3fad6a488f2..a9c8cdc7f79b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.cc @@ -5,7 +5,7 @@ #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" -#include "bat/ads/internal/time_util.h" +#include "base/time/time.h" namespace ads { @@ -42,13 +42,13 @@ bool DoesHistoryRespectCapForRollingTimeConstraint( return true; } -uint64_t OccurrencesForRollingTimeConstraint( - const std::deque history, - const uint64_t time_constraint_in_seconds) { - uint64_t count = 0; +int OccurrencesForRollingTimeConstraint( + const std::deque history, + const int64_t time_constraint_in_seconds) { + int count = 0; - const uint64_t now_in_seconds = - static_cast(base::Time::Now().ToDoubleT()); + const int64_t now_in_seconds = + static_cast(base::Time::Now().ToDoubleT()); for (const auto& timestamp_in_seconds : history) { if (now_in_seconds - timestamp_in_seconds < time_constraint_in_seconds) { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.h index 83695059c32e..d74602566aee 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/frequency_capping_util.h @@ -22,9 +22,9 @@ bool DoesHistoryRespectCapForRollingTimeConstraint( const uint64_t time_constraint_in_seconds, const uint64_t cap); -uint64_t OccurrencesForRollingTimeConstraint( - const std::deque history, - const uint64_t time_constraint_in_seconds); +int OccurrencesForRollingTimeConstraint( + const std::deque history, + const int64_t time_constraint_in_seconds); } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.cc index a60fed01fe8a..a2f0cee90f09 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.cc @@ -6,7 +6,6 @@ #include "bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h" #include "bat/ads/ad_info.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule_util.h" #include "bat/ads/internal/frequency_capping/exclusion_rules/new_tab_page_ad_uuid_frequency_cap.h" #include "bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h" @@ -18,22 +17,19 @@ namespace ads { namespace new_tab_page_ads { FrequencyCapping::FrequencyCapping( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } FrequencyCapping::~FrequencyCapping() = default; bool FrequencyCapping::IsAdAllowed() { - NewTabPageAdsPerDayFrequencyCap ads_per_day_frequency_cap(ads_, ad_events_); + NewTabPageAdsPerDayFrequencyCap ads_per_day_frequency_cap(ad_events_); if (!ShouldAllow(&ads_per_day_frequency_cap)) { return false; } - NewTabPageAdsPerHourFrequencyCap ads_per_hour_frequency_cap(ads_, ad_events_); + NewTabPageAdsPerHourFrequencyCap ads_per_hour_frequency_cap(ad_events_); if (!ShouldAllow(&ads_per_hour_frequency_cap)) { return false; } @@ -43,7 +39,7 @@ bool FrequencyCapping::IsAdAllowed() { bool FrequencyCapping::ShouldExcludeAd( const AdInfo& ad) { - NewTabPageAdUuidFrequencyCap frequency_cap(ads_, ad_events_); + NewTabPageAdUuidFrequencyCap frequency_cap(ad_events_); return ShouldExclude(ad, &frequency_cap); } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h index 932f69037a6e..ccd6a843b0ee 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/new_tab_page_ads/new_tab_page_ads_frequency_capping.h @@ -10,7 +10,6 @@ namespace ads { -class AdsImpl; struct AdInfo; namespace new_tab_page_ads { @@ -18,7 +17,6 @@ namespace new_tab_page_ads { class FrequencyCapping { public: FrequencyCapping( - AdsImpl* ads, const AdEventList& ad_events); ~FrequencyCapping(); @@ -34,8 +32,6 @@ class FrequencyCapping { const AdInfo& ad); private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.cc index e9ef0b5a9020..50479e8c6cb8 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.cc @@ -9,20 +9,17 @@ #include -#include "bat/ads/internal/ads_impl.h" +#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/time_util.h" -#include "bat/ads/pref_names.h" #include "bat/ads/internal/logging.h" +#include "bat/ads/pref_names.h" namespace ads { AdsPerDayFrequencyCap::AdsPerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } AdsPerDayFrequencyCap::~AdsPerDayFrequencyCap() = default; @@ -50,7 +47,7 @@ bool AdsPerDayFrequencyCap::DoesRespectCap( base::Time::kHoursPerDay; const uint64_t cap = - ads_->get_ads_client()->GetUint64Pref(prefs::kAdsPerHour); + AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); return DoesHistoryRespectCapForRollingTimeConstraint( history, time_constraint, cap); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h index 1023b947a58a..1882b27d0ee9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class AdsPerDayFrequencyCap : public PermissionRule { public: AdsPerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~AdsPerDayFrequencyCap() override; @@ -31,8 +28,6 @@ class AdsPerDayFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; 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 00ba64b848c1..6f36947c2327 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 @@ -5,120 +5,35 @@ #include "bat/ads/internal/frequency_capping/permission_rules/ads_per_day_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsAdsPerDayFrequencyCapTest : public ::testing::Test { +class BatAdsAdsPerDayFrequencyCapTest : public UnitTestBase { protected: - BatAdsAdsPerDayFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsAdsPerDayFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); + BatAdsAdsPerDayFrequencyCapTest() = default; - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsAdsPerDayFrequencyCapTest() override = default; }; TEST_F(BatAdsAdsPerDayFrequencyCapTest, AllowAdIfThereIsNoAdsHistory) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); const AdEventList ad_events; - AdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + AdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -128,7 +43,7 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, TEST_F(BatAdsAdsPerDayFrequencyCapTest, AllowAdIfDoesNotExceedCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -140,9 +55,8 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); - AdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + AdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -152,7 +66,7 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, TEST_F(BatAdsAdsPerDayFrequencyCapTest, AllowAdIfDoesNotExceedCapAfter1Day) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -165,11 +79,10 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - AdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); + FastForwardClockBy(base::TimeDelta::FromDays(1)); // Act + AdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -179,7 +92,7 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, TEST_F(BatAdsAdsPerDayFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Day) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -192,11 +105,10 @@ TEST_F(BatAdsAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - AdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(23)); + FastForwardClockBy(base::TimeDelta::FromHours(23)); // Act + AdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert 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 e78670381190..1a5ca80edf8f 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 @@ -9,20 +9,17 @@ #include -#include "bat/ads/internal/ads_impl.h" +#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/internal/time_util.h" #include "bat/ads/pref_names.h" namespace ads { AdsPerHourFrequencyCap::AdsPerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } AdsPerHourFrequencyCap::~AdsPerHourFrequencyCap() = default; @@ -53,7 +50,7 @@ bool AdsPerHourFrequencyCap::DoesRespectCap( const uint64_t time_constraint = base::Time::kSecondsPerHour; const uint64_t cap = - ads_->get_ads_client()->GetUint64Pref(prefs::kAdsPerHour); + AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); 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.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.h index 54cbe9cf5c6c..7d59ce8731c0 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class AdsPerHourFrequencyCap : public PermissionRule { public: AdsPerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~AdsPerHourFrequencyCap() override; @@ -31,8 +28,6 @@ class AdsPerHourFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; 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 1901f58bfeb4..40828604c4e7 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 @@ -5,120 +5,60 @@ #include "bat/ads/internal/frequency_capping/permission_rules/ads_per_hour_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsAdsPerHourFrequencyCapTest : public ::testing::Test { +class BatAdsAdsPerHourFrequencyCapTest : public UnitTestBase { protected: - BatAdsAdsPerHourFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsAdsPerHourFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); + BatAdsAdsPerHourFrequencyCapTest() = default; - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); + ~BatAdsAdsPerHourFrequencyCapTest() override = default; +}; - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); +TEST_F(BatAdsAdsPerHourFrequencyCapTest, + AllowAdIfThereIsNoAdsHistory) { + // Arrange + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); - Initialize(ads_); - } + const AdEventList ad_events; - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } + // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); + const bool is_allowed = frequency_cap.ShouldAllow(); - // Objects declared here can be used by all tests in the test case + // Assert + EXPECT_TRUE(is_allowed); +} - base::test::TaskEnvironment task_environment_; +TEST_F(BatAdsAdsPerHourFrequencyCapTest, + AlwaysAllowAdOnAndroid) { + // Arrange + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); - base::ScopedTempDir temp_dir_; + MockPlatformHelper(platform_helper_mock_, PlatformType::kAndroid); - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; -}; + CreativeAdInfo ad; + ad.creative_instance_id = kCreativeInstanceId; -TEST_F(BatAdsAdsPerHourFrequencyCapTest, - AllowAdIfThereIsNoAdsHistory) { - // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdEventList ad_events; - const AdEventList ad_events; + const AdEventInfo ad_event = GenerateAdEvent(AdType::kAdNotification, ad, + ConfirmationType::kViewed); - AdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); + ad_events.push_back(ad_event); // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -126,12 +66,11 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, } TEST_F(BatAdsAdsPerHourFrequencyCapTest, - AlwaysAllowAdOnMobileDevices) { + AlwaysAllowAdOnIOS) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); - ON_CALL(*platform_helper_mock_, IsMobile()) - .WillByDefault(Return(true)); + MockPlatformHelper(platform_helper_mock_, PlatformType::kIOS); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -143,9 +82,8 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); - AdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -155,7 +93,7 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, TEST_F(BatAdsAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -167,9 +105,8 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); - AdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -179,7 +116,7 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, TEST_F(BatAdsAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCapAfter1Hour) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -191,11 +128,10 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); - AdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -205,7 +141,7 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, TEST_F(BatAdsAdsPerHourFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Hour) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -218,11 +154,10 @@ TEST_F(BatAdsAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); ad_events.push_back(ad_event); - AdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act + AdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc index b31e7cbfb35f..7d07f9a9759a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.cc @@ -5,16 +5,12 @@ #include "bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" namespace ads { -AllowNotificationsFrequencyCap::AllowNotificationsFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +AllowNotificationsFrequencyCap::AllowNotificationsFrequencyCap() = default; AllowNotificationsFrequencyCap::~AllowNotificationsFrequencyCap() = default; @@ -32,7 +28,7 @@ std::string AllowNotificationsFrequencyCap::get_last_message() const { } bool AllowNotificationsFrequencyCap::DoesRespectCap() { - return ads_->get_ads_client()->ShouldShowNotifications(); + return AdsClientHelper::Get()->ShouldShowNotifications(); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h index b65d94145fdc..3b649a640da1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class AllowNotificationsFrequencyCap : public PermissionRule { public: - AllowNotificationsFrequencyCap( - AdsImpl* ads); + AllowNotificationsFrequencyCap(); ~AllowNotificationsFrequencyCap() override; @@ -31,8 +28,6 @@ class AllowNotificationsFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap_unittest.cc index 4a8fcad97bba..61cb1fb7bb85 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap_unittest.cc @@ -5,102 +5,18 @@ #include "bat/ads/internal/frequency_capping/permission_rules/allow_notifications_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsAllowNotificationsFrequencyCapTest : public ::testing::Test { +class BatAdsAllowNotificationsFrequencyCapTest : public UnitTestBase{ protected: - BatAdsAllowNotificationsFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique< - AllowNotificationsFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsAllowNotificationsFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + BatAdsAllowNotificationsFrequencyCapTest() = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsAllowNotificationsFrequencyCapTest() override = default; }; TEST_F(BatAdsAllowNotificationsFrequencyCapTest, @@ -109,7 +25,8 @@ TEST_F(BatAdsAllowNotificationsFrequencyCapTest, MockShouldShowNotifications(ads_client_mock_, true); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + AllowNotificationsFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -121,7 +38,8 @@ TEST_F(BatAdsAllowNotificationsFrequencyCapTest, MockShouldShowNotifications(ads_client_mock_, false); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + AllowNotificationsFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.cc index d8783791b7c6..b5eda7b9933b 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.cc @@ -5,17 +5,13 @@ #include "bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/platform/platform_helper.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" namespace ads { -BrowserIsActiveFrequencyCap::BrowserIsActiveFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +BrowserIsActiveFrequencyCap::BrowserIsActiveFrequencyCap() = default; BrowserIsActiveFrequencyCap::~BrowserIsActiveFrequencyCap() = default; @@ -37,11 +33,7 @@ bool BrowserIsActiveFrequencyCap::DoesRespectCap() { return true; } - if (!ads_->IsForeground()) { - return false; - } - - return true; + return TabManager::Get()->IsForegrounded(); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h index a0a7759f0a96..a7aadfcf433a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class BrowserIsActiveFrequencyCap : public PermissionRule { public: - BrowserIsActiveFrequencyCap( - AdsImpl* ads); + BrowserIsActiveFrequencyCap(); ~BrowserIsActiveFrequencyCap() override; @@ -30,8 +27,6 @@ class BrowserIsActiveFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap_unittest.cc index 2de77368b530..f99be1256709 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap_unittest.cc @@ -5,125 +5,60 @@ #include "bat/ads/internal/frequency_capping/permission_rules/browser_is_active_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsBrowserIsActiveFrequencyCapTest : public ::testing::Test { +class BatAdsBrowserIsActiveFrequencyCapTest : public UnitTestBase { protected: - BatAdsBrowserIsActiveFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique< - BrowserIsActiveFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsBrowserIsActiveFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); + BatAdsBrowserIsActiveFrequencyCapTest() = default; - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case + ~BatAdsBrowserIsActiveFrequencyCapTest() override = default; +}; - base::test::TaskEnvironment task_environment_; +TEST_F(BatAdsBrowserIsActiveFrequencyCapTest, + AllowAd) { + // Arrange + MockPlatformHelper(platform_helper_mock_, PlatformType::kWindows); - base::ScopedTempDir temp_dir_; + // Act + TabManager::Get()->OnForegrounded(); - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; -}; + // Assert + BrowserIsActiveFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); + EXPECT_TRUE(is_allowed); +} TEST_F(BatAdsBrowserIsActiveFrequencyCapTest, - AllowAd) { + AlwaysAllowAdForAndroid) { // Arrange - ads_->OnForeground(); + MockPlatformHelper(platform_helper_mock_, PlatformType::kAndroid); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + TabManager::Get()->OnBackgrounded(); // Assert + BrowserIsActiveFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } TEST_F(BatAdsBrowserIsActiveFrequencyCapTest, DoNotAllowAd) { // Arrange - ads_->OnBackground(); + MockPlatformHelper(platform_helper_mock_, PlatformType::kWindows); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + TabManager::Get()->OnBackgrounded(); // Assert + BrowserIsActiveFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_FALSE(is_allowed); } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.cc index 428e99572d1d..01eda8890161 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.cc @@ -5,29 +5,20 @@ #include "bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h" -#include "bat/ads/internal/ad_server/ad_server.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/bundle.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/catalog/catalog_issuers_info.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/catalog/catalog_util.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" namespace ads { -CatalogFrequencyCap::CatalogFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +CatalogFrequencyCap::CatalogFrequencyCap() = default; CatalogFrequencyCap::~CatalogFrequencyCap() = default; bool CatalogFrequencyCap::ShouldAllow() { - if (!DoesRespectCap()) { - return false; - } - - return true; + return DoesRespectCap(); } std::string CatalogFrequencyCap::get_last_message() const { @@ -35,21 +26,20 @@ std::string CatalogFrequencyCap::get_last_message() const { } bool CatalogFrequencyCap::DoesRespectCap() { - const CatalogIssuersInfo catalog_issuers = - ads_->get_confirmations()->GetCatalogIssuers(); - if (!catalog_issuers.IsValid()) { - last_message_ = "Catalog issuers not initialized"; + if (!DoesCatalogExist()) { + last_message_ = "Catalog does not exist"; return false; } - if (!ads_->get_bundle()->Exists()) { - last_message_ = "Bundle does not exist"; + if (HasCatalogExpired()) { + last_message_ = "Catalog has expired"; return false; } - if (ads_->get_bundle()->IsOlderThanOneDay()) { - last_message_ = "Bundle is out of date"; - ads_->get_ad_server()->MaybeFetch(); + const CatalogIssuersInfo catalog_issuers = + ConfirmationsState::Get()->get_catalog_issuers(); + if (!catalog_issuers.IsValid()) { + last_message_ = "Invalid catalog issuers"; return false; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h index 5880b748b416..557c3237f1b9 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class CatalogFrequencyCap : public PermissionRule { public: - CatalogFrequencyCap( - AdsImpl* ads); + CatalogFrequencyCap(); ~CatalogFrequencyCap() override; @@ -29,8 +26,6 @@ class CatalogFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap_unittest.cc index ff1ea044b2eb..911963d8bf7a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap_unittest.cc @@ -5,100 +5,24 @@ #include "bat/ads/internal/frequency_capping/permission_rules/catalog_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" #include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsCatalogFrequencyCapTest : public ::testing::Test { +class BatAdsCatalogFrequencyCapTest : public UnitTestBase { protected: - BatAdsCatalogFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsCatalogFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } + BatAdsCatalogFrequencyCapTest() = default; - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods + ~BatAdsCatalogFrequencyCapTest() override = default; void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) + UnitTestBase::SetUpForTesting(/* integration_test */ true); } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; }; TEST_F(BatAdsCatalogFrequencyCapTest, @@ -116,17 +40,18 @@ TEST_F(BatAdsCatalogFrequencyCapTest, MockUrlRequest(ads_client_mock_, endpoints); - Initialize(ads_); + InitializeAds(); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + CatalogFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); } TEST_F(BatAdsCatalogFrequencyCapTest, - AllowAdIfBundleWasLastUpdated23HoursAnd59MinutesAgo) { + AllowAdIfCatalogWasLastUpdated23HoursAnd59MinutesAgo) { // Arrange const URLEndpoints endpoints = { { @@ -140,20 +65,21 @@ TEST_F(BatAdsCatalogFrequencyCapTest, MockUrlRequest(ads_client_mock_, endpoints); - Initialize(ads_); + InitializeAds(); - task_environment_.AdvanceClock(base::TimeDelta::FromHours(23) + + AdvanceClock(base::TimeDelta::FromHours(23) + base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + CatalogFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); } TEST_F(BatAdsCatalogFrequencyCapTest, - DoNotAllowAdIfBundleWasLastUpdated1DayAgo) { + DoNotAllowAdIfCatalogWasLastUpdated1DayAgo) { // Arrange const URLEndpoints endpoints = { { @@ -167,24 +93,26 @@ TEST_F(BatAdsCatalogFrequencyCapTest, MockUrlRequest(ads_client_mock_, endpoints); - Initialize(ads_); + InitializeAds(); - task_environment_.AdvanceClock(base::TimeDelta::FromDays(1)); + AdvanceClock(base::TimeDelta::FromDays(1)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + CatalogFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); } TEST_F(BatAdsCatalogFrequencyCapTest, - DoNotAllowAdIfBundleDoesNotExist) { + DoNotAllowAdIfCatalogDoesNotExist) { // Arrange - Initialize(ads_); + AdsClientHelper::Get()->SetIntegerPref(prefs::kCatalogVersion, 0); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + CatalogFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.cc index 8fa474a84e3a..2f519ada4105 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.cc @@ -5,10 +5,10 @@ #include "bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h" -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/platform/platform_helper.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" namespace ads { @@ -19,11 +19,7 @@ const int kDoNotDisturbToHour = 6; // 6am } // namespace -DoNotDisturbFrequencyCap::DoNotDisturbFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +DoNotDisturbFrequencyCap::DoNotDisturbFrequencyCap() = default; DoNotDisturbFrequencyCap::~DoNotDisturbFrequencyCap() = default; @@ -45,7 +41,7 @@ bool DoNotDisturbFrequencyCap::DoesRespectCap() { return true; } - if (ads_->IsForeground()) { + if (TabManager::Get()->IsForegrounded()) { return true; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h index 9c93abe37b44..9de5963d3590 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class DoNotDisturbFrequencyCap : public PermissionRule { public: - DoNotDisturbFrequencyCap( - AdsImpl* ads); + DoNotDisturbFrequencyCap(); ~DoNotDisturbFrequencyCap() override; @@ -29,8 +26,6 @@ class DoNotDisturbFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap_unittest.cc index 9104b98d5e95..ebbfaa35d466 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap_unittest.cc @@ -5,102 +5,18 @@ #include "bat/ads/internal/frequency_capping/permission_rules/do_not_disturb_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsDoNotDisturbFrequencyCapTest : public ::testing::Test { +class BatAdsDoNotDisturbFrequencyCapTest : public UnitTestBase { protected: - BatAdsDoNotDisturbFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsDoNotDisturbFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - void AdvanceClock( - const base::TimeDelta& time_delta) { - task_environment_.AdvanceClock(time_delta); - } + BatAdsDoNotDisturbFrequencyCapTest() = default; - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsDoNotDisturbFrequencyCapTest() override = default; }; TEST_F(BatAdsDoNotDisturbFrequencyCapTest, @@ -108,12 +24,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Arrange MockPlatformHelper(platform_helper_mock_, PlatformType::kAndroid); - Initialize(ads_); - - ads_->OnBackground(); + TabManager::Get()->OnBackgrounded(); - AdvanceClock(base::Time::Now().LocalMidnight() + - base::TimeDelta::FromHours(24) - base::Time::Now()); + AdvanceClockToMidnightUTC(); // Act { @@ -121,9 +34,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, AdvanceClock(base::TimeDelta::FromHours(5) + base::TimeDelta::FromMinutes(59)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_FALSE(is_allowed); } @@ -131,9 +44,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 6:00 AM AdvanceClock(base::TimeDelta::FromMinutes(1)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -142,9 +55,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, AdvanceClock(base::TimeDelta::FromHours(14) + base::TimeDelta::FromMinutes(59)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -152,9 +65,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 9:00 PM AdvanceClock(base::TimeDelta::FromMinutes(1)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_FALSE(is_allowed); } } @@ -164,9 +77,7 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Arrange MockPlatformHelper(platform_helper_mock_, PlatformType::kAndroid); - Initialize(ads_); - - ads_->OnForeground(); + TabManager::Get()->OnForegrounded(); AdvanceClock(base::Time::Now().LocalMidnight() + base::TimeDelta::FromHours(24) - base::Time::Now()); @@ -177,9 +88,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, AdvanceClock(base::TimeDelta::FromHours(5) + base::TimeDelta::FromMinutes(59)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -187,9 +98,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 6:00 AM AdvanceClock(base::TimeDelta::FromMinutes(1)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -198,9 +109,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, AdvanceClock(base::TimeDelta::FromHours(14) + base::TimeDelta::FromMinutes(59)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -208,9 +119,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 9:00 PM AdvanceClock(base::TimeDelta::FromMinutes(1)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } } @@ -220,7 +131,7 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Arrange MockPlatformHelper(platform_helper_mock_, PlatformType::kIOS); - Initialize(ads_); + TabManager::Get()->OnForegrounded(); AdvanceClock(base::Time::Now().LocalMidnight() + base::TimeDelta::FromHours(24) - base::Time::Now()); @@ -228,9 +139,10 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Act { // Verify 00:00 AM - const bool is_allowed = frequency_cap_->ShouldAllow(); // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -238,9 +150,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 12:00 PM AdvanceClock(base::TimeDelta::FromHours(12)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } } @@ -248,9 +160,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, TEST_F(BatAdsDoNotDisturbFrequencyCapTest, AlwaysAllowAdForMacOS) { // Arrange - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); + MockPlatformHelper(platform_helper_mock_, PlatformType::kWindows); - Initialize(ads_); + TabManager::Get()->OnForegrounded(); AdvanceClock(base::Time::Now().LocalMidnight() + base::TimeDelta::FromHours(24) - base::Time::Now()); @@ -258,9 +170,10 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Act { // Verify 00:00 AM - const bool is_allowed = frequency_cap_->ShouldAllow(); // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -268,9 +181,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 12:00 PM AdvanceClock(base::TimeDelta::FromHours(12)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } } @@ -280,7 +193,7 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Arrange MockPlatformHelper(platform_helper_mock_, PlatformType::kWindows); - Initialize(ads_); + TabManager::Get()->OnForegrounded(); AdvanceClock(base::Time::Now().LocalMidnight() + base::TimeDelta::FromHours(24) - base::Time::Now()); @@ -288,9 +201,10 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Act { // Verify 00:00 AM - const bool is_allowed = frequency_cap_->ShouldAllow(); // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -298,9 +212,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 12:00 PM AdvanceClock(base::TimeDelta::FromHours(12)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } } @@ -310,7 +224,7 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Arrange MockPlatformHelper(platform_helper_mock_, PlatformType::kLinux); - Initialize(ads_); + TabManager::Get()->OnForegrounded(); AdvanceClock(base::Time::Now().LocalMidnight() + base::TimeDelta::FromHours(24) - base::Time::Now()); @@ -318,9 +232,10 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Act { // Verify 00:00 AM - const bool is_allowed = frequency_cap_->ShouldAllow(); // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } @@ -328,9 +243,9 @@ TEST_F(BatAdsDoNotDisturbFrequencyCapTest, // Verify 12:00 PM AdvanceClock(base::TimeDelta::FromHours(12)); - const bool is_allowed = frequency_cap_->ShouldAllow(); - // Assert + DoNotDisturbFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); EXPECT_TRUE(is_allowed); } } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.cc index 658b1d29b95a..6b0277ff0801 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.cc @@ -5,18 +5,13 @@ #include "bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h" -#include "bat/ads/internal/ads_impl.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" -#include "bat/ads/internal/tabs/tab_info.h" -#include "bat/ads/internal/tabs/tabs.h" +#include "bat/ads/internal/tab_manager/tab_info.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" namespace ads { -MediaFrequencyCap::MediaFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +MediaFrequencyCap::MediaFrequencyCap() = default; MediaFrequencyCap::~MediaFrequencyCap() = default; @@ -34,8 +29,12 @@ std::string MediaFrequencyCap::get_last_message() const { } bool MediaFrequencyCap::DoesRespectCap() { - const TabInfo tab = ads_->get_tabs()->GetVisible(); - return !ads_->get_tabs()->IsPlayingMedia(tab.id); + const base::Optional tab = TabManager::Get()->GetVisible(); + if (!tab) { + return true; + } + + return !TabManager::Get()->IsPlayingMedia(tab->id); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h index 7dc9ed6bf048..ed7231ab9762 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class MediaFrequencyCap : public PermissionRule { public: - MediaFrequencyCap( - AdsImpl* ads); + MediaFrequencyCap(); ~MediaFrequencyCap() override; @@ -29,8 +26,6 @@ class MediaFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap_unittest.cc index ef15cbe8650a..65bce744fb6a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap_unittest.cc @@ -5,101 +5,18 @@ #include "bat/ads/internal/frequency_capping/permission_rules/media_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsMediaFrequencyCapTest : public ::testing::Test { +class BatAdsMediaFrequencyCapTest : public UnitTestBase { protected: - BatAdsMediaFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsMediaFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + BatAdsMediaFrequencyCapTest() = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsMediaFrequencyCapTest() override = default; }; TEST_F(BatAdsMediaFrequencyCapTest, @@ -107,7 +24,8 @@ TEST_F(BatAdsMediaFrequencyCapTest, // Arrange // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -116,13 +34,14 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, AllowAdIfMediaIsStoppedForSingleTab) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); - ads_->OnMediaStopped(1); + TabManager::Get()->OnMediaPlaying(1); + TabManager::Get()->OnMediaStopped(1); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -131,15 +50,16 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, AllowAdIfMediaIsStoppedOnMultipleTabs) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); - ads_->OnMediaPlaying(2); - ads_->OnMediaStopped(1); - ads_->OnMediaStopped(2); + TabManager::Get()->OnMediaPlaying(1); + TabManager::Get()->OnMediaPlaying(2); + TabManager::Get()->OnMediaStopped(1); + TabManager::Get()->OnMediaStopped(2); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -148,14 +68,15 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, AllowAdIfMediaIsPlayingOnMultipleTabsButStoppedForVisibleTab) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); - ads_->OnMediaPlaying(2); - ads_->OnMediaStopped(1); + TabManager::Get()->OnMediaPlaying(1); + TabManager::Get()->OnMediaPlaying(2); + TabManager::Get()->OnMediaStopped(1); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -164,12 +85,13 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, DoNotAllowAdIfMediaIsPlayingOnVisibleTab) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); + TabManager::Get()->OnMediaPlaying(1); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); @@ -178,13 +100,14 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, DoNotAllowAdIfMediaIsPlayingOnMultipleTabs) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); - ads_->OnMediaPlaying(2); + TabManager::Get()->OnMediaPlaying(1); + TabManager::Get()->OnMediaPlaying(2); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); @@ -193,14 +116,15 @@ TEST_F(BatAdsMediaFrequencyCapTest, TEST_F(BatAdsMediaFrequencyCapTest, DoNotAllowAdIfMediaIsPlayingOnMultipleTabsButStoppedForOccludedTab) { // Arrange - ads_->OnTabUpdated(1, "https://brave.com", true, true, false); + TabManager::Get()->OnUpdated(1, "https://brave.com", true, false); - ads_->OnMediaPlaying(1); - ads_->OnMediaPlaying(2); - ads_->OnMediaStopped(2); + TabManager::Get()->OnMediaPlaying(1); + TabManager::Get()->OnMediaPlaying(2); + TabManager::Get()->OnMediaStopped(2); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + MediaFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); 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 8d91a22b46b3..6a016e82fa42 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 @@ -9,10 +9,10 @@ #include -#include "bat/ads/internal/ads_impl.h" +#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/internal/time_util.h" #include "bat/ads/pref_names.h" namespace ads { @@ -22,11 +22,8 @@ const uint64_t kMinimumWaitTimeFrequencyCap = 1; } // namespace MinimumWaitTimeFrequencyCap::MinimumWaitTimeFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } MinimumWaitTimeFrequencyCap::~MinimumWaitTimeFrequencyCap() = default; @@ -55,7 +52,7 @@ bool MinimumWaitTimeFrequencyCap::DoesRespectCap( GetTimestampHistoryForAdEvents(ad_events); const uint64_t ads_per_hour = - ads_->get_ads_client()->GetUint64Pref(prefs::kAdsPerHour); + AdsClientHelper::Get()->GetUint64Pref(prefs::kAdsPerHour); 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/minimum_wait_time_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.h index 04412962640c..276e01a25cbd 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class MinimumWaitTimeFrequencyCap : public PermissionRule { public: MinimumWaitTimeFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~MinimumWaitTimeFrequencyCap() override; @@ -32,8 +29,6 @@ class MinimumWaitTimeFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap_unittest.cc index 8725c851e951..0e3a1233d389 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap_unittest.cc @@ -5,120 +5,35 @@ #include "bat/ads/internal/frequency_capping/permission_rules/minimum_wait_time_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsMinimumWaitTimeFrequencyCapTest : public ::testing::Test { +class BatAdsMinimumWaitTimeFrequencyCapTest : public UnitTestBase { protected: - BatAdsMinimumWaitTimeFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsMinimumWaitTimeFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); + BatAdsMinimumWaitTimeFrequencyCapTest() = default; - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsMinimumWaitTimeFrequencyCapTest() override = default; }; TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, AllowAdIfThereIsNoAdsHistory) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); const AdEventList ad_events; - MinimumWaitTimeFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + MinimumWaitTimeFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -128,7 +43,7 @@ TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, AllowAdIfDoesNotExceedCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 5); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 5); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -140,11 +55,10 @@ TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, ad_events.push_back(ad_event); - MinimumWaitTimeFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(12)); + FastForwardClockBy(base::TimeDelta::FromMinutes(12)); // Act + MinimumWaitTimeFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -154,7 +68,7 @@ TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, DoNotAllowAdIfExceedsCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 5); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 5); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -166,11 +80,10 @@ TEST_F(BatAdsMinimumWaitTimeFrequencyCapTest, ad_events.push_back(ad_event); - MinimumWaitTimeFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(11)); + FastForwardClockBy(base::TimeDelta::FromMinutes(11)); // Act + MinimumWaitTimeFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.cc index 110da8a2e9e9..9cd593159b17 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.cc @@ -5,16 +5,12 @@ #include "bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" namespace ads { -NetworkConnectionFrequencyCap::NetworkConnectionFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +NetworkConnectionFrequencyCap::NetworkConnectionFrequencyCap() = default; NetworkConnectionFrequencyCap::~NetworkConnectionFrequencyCap() = default; @@ -32,7 +28,7 @@ std::string NetworkConnectionFrequencyCap::get_last_message() const { } bool NetworkConnectionFrequencyCap::DoesRespectCap() { - return ads_->get_ads_client()->IsNetworkConnectionAvailable(); + return AdsClientHelper::Get()->IsNetworkConnectionAvailable(); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h index c6fd48a004f6..77724aed36c3 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class NetworkConnectionFrequencyCap : public PermissionRule { public: - NetworkConnectionFrequencyCap( - AdsImpl* ads); + NetworkConnectionFrequencyCap(); ~NetworkConnectionFrequencyCap() override; @@ -30,8 +27,6 @@ class NetworkConnectionFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap_unittest.cc index ecbc3a2b99b1..27c2f2803907 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap_unittest.cc @@ -5,102 +5,18 @@ #include "bat/ads/internal/frequency_capping/permission_rules/network_connection_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsNetworkConnectionFrequencyCapTest : public ::testing::Test { +class BatAdsNetworkConnectionFrequencyCapTest : public UnitTestBase { protected: - BatAdsNetworkConnectionFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique>()), - frequency_cap_(std::make_unique< - NetworkConnectionFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsNetworkConnectionFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + BatAdsNetworkConnectionFrequencyCapTest() = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsNetworkConnectionFrequencyCapTest() override = default; }; TEST_F(BatAdsNetworkConnectionFrequencyCapTest, @@ -109,7 +25,8 @@ TEST_F(BatAdsNetworkConnectionFrequencyCapTest, MockIsNetworkConnectionAvailable(ads_client_mock_, true); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + NetworkConnectionFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -121,7 +38,8 @@ TEST_F(BatAdsNetworkConnectionFrequencyCapTest, MockIsNetworkConnectionAvailable(ads_client_mock_, false); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + NetworkConnectionFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.cc index aba6e7542e7f..24cb6aaeb821 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.cc @@ -9,9 +9,8 @@ #include -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" -#include "bat/ads/internal/time_util.h" namespace ads { @@ -20,11 +19,8 @@ const uint64_t kNewTabPageAdsPerDayFrequencyCap = 20; } // namespace NewTabPageAdsPerDayFrequencyCap::NewTabPageAdsPerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } NewTabPageAdsPerDayFrequencyCap::~NewTabPageAdsPerDayFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h index 004b1bb07460..7b9fee78f7cb 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class NewTabPageAdsPerDayFrequencyCap : public PermissionRule { public: NewTabPageAdsPerDayFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~NewTabPageAdsPerDayFrequencyCap() override; @@ -33,8 +30,6 @@ class NewTabPageAdsPerDayFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; 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 b6d17b65e238..5aeee3bd4230 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 @@ -5,120 +5,35 @@ #include "bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_day_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsNewTabPageAdsPerDayFrequencyCapTest : public ::testing::Test { +class BatAdsNewTabPageAdsPerDayFrequencyCapTest : public UnitTestBase { protected: - BatAdsNewTabPageAdsPerDayFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsNewTabPageAdsPerDayFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + BatAdsNewTabPageAdsPerDayFrequencyCapTest() = default; - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsNewTabPageAdsPerDayFrequencyCapTest() override = default; }; TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, AllowAdIfThereIsNoAdsHistory) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); const AdEventList ad_events; - NewTabPageAdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -128,7 +43,7 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, AllowAdIfDoesNotExceedCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -142,9 +57,8 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -154,7 +68,7 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, AllowAdIfDoesNotExceedCapAfter1Day) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -168,11 +82,10 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); + FastForwardClockBy(base::TimeDelta::FromDays(1)); // Act + NewTabPageAdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -182,7 +95,7 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Day) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerDay, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerDay, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -196,11 +109,10 @@ TEST_F(BatAdsNewTabPageAdsPerDayFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerDayFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(23)); + FastForwardClockBy(base::TimeDelta::FromHours(23)); // Act + NewTabPageAdsPerDayFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.cc index 6ab0d6b6f446..d85ce9664bf7 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.cc @@ -9,9 +9,8 @@ #include -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" -#include "bat/ads/internal/time_util.h" namespace ads { @@ -20,11 +19,8 @@ const uint64_t kNewTabPageAdsPerHourFrequencyCap = 4; } // namespace NewTabPageAdsPerHourFrequencyCap::NewTabPageAdsPerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events) - : ads_(ads), - ad_events_(ad_events) { - DCHECK(ads_); + : ad_events_(ad_events) { } NewTabPageAdsPerHourFrequencyCap::~NewTabPageAdsPerHourFrequencyCap() = default; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.h index c70d0628f614..19ce737548cb 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class NewTabPageAdsPerHourFrequencyCap : public PermissionRule { public: NewTabPageAdsPerHourFrequencyCap( - AdsImpl* ads, const AdEventList& ad_events); ~NewTabPageAdsPerHourFrequencyCap() override; @@ -33,8 +30,6 @@ class NewTabPageAdsPerHourFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - AdEventList ad_events_; std::string last_message_; 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 ee2ce4a18d2d..c33580db009f 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 @@ -5,120 +5,35 @@ #include "bat/ads/internal/frequency_capping/permission_rules/new_tab_page_ads_per_hour_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/bundle/creative_ad_info.h" #include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_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* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace { - const char kCreativeInstanceId[] = "9aea9a47-c6a0-4718-a0fa-706338bb2156"; - } // namespace -class BatAdsNewTabPageAdsPerHourFrequencyCapTest : public ::testing::Test { +class BatAdsNewTabPageAdsPerHourFrequencyCapTest : public UnitTestBase { protected: - BatAdsNewTabPageAdsPerHourFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsNewTabPageAdsPerHourFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); + BatAdsNewTabPageAdsPerHourFrequencyCapTest() = default; - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; + ~BatAdsNewTabPageAdsPerHourFrequencyCapTest() override = default; }; TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, AllowAdIfThereIsNoAdsHistory) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); const AdEventList ad_events; - NewTabPageAdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -128,7 +43,7 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCap) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -142,9 +57,8 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - // Act + NewTabPageAdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -154,7 +68,7 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, AllowAdIfDoesNotExceedCapAfter1Hour) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -168,11 +82,10 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Act + NewTabPageAdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert @@ -182,7 +95,7 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, DoNotAllowAdIfExceedsCapWithin1Hour) { // Arrange - ads_->get_ads_client()->SetUint64Pref(prefs::kAdsPerHour, 2); + AdsClientHelper::Get()->SetUint64Pref(prefs::kAdsPerHour, 2); CreativeAdInfo ad; ad.creative_instance_id = kCreativeInstanceId; @@ -196,11 +109,10 @@ TEST_F(BatAdsNewTabPageAdsPerHourFrequencyCapTest, ad_events.push_back(ad_event); } - NewTabPageAdsPerHourFrequencyCap frequency_cap(ads_.get(), ad_events); - - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act + NewTabPageAdsPerHourFrequencyCap frequency_cap(ad_events); const bool is_allowed = frequency_cap.ShouldAllow(); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.cc index fc08c99463b0..006cae8f2b6e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.cc @@ -5,11 +5,8 @@ #include "bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h" -#include "bat/ads/internal/account/wallet.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" -#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h" namespace ads { @@ -17,19 +14,12 @@ namespace { const int kUnblindedTokensMinimumThreshold = 10; } // namespace -UnblindedTokensFrequencyCap::UnblindedTokensFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +UnblindedTokensFrequencyCap::UnblindedTokensFrequencyCap() = default; UnblindedTokensFrequencyCap::~UnblindedTokensFrequencyCap() = default; bool UnblindedTokensFrequencyCap::ShouldAllow() { if (!DoesRespectCap()) { - const WalletInfo wallet = ads_->get_wallet()->Get(); - ads_->get_refill_unblinded_tokens()->MaybeRefill(wallet); - last_message_ = "You do not have enough unblinded tokens"; return false; } @@ -42,7 +32,7 @@ std::string UnblindedTokensFrequencyCap::get_last_message() const { } bool UnblindedTokensFrequencyCap::DoesRespectCap() { - const int count = ads_->get_confirmations()->get_unblinded_tokens()->Count(); + const int count = ConfirmationsState::Get()->get_unblinded_tokens()->Count(); if (count < kUnblindedTokensMinimumThreshold) { return false; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h index fec8ee06cd8f..b5565ea174bd 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h @@ -12,12 +12,9 @@ namespace ads { -class AdsImpl; - class UnblindedTokensFrequencyCap : public PermissionRule { public: - UnblindedTokensFrequencyCap( - AdsImpl* ads); + UnblindedTokensFrequencyCap(); ~UnblindedTokensFrequencyCap() override; @@ -31,8 +28,6 @@ class UnblindedTokensFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap_unittest.cc index fa9f9b94c305..4f7b44e648c5 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap_unittest.cc @@ -5,110 +5,24 @@ #include "bat/ads/internal/frequency_capping/permission_rules/unblinded_tokens_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsUnblindedTokensFrequencyCapTest : public ::testing::Test { +class BatAdsUnblindedTokensFrequencyCapTest : public UnitTestBase { protected: - BatAdsUnblindedTokensFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - UnblindedTokensFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsUnblindedTokensFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); + BatAdsUnblindedTokensFrequencyCapTest() = default; - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case + ~BatAdsUnblindedTokensFrequencyCapTest() override = default; privacy::UnblindedTokens* get_unblinded_tokens() { - return ads_->get_confirmations()->get_unblinded_tokens(); + return ConfirmationsState::Get()->get_unblinded_tokens(); } - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; }; TEST_F(BatAdsUnblindedTokensFrequencyCapTest, @@ -120,7 +34,8 @@ TEST_F(BatAdsUnblindedTokensFrequencyCapTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UnblindedTokensFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -131,7 +46,8 @@ TEST_F(BatAdsUnblindedTokensFrequencyCapTest, // Arrange // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UnblindedTokensFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); @@ -146,7 +62,8 @@ TEST_F(BatAdsUnblindedTokensFrequencyCapTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UnblindedTokensFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.cc index 6a987cdeaac8..fad43648f30e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.cc @@ -7,24 +7,40 @@ #include -#include "bat/ads/internal/ads_impl.h" +#include "base/time/time.h" #include "bat/ads/internal/frequency_capping/frequency_capping_util.h" #include "bat/ads/internal/platform/platform_helper.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/user_activity/user_activity.h" namespace ads { -UserActivityFrequencyCap::UserActivityFrequencyCap( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); +namespace { + +double GetPointsForEventType( + const UserActivityEventType event_type) { + switch (event_type) { + case UserActivityEventType::kOpenedNewOrFocusedOnExistingTab: + case UserActivityEventType::kClosedTab: + case UserActivityEventType::kPlayedMedia: { + return 1.0; + } + + case UserActivityEventType::kBrowserWindowDidBecomeActive: + case UserActivityEventType::kBrowserWindowDidEnterBackground: { + return 0.5; + } + } } +} // namespace + +UserActivityFrequencyCap::UserActivityFrequencyCap() = default; + UserActivityFrequencyCap::~UserActivityFrequencyCap() = default; bool UserActivityFrequencyCap::ShouldAllow() { - const UserActivityHistoryMap history = - ads_->get_user_activity()->get_history(); + const UserActivityEventHistoryMap history = + UserActivity::Get()->get_history(); if (!DoesRespectCap(history)) { return false; } @@ -37,48 +53,32 @@ std::string UserActivityFrequencyCap::get_last_message() const { } bool UserActivityFrequencyCap::DoesRespectCap( - const UserActivityHistoryMap& history) { + const UserActivityEventHistoryMap& history) { if (PlatformHelper::GetInstance()->IsMobile()) { return true; } - const uint64_t time_constraint = base::Time::kSecondsPerHour; + const int64_t time_constraint = base::Time::kSecondsPerHour; - double total_score = 0.0; + double score = 0.0; for (const auto& item : history) { - const UserActivityHistory user_activity_history = item.second; + const UserActivityEventHistory user_activity_event_history = item.second; - const uint64_t occurrences = OccurrencesForRollingTimeConstraint( - user_activity_history, time_constraint); + const int occurrences = OccurrencesForRollingTimeConstraint( + user_activity_event_history, time_constraint); if (occurrences == 0) { continue; } - double score; - - const UserActivityType user_activity_type = item.first; - - switch (user_activity_type) { - case UserActivityType::kOpenedNewOrFocusedOnExistingTab: - case UserActivityType::kClosedTab: - case UserActivityType::kStartedPlayingMedia: { - score = 1.0; - break; - } - - case UserActivityType::kBrowserWindowDidBecomeActive: - case UserActivityType::kBrowserWindowDidEnterBackground: { - score = 0.5; - break; - } - } + const UserActivityEventType event_type = item.first; + const double points = GetPointsForEventType(event_type); - total_score += score * occurrences; + score += points * occurrences; } - if (total_score < 2.0) { + if (score < 2.0) { return false; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h index 660daeee6ebc..8b1188794cc4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h @@ -13,12 +13,9 @@ namespace ads { -class AdsImpl; - class UserActivityFrequencyCap : public PermissionRule { public: - UserActivityFrequencyCap( - AdsImpl* ads); + UserActivityFrequencyCap(); ~UserActivityFrequencyCap() override; @@ -30,12 +27,10 @@ class UserActivityFrequencyCap : public PermissionRule { std::string get_last_message() const override; private: - AdsImpl* ads_; // NOT OWNED - std::string last_message_; bool DoesRespectCap( - const UserActivityHistoryMap& history); + const UserActivityEventHistoryMap& history); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap_unittest.cc index 76545ac8b36a..25e080bcbd64 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap_unittest.cc @@ -5,121 +5,32 @@ #include "bat/ads/internal/frequency_capping/permission_rules/user_activity_frequency_cap.h" -#include - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/frequency_capping/frequency_capping_unittest_util.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { -class BatAdsUserActivityFrequencyCapTest : public ::testing::Test { +class BatAdsUserActivityFrequencyCapTest : public UnitTestBase { protected: - BatAdsUserActivityFrequencyCapTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - frequency_cap_(std::make_unique< - UserActivityFrequencyCap>(ads_.get())) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsUserActivityFrequencyCapTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case - - UserActivity* get_user_activity() { - return ads_->get_user_activity(); - } - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; + BatAdsUserActivityFrequencyCapTest() = default; - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr frequency_cap_; - std::unique_ptr database_; + ~BatAdsUserActivityFrequencyCapTest() override = default; }; TEST_F(BatAdsUserActivityFrequencyCapTest, AllowAdIfActivityWasReportedForTwoTypes) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kClosedTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent(UserActivityEventType::kClosedTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -128,15 +39,16 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, AllowAdIfActivityWasReportedForTwoOfTheSameType) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -145,17 +57,16 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, AllowAdIfActivityWasReportedForMoreThanTwoTypes) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kStartedPlayingMedia); - get_user_activity()->RecordActivityForType( - UserActivityType::kClosedTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent(UserActivityEventType::kPlayedMedia); + UserActivity::Get()->RecordEvent(UserActivityEventType::kClosedTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -164,17 +75,18 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, AllowAdIfActivityWasReportedForMoreThanTwoOfTheSameType) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -183,17 +95,18 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, AllowAdIfDuplicateActivityWasReportedForMoreThanTwoTypes) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kClosedTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kClosedTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_TRUE(is_allowed); @@ -202,13 +115,14 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, DoNotAllowAdIfActivityWasReportedForLessThanTwoTypes) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); - task_environment_.FastForwardBy(base::TimeDelta::FromMinutes(59)); + FastForwardClockBy(base::TimeDelta::FromMinutes(59)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); @@ -219,7 +133,8 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, // Arrange // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); @@ -228,15 +143,15 @@ TEST_F(BatAdsUserActivityFrequencyCapTest, TEST_F(BatAdsUserActivityFrequencyCapTest, DoNotAllowAdIfActivityWasReportedInThePreviousHour) { // Arrange - get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - get_user_activity()->RecordActivityForType( - UserActivityType::kClosedTab); + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + UserActivity::Get()->RecordEvent(UserActivityEventType::kClosedTab); - task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + FastForwardClockBy(base::TimeDelta::FromHours(1)); // Act - const bool is_allowed = frequency_cap_->ShouldAllow(); + UserActivityFrequencyCap frequency_cap; + const bool is_allowed = frequency_cap.ShouldAllow(); // Assert EXPECT_FALSE(is_allowed); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.cc new file mode 100644 index 000000000000..dd6ff69a106a --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.cc @@ -0,0 +1,32 @@ +/* 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/legacy_migration/legacy_migration_util.h" + +#include "base/time/time.h" + +namespace ads { + +uint64_t MigrateTimestampToDoubleT( + const uint64_t timestamp_in_seconds) { + if (timestamp_in_seconds < 10000000000) { + // Already migrated as DoubleT will never reach 10000000000 in our lifetime + // and legacy timestamps are above 10000000000 + return timestamp_in_seconds; + } + + // Migrate date to DoubleT + const base::Time now = base::Time::Now(); + + const uint64_t now_in_seconds = + static_cast((now - base::Time()).InSeconds()); + + const uint64_t delta = timestamp_in_seconds - now_in_seconds; + + const base::Time time = now + base::TimeDelta::FromSeconds(delta); + return static_cast(time.ToDoubleT()); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.h b/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.h new file mode 100644 index 000000000000..db75fd07c51d --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/legacy_migration/legacy_migration_util.h @@ -0,0 +1,18 @@ +/* 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 BAT_ADS_INTERNAL_LEGACY_MIGRATION_LEGACY_MIGRATION_UTIL_H_ +#define BAT_ADS_INTERNAL_LEGACY_MIGRATION_LEGACY_MIGRATION_UTIL_H_ + +#include + +namespace ads { + +uint64_t MigrateTimestampToDoubleT( + const uint64_t timestamp_in_seconds); + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_LEGACY_MIGRATION_LEGACY_MIGRATION_UTIL_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/logging.cc b/vendor/bat-native-ads/src/bat/ads/internal/logging.cc index 10b5edfb6ee4..a5eacc46cb25 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/logging.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/logging.cc @@ -5,28 +5,20 @@ #include "bat/ads/internal/logging.h" -#include "bat/ads/ads_client.h" +#include "bat/ads/internal/ads_client_helper.h" namespace ads { -AdsClient* g_ads_client = nullptr; // NOT OWNED - -void set_ads_client_for_logging( - AdsClient* ads_client) { - DCHECK(ads_client); - g_ads_client = ads_client; -} - void Log( const char* file, const int line, const int verbose_level, const std::string& message) { - if (!g_ads_client) { + if (!AdsClientHelper::HasInstance()) { return; } - g_ads_client->Log(file, line, verbose_level, message); + AdsClientHelper::Get()->Log(file, line, verbose_level, message); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/logging.h b/vendor/bat-native-ads/src/bat/ads/internal/logging.h index e6324d5799ee..32d0cef1aade 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/logging.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/logging.h @@ -15,11 +15,6 @@ namespace ads { -class AdsClient; - -void set_ads_client_for_logging( - AdsClient* ads_client); - void Log( const char* file, const int line, diff --git a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.cc b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.cc index f85145840d8f..7414f5cfdac2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.cc @@ -5,35 +5,26 @@ #include "bat/ads/internal/p2a/p2a.h" -#include - #include "base/json/json_writer.h" #include "base/values.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" namespace ads { +namespace p2a { -P2A::P2A( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -P2A::~P2A() = default; - -void P2A::RecordEvent( +void RecordEvent( const std::string& name, - const std::vector& value) { + const std::vector& items) { base::Value list(base::Value::Type::LIST); - for (const auto& item : value) { + for (const auto& item : items) { list.Append(item); } std::string json; base::JSONWriter::Write(list, &json); - ads_->get_ads_client()->RecordP2AEvent(name, P2AEventType::kListType, json); -} -/////////////////////////////////////////////////////////////////////////////// + AdsClientHelper::Get()->RecordP2AEvent(name, P2AEventType::kListType, json); +} +} // namespace p2a } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.h b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.h index 58102c395e67..fdc3ac870c5f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a.h @@ -10,24 +10,13 @@ #include namespace ads { +namespace p2a { -class AdsImpl; - -class P2A { - public: - P2A( - AdsImpl* ads); - - ~P2A(); - - void RecordEvent( - const std::string& name, - const std::vector& value); - - private: - AdsImpl* ads_; // NOT OWNED -}; +void RecordEvent( + const std::string& name, + const std::vector& value); +} // namespace p2a } // namespace ads #endif // BAT_ADS_INTERNAL_P2A_P2A_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.cc index 801ada1adfd8..4b11e8f9f38d 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.cc @@ -8,6 +8,7 @@ #include "bat/ads/internal/ad_targeting/ad_targeting_util.h" namespace ads { +namespace p2a { namespace { const char kOpportunityQuestionPrefix[] = @@ -58,4 +59,5 @@ std::vector CreateAdImpressionQuestionList( return questions; } +} // namespace p2a } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.h b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.h index d1d7466a0cb9..30cf055e5c03 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util.h @@ -10,6 +10,7 @@ #include namespace ads { +namespace p2a { std::vector CreateAdOpportunityQuestionList( const std::vector& segments); @@ -17,6 +18,7 @@ std::vector CreateAdOpportunityQuestionList( std::vector CreateAdImpressionQuestionList( const std::string& segment); +} // namespace p2a } // namespace ads #endif // BAT_ADS_INTERNAL_P2A_P2A_UTIL_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util_unittest.cc index 82d594d9a9f4..a8f2bd737ecc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/p2a/p2a_util_unittest.cc @@ -5,14 +5,12 @@ #include "bat/ads/internal/p2a/p2a_util.h" -#include -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* namespace ads { +namespace p2a { TEST(BatAdsP2AUtilTest, CreateAdOpportunityQuestionList) { @@ -90,4 +88,5 @@ TEST(BatAdsP2AUtilTest, EXPECT_EQ(expected_questions, questions); } +} // namespace p2a } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/privacy/privacy_util_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/privacy/privacy_util_unittest.cc index 4cd06f2b49de..c8dd834c62ff 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/privacy/privacy_util_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/privacy/privacy_util_unittest.cc @@ -5,8 +5,6 @@ #include "bat/ads/internal/privacy/privacy_util.h" -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.cc b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.cc index 73a15505da64..65f246306634 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.cc @@ -9,18 +9,12 @@ #include #include -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" namespace ads { namespace privacy { -UnblindedTokens::UnblindedTokens( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +UnblindedTokens::UnblindedTokens() = default; UnblindedTokens::~UnblindedTokens() = default; @@ -53,7 +47,6 @@ base::Value UnblindedTokens::GetTokensAsList() { void UnblindedTokens::SetTokens( const UnblindedTokenList& unblinded_tokens) { unblinded_tokens_ = unblinded_tokens; - ads_->get_confirmations()->Save(); } void UnblindedTokens::SetTokensFromList( @@ -113,8 +106,6 @@ void UnblindedTokens::AddTokens( unblinded_tokens_.push_back(unblinded_token); } - - ads_->get_confirmations()->Save(); } bool UnblindedTokens::RemoveToken( @@ -130,14 +121,11 @@ bool UnblindedTokens::RemoveToken( unblinded_tokens_.erase(iter); - ads_->get_confirmations()->Save(); - return true; } void UnblindedTokens::RemoveAllTokens() { unblinded_tokens_.clear(); - ads_->get_confirmations()->Save(); } bool UnblindedTokens::TokenExists( diff --git a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h index cfb7aac8cc63..eae663b68cf6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h @@ -10,15 +10,11 @@ #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" namespace ads { - -class AdsImpl; - namespace privacy { class UnblindedTokens { public: - explicit UnblindedTokens( - AdsImpl* ads); + UnblindedTokens(); ~UnblindedTokens(); @@ -47,8 +43,6 @@ class UnblindedTokens { private: UnblindedTokenList unblinded_tokens_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace privacy diff --git a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_unittest.cc index 89f332908e4b..4fa3bf815438 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_unittest.cc @@ -5,112 +5,28 @@ #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" -#include #include #include -#include "base/test/task_environment.h" -#include "base/files/scoped_temp_dir.h" #include "base/values.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "wrapper.hpp" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens_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* -using ::testing::_; -using ::testing::NiceMock; -using ::testing::Return; - namespace ads { namespace privacy { -using challenge_bypass_ristretto::UnblindedToken; -using challenge_bypass_ristretto::PublicKey; - -class BatAdsUnblindedTokensTest : public ::testing::Test { +class BatAdsUnblindedTokensTest : public UnitTestBase { protected: - BatAdsUnblindedTokensTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsUnblindedTokensTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } + BatAdsUnblindedTokensTest() = default; - // Objects declared here can be used by all tests in the test case + ~BatAdsUnblindedTokensTest() override = default; UnblindedTokens* get_unblinded_tokens() { - return ads_->get_confirmations()->get_unblinded_tokens(); + return ConfirmationsState::Get()->get_unblinded_tokens(); } - - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr database_; }; TEST_F(BatAdsUnblindedTokensTest, @@ -230,9 +146,6 @@ TEST_F(BatAdsUnblindedTokensTest, TEST_F(BatAdsUnblindedTokensTest, SetTokens) { // Arrange - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const UnblindedTokenList unblinded_tokens = GetUnblindedTokens(10); // Act @@ -248,9 +161,6 @@ TEST_F(BatAdsUnblindedTokensTest, TEST_F(BatAdsUnblindedTokensTest, SetTokensWithEmptyList) { // Arrange - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const UnblindedTokenList unblinded_tokens = {}; // Act @@ -264,9 +174,6 @@ TEST_F(BatAdsUnblindedTokensTest, TEST_F(BatAdsUnblindedTokensTest, SetTokensFromList) { // Arrange - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const base::Value list = GetUnblindedTokensAsList(5); // Act @@ -306,9 +213,6 @@ TEST_F(BatAdsUnblindedTokensTest, TEST_F(BatAdsUnblindedTokensTest, SetTokensFromListWithEmptyList) { // Arrange - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const base::Value list = GetUnblindedTokensAsList(0); // Act @@ -326,9 +230,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - unblinded_tokens = GetRandomUnblindedTokens(5); get_unblinded_tokens()->AddTokens(unblinded_tokens); @@ -349,9 +250,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const UnblindedTokenList duplicate_unblinded_tokens = GetUnblindedTokens(1); get_unblinded_tokens()->AddTokens(duplicate_unblinded_tokens); @@ -367,9 +265,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const UnblindedTokenList random_unblinded_tokens = GetRandomUnblindedTokens(3); get_unblinded_tokens()->AddTokens(random_unblinded_tokens); @@ -386,9 +281,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const UnblindedTokenList empty_unblinded_tokens = {}; get_unblinded_tokens()->AddTokens(empty_unblinded_tokens); @@ -404,9 +296,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - const std::string unblinded_token_base64 = "hfrMEltWLuzbKQ02Qixh5C/DWiJbdOoaGaidKZ7Mv+cRq5fyxJqemE/MPlARPhl6" "NgXPHUeyaxzd6/Lk6YHlfXbBA023DYvGMHoKm15NP/nWnZ1V3iLkgOOHZuk80Z4K"; @@ -428,9 +317,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - std::string unblinded_token_base64 = "hfrMEltWLuzbKQ02Qixh5C/DWiJbdOoaGaidKZ7Mv+cRq5fyxJqemE/MPlARPhl6" "NgXPHUeyaxzd6/Lk6YHlfXbBA023DYvGMHoKm15NP/nWnZ1V3iLkgOOHZuk80Z4K"; @@ -451,9 +337,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(0); - std::string unblinded_token_base64 = "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF" "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF"; @@ -474,9 +357,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - std::string unblinded_token_base64 = "hfrMEltWLuzbKQ02Qixh5C/DWiJbdOoaGaidKZ7Mv+cRq5fyxJqemE/MPlARPhl6" "NgXPHUeyaxzd6/Lk6YHlfXbBA023DYvGMHoKm15NP/nWnZ1V3iLkgOOHZuk80Z4K"; @@ -499,9 +379,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - get_unblinded_tokens()->RemoveAllTokens(); // Assert @@ -516,9 +393,6 @@ TEST_F(BatAdsUnblindedTokensTest, get_unblinded_tokens()->SetTokens(unblinded_tokens); // Act - EXPECT_CALL(*ads_client_mock_, Save(_, _, _)) - .Times(1); - get_unblinded_tokens()->RemoveAllTokens(); // Assert diff --git a/vendor/bat-native-ads/src/bat/ads/internal/security/security_util_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/security/security_util_unittest.cc index 39c90bbfa03c..d43707d1183c 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/security/security_util_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/security/security_util_unittest.cc @@ -5,12 +5,6 @@ #include "bat/ads/internal/security/security_util.h" -#include - -#include -#include -#include - #include "base/base64.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.cc b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.cc similarity index 89% rename from vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.cc rename to vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.cc index 3d3c72cd96eb..68d2d9410f52 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.cc @@ -3,7 +3,7 @@ * 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/tabs/tab_info.h" +#include "bat/ads/internal/tab_manager/tab_info.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.h b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.h similarity index 77% rename from vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.h rename to vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.h index 6f890c02778f..7e7e6d9ceb14 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tab_info.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_info.h @@ -3,8 +3,8 @@ * 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 BAT_ADS_INTERNAL_TABS_TAB_INFO_H_ -#define BAT_ADS_INTERNAL_TABS_TAB_INFO_H_ +#ifndef BAT_ADS_INTERNAL_TAB_MANAGER_TAB_INFO_H_ +#define BAT_ADS_INTERNAL_TAB_MANAGER_TAB_INFO_H_ #include @@ -25,4 +25,4 @@ struct TabInfo { } // namespace ads -#endif // BAT_ADS_INTERNAL_TABS_TAB_INFO_H_ +#endif // BAT_ADS_INTERNAL_TAB_MANAGER_TAB_INFO_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.cc b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.cc new file mode 100644 index 000000000000..5a35464431b4 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.cc @@ -0,0 +1,177 @@ +/* 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/tab_manager/tab_manager.h" + +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/internal/logging.h" +#include "bat/ads/internal/tab_manager/tab_info.h" +#include "bat/ads/internal/user_activity/user_activity.h" + +namespace ads { + +namespace { +TabManager* g_tab_manager = nullptr; +} // namespace + +TabManager::TabManager() { + DCHECK_EQ(g_tab_manager, nullptr); + g_tab_manager = this; + + is_foregrounded_ = AdsClientHelper::Get()->IsForeground(); +} + +TabManager::~TabManager() { + DCHECK(g_tab_manager); + g_tab_manager = nullptr; +} + +// static +TabManager* TabManager::Get() { + DCHECK(g_tab_manager); + return g_tab_manager; +} + +// static +bool TabManager::HasInstance() { + return g_tab_manager; +} + +bool TabManager::IsForegrounded() const { + return is_foregrounded_; +} + +void TabManager::OnForegrounded() { + BLOG(1, "Browser window did become active"); + + is_foregrounded_ = true; + + UserActivity::Get()->RecordEvent( + UserActivityEventType::kBrowserWindowDidBecomeActive); +} + +void TabManager::OnBackgrounded() { + BLOG(1, "Browser window did enter background"); + + is_foregrounded_ = false; + + UserActivity::Get()->RecordEvent( + UserActivityEventType::kBrowserWindowDidEnterBackground); +} + +bool TabManager::IsVisible( + const int32_t id) const { + if (id == 0) { + return false; + } + + return visible_tab_id_ == id; +} + +void TabManager::OnUpdated( + const int32_t id, + const std::string& url, + const bool is_visible, + const bool is_incognito) { + if (is_incognito) { + BLOG(7, "Tab id " << id << " is incognito"); + return; + } + + if (!is_visible) { + BLOG(7, "Tab id " << id << " is occluded"); + return; + } + + if (visible_tab_id_ == id) { + if (tabs_[id].url == url) { + return; + } + + BLOG(2, "Tab id " << id << " was updated"); + + tabs_[id].url = url; + + return; + } + + BLOG(2, "Tab id " << id << " is visible"); + + UserActivity::Get()->RecordEvent( + UserActivityEventType::kOpenedNewOrFocusedOnExistingTab); + + last_visible_tab_id_ = visible_tab_id_; + + visible_tab_id_ = id; + + TabInfo tab; + tab.id = id; + tab.url = url; + + tabs_.insert({id, tab}); +} + +void TabManager::OnClosed( + const int32_t id) { + BLOG(2, "Tab id " << id << " was closed"); + + tabs_.erase(id); + + UserActivity::Get()->RecordEvent(UserActivityEventType::kClosedTab); +} + +void TabManager::OnMediaPlaying( + const int32_t id) { + if (tabs_[id].is_playing_media) { + return; + } + + BLOG(2, "Tab id " << id << " is playing media"); + + UserActivity::Get()->RecordEvent(UserActivityEventType::kPlayedMedia); + + tabs_[id].is_playing_media = true; +} + +void TabManager::OnMediaStopped( + const int32_t id) { + if (!tabs_[id].is_playing_media) { + return; + } + + BLOG(2, "Tab id " << id << " stopped playing media"); + + tabs_[id].is_playing_media = false; +} + +bool TabManager::IsPlayingMedia( + const int32_t id) const { + TabInfo tab; + + if (tabs_.find(id) != tabs_.end()) { + tab = tabs_.at(id); + } + + return tab.is_playing_media; +} + +base::Optional TabManager::GetVisible() const { + return GetForId(visible_tab_id_); +} + +base::Optional TabManager::GetLastVisible() const { + return GetForId(last_visible_tab_id_); +} + +base::Optional TabManager::GetForId( + const int32_t id) const { + if (tabs_.find(id) == tabs_.end()) { + return base::nullopt; + } + + return tabs_.at(id); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.h b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.h similarity index 55% rename from vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.h rename to vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.h index b504d46bd779..d0414a0c4445 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tab_manager/tab_manager.h @@ -3,26 +3,36 @@ * 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 BAT_ADS_INTERNAL_TABS_TABS_H_ -#define BAT_ADS_INTERNAL_TABS_TABS_H_ +#ifndef BAT_ADS_INTERNAL_TAB_MANAGER_TAB_MANAGER_H_ +#define BAT_ADS_INTERNAL_TAB_MANAGER_TAB_MANAGER_H_ #include #include #include -#include "bat/ads/internal/tabs/tab_info.h" +#include "base/optional.h" namespace ads { -class AdsImpl; +struct TabInfo; -class Tabs { +class TabManager { public: - Tabs( - AdsImpl* ads); + TabManager(); - ~Tabs(); + ~TabManager(); + + TabManager(const TabManager&) = delete; + TabManager& operator=(const TabManager&) = delete; + + static TabManager* Get(); + + static bool HasInstance(); + + bool IsForegrounded() const; + void OnForegrounded(); + void OnBackgrounded(); bool IsVisible( const int32_t id) const; @@ -44,19 +54,22 @@ class Tabs { bool IsPlayingMedia( const int32_t id) const; - TabInfo GetVisible() const; + base::Optional GetVisible() const; - TabInfo GetLastVisible() const; + base::Optional GetLastVisible() const; + + base::Optional GetForId( + const int32_t id) const; private: + bool is_foregrounded_ = false; + int32_t visible_tab_id_ = 0; int32_t last_visible_tab_id_ = 0; std::map tabs_; - - AdsImpl* ads_; // NOT OWNED }; } // namespace ads -#endif // BAT_ADS_INTERNAL_TABS_TABS_H_ +#endif // BAT_ADS_INTERNAL_TAB_MANAGER_TAB_MANAGER_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.cc b/vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.cc deleted file mode 100644 index 71cb1dc4b7b4..000000000000 --- a/vendor/bat-native-ads/src/bat/ads/internal/tabs/tabs.cc +++ /dev/null @@ -1,137 +0,0 @@ -/* 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/tabs/tabs.h" - -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/logging.h" -#include "bat/ads/internal/user_activity/user_activity.h" -#include "bat/ads/internal/ad_transfer/ad_transfer.h" - -namespace ads { - -Tabs::Tabs( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} - -Tabs::~Tabs() = default; - -bool Tabs::IsVisible( - const int32_t id) const { - if (id == 0) { - return false; - } - - return visible_tab_id_ == id; -} - -void Tabs::OnUpdated( - const int32_t id, - const std::string& url, - const bool is_visible, - const bool is_incognito) { - if (is_incognito) { - BLOG(7, "Tab id " << id << " is incognito"); - return; - } - - if (!is_visible) { - BLOG(7, "Tab id " << id << " is occluded"); - return; - } - - if (visible_tab_id_ == id) { - return; - } - - BLOG(2, "Tab id " << id << " is visible"); - - ads_->get_user_activity()->RecordActivityForType( - UserActivityType::kOpenedNewOrFocusedOnExistingTab); - - last_visible_tab_id_ = visible_tab_id_; - - visible_tab_id_ = id; - - TabInfo tab; - tab.id = id; - tab.url = url; - - tabs_.insert({id, tab}); -} - -void Tabs::OnClosed( - const int32_t id) { - BLOG(2, "Tab id " << id << " was closed"); - - tabs_.erase(id); - - ads_->get_ad_transfer()->Cancel(id); - - ads_->get_user_activity()->RecordActivityForType( - UserActivityType::kClosedTab); -} - -void Tabs::OnMediaPlaying( - const int32_t id) { - if (tabs_[id].is_playing_media) { - // Media is already playing for this tab - return; - } - - BLOG(2, "Tab id " << id << " started playing media"); - - ads_->get_user_activity()->RecordActivityForType( - UserActivityType::kStartedPlayingMedia); - - tabs_[id].is_playing_media = true; -} - -void Tabs::OnMediaStopped( - const int32_t id) { - if (!tabs_[id].is_playing_media) { - // Media is not playing for this tab - return; - } - - BLOG(2, "Tab id " << id << " stopped playing media"); - - tabs_[id].is_playing_media = false; -} - -bool Tabs::IsPlayingMedia( - const int32_t id) const { - TabInfo tab; - - if (tabs_.find(id) != tabs_.end()) { - tab = tabs_.at(id); - } - - return tab.is_playing_media; -} - -TabInfo Tabs::GetVisible() const { - TabInfo tab; - - if (tabs_.find(visible_tab_id_) != tabs_.end()) { - tab = tabs_.at(visible_tab_id_); - } - - return tab; -} - -TabInfo Tabs::GetLastVisible() const { - TabInfo tab; - - if (tabs_.find(last_visible_tab_id_) != tabs_.end()) { - tab = tabs_.at(last_visible_tab_id_); - } - - return tab; -} - -} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.cc new file mode 100644 index 000000000000..560eafba2397 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.cc @@ -0,0 +1,63 @@ +/* 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/time_formatting_util.h" + +#include "base/i18n/time_formatting.h" +#include "base/strings/string16.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" + +namespace ads { + +std::string LongFriendlyDateAndTime( + const base::Time& time, + const bool use_sentence_style) { + const base::string16 friendly_date_and_time = + base::TimeFormatFriendlyDateAndTime(time); + + // Show date and time as "on Tuesday, 5 May 2020 at 2:44:30 PM" if over 1 day + return base::StringPrintf("%s%s", use_sentence_style ? "on " : "", + base::UTF16ToUTF8(friendly_date_and_time).c_str()); +} + +std::string FriendlyDateAndTime( + const base::Time& time, + const bool use_sentence_style) { + const base::TimeDelta time_delta = time - base::Time::Now(); + + if (time_delta.InDays() > 0) { + return LongFriendlyDateAndTime(time, use_sentence_style); + } + + // Show date and time as "in 0 hours, 21 minutes, 58 seconds at 3:07 PM" + base::string16 time_duration; + if (!base::TimeDurationFormatWithSeconds(time_delta, + base::DURATION_WIDTH_WIDE, &time_duration)) { + return LongFriendlyDateAndTime(time); + } + + const base::string16 time_of_day = base::TimeFormatTimeOfDay(time); + + return base::StringPrintf("%s%s at %s", use_sentence_style ? "in " : "", + base::UTF16ToUTF8(time_duration).c_str(), + base::UTF16ToUTF8(time_of_day).c_str()); +} + +std::string FriendlyDateAndTime( + const uint64_t timestamp_in_seconds, + const bool use_sentence_style) { + const base::Time time = base::Time::FromDoubleT(timestamp_in_seconds); + return FriendlyDateAndTime(time, use_sentence_style); +} + +std::string TimeAsTimestampString( + const base::Time& time) { + const int64_t timestamp = static_cast(time.ToDoubleT()); + return base::NumberToString(timestamp); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.h b/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.h new file mode 100644 index 000000000000..24e9a2b1e147 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/time_formatting_util.h @@ -0,0 +1,34 @@ +/* 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 BAT_ADS_INTERNAL_TIME_FORMATTING_UTIL_H_ +#define BAT_ADS_INTERNAL_TIME_FORMATTING_UTIL_H_ + +#include + +#include + +#include "base/time/time.h" + +namespace ads { + +std::string LongFriendlyDateAndTime( + const base::Time& time, + const bool use_sentence_style = true); + +std::string FriendlyDateAndTime( + const base::Time& time, + const bool use_sentence_style = true); + +std::string FriendlyDateAndTime( + const uint64_t timestamp_in_seconds, + const bool use_sentence_style = true); + +std::string TimeAsTimestampString( + const base::Time& time); + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_TIME_FORMATTING_UTIL_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/time_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/time_util.cc index 0ab9bb275f17..486675538b45 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/time_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/time_util.cc @@ -5,81 +5,11 @@ #include "bat/ads/internal/time_util.h" -#include "base/i18n/time_formatting.h" #include "base/strings/string_number_conversions.h" -#include "base/strings/string16.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" namespace ads { -std::string LongFormatFriendlyDateAndTime( - const base::Time& time, - const bool use_sentence_style) { - const base::string16 friendly_date_and_time = - base::TimeFormatFriendlyDateAndTime(time); - - // Show date and time as "on Tuesday, 5 May 2020 at 2:44:30 PM" if over 1 day - return base::StringPrintf("%s%s", use_sentence_style ? "on " : "", - base::UTF16ToUTF8(friendly_date_and_time).c_str()); -} - -std::string FriendlyDateAndTime( - const base::Time& time, - const bool use_sentence_style) { - const base::TimeDelta time_delta = time - base::Time::Now(); - - if (time_delta.InDays() > 0) { - return LongFormatFriendlyDateAndTime(time, use_sentence_style); - } - - // Show date and time as "in 0 hours, 21 minutes, 58 seconds at 3:07 PM" - base::string16 time_duration; - if (!base::TimeDurationFormatWithSeconds(time_delta, - base::DURATION_WIDTH_WIDE, &time_duration)) { - return LongFormatFriendlyDateAndTime(time); - } - - const base::string16 time_of_day = base::TimeFormatTimeOfDay(time); - - return base::StringPrintf("%s%s at %s", use_sentence_style ? "in " : "", - base::UTF16ToUTF8(time_duration).c_str(), - base::UTF16ToUTF8(time_of_day).c_str()); -} - -std::string FriendlyDateAndTime( - const uint64_t timestamp_in_seconds, - const bool use_sentence_style) { - const base::Time time = base::Time::FromDoubleT(timestamp_in_seconds); - return FriendlyDateAndTime(time, use_sentence_style); -} - -uint64_t MigrateTimestampToDoubleT( - const uint64_t timestamp_in_seconds) { - if (timestamp_in_seconds < 10000000000) { - // Already migrated as DoubleT will never reach 10000000000 in our lifetime - // and legacy timestamps are above 10000000000 - return timestamp_in_seconds; - } - - // Migrate date to DoubleT - const base::Time now = base::Time::Now(); - - const uint64_t now_in_seconds = - static_cast((now - base::Time()).InSeconds()); - - const uint64_t delta = timestamp_in_seconds - now_in_seconds; - - const base::Time time = now + base::TimeDelta::FromSeconds(delta); - return static_cast(time.ToDoubleT()); -} - -std::string NowAsString() { - const int64_t timestamp = static_cast(base::Time::Now().ToDoubleT()); - return base::NumberToString(timestamp); -} - -std::string GetLocalDayOfWeek( +std::string GetLocalWeekDay( const base::Time& time) { base::Time::Exploded exploded; @@ -89,7 +19,7 @@ std::string GetLocalDayOfWeek( return base::NumberToString(exploded.day_of_week); } -int ConvertTimeToLocalMinutesForToday( +int ConvertHoursAndMinutesToMinutes( const base::Time& time) { base::Time::Exploded exploded; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/time_util.h b/vendor/bat-native-ads/src/bat/ads/internal/time_util.h index 5ed234a1e674..a046618e6fb2 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/time_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/time_util.h @@ -6,35 +6,16 @@ #ifndef BAT_ADS_INTERNAL_TIME_UTIL_H_ #define BAT_ADS_INTERNAL_TIME_UTIL_H_ -#include - #include #include "base/time/time.h" namespace ads { -std::string LongFormatFriendlyDateAndTime( - const base::Time& time, - const bool use_sentence_style = true); - -std::string FriendlyDateAndTime( - const base::Time& time, - const bool use_sentence_style = true); - -std::string FriendlyDateAndTime( - const uint64_t timestamp_in_seconds, - const bool use_sentence_style = true); - -uint64_t MigrateTimestampToDoubleT( - const uint64_t timestamp_in_seconds); - -std::string NowAsString(); - -std::string GetLocalDayOfWeek( +std::string GetLocalWeekDay( const base::Time& time); -int ConvertTimeToLocalMinutesForToday( +int ConvertHoursAndMinutesToMinutes( const base::Time& time); } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/timer.h b/vendor/bat-native-ads/src/bat/ads/internal/timer.h index 4dbd6bee40f1..c210af45bfec 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/timer.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/timer.h @@ -11,8 +11,8 @@ #include #include "base/callback_forward.h" +#include "base/time/time.h" #include "base/timer/timer.h" -#include "bat/ads/internal/time_util.h" namespace ads { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.cc index a6ca1311cbcb..ebbcfcefdb80 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.cc @@ -12,43 +12,37 @@ #include "brave_base/random.h" #include "net/http/http_status_code.h" -#include "bat/ads/internal/account/transactions.h" -#include "bat/ads/internal/ad_rewards/ad_rewards.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/ads.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h" namespace ads { -using std::placeholders::_1; - namespace { -const uint64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; +const int64_t kRetryAfterSeconds = 1 * base::Time::kSecondsPerMinute; -const uint64_t kNextTokenRedemptionAfterSeconds = +const int64_t kNextTokenRedemptionAfterSeconds = 24 * base::Time::kSecondsPerHour; -const uint64_t kDebugNextTokenRedemptionAfterSeconds = +const int64_t kDebugNextTokenRedemptionAfterSeconds = 25 * base::Time::kSecondsPerMinute; +const int64_t kExpiredNextTokenRedemptionAfterSeconds = + 1 * base::Time::kSecondsPerMinute; } // namespace -RedeemUnblindedPaymentTokens::RedeemUnblindedPaymentTokens( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +RedeemUnblindedPaymentTokens::RedeemUnblindedPaymentTokens() = default; RedeemUnblindedPaymentTokens::~RedeemUnblindedPaymentTokens() = default; void RedeemUnblindedPaymentTokens::set_delegate( RedeemUnblindedPaymentTokensDelegate* delegate) { - DCHECK(delegate); - delegate_ = delegate; } @@ -81,7 +75,7 @@ void RedeemUnblindedPaymentTokens::Redeem() { BLOG(1, "RedeemUnblindedPaymentTokens"); - if (ads_->get_confirmations()->get_unblinded_payment_tokens()->IsEmpty()) { + if (ConfirmationsState::Get()->get_unblinded_payment_tokens()->IsEmpty()) { BLOG(1, "No unblinded payment tokens to redeem"); ScheduleNextTokenRedemption(); return; @@ -92,15 +86,17 @@ void RedeemUnblindedPaymentTokens::Redeem() { is_processing_ = true; const privacy::UnblindedTokenList unblinded_tokens = - ads_->get_confirmations()->get_unblinded_payment_tokens()->GetAllTokens(); + ConfirmationsState::Get()->get_unblinded_payment_tokens()->GetAllTokens(); + RedeemUnblindedPaymentTokensUrlRequestBuilder url_request_builder(wallet_, unblinded_tokens); UrlRequestPtr url_request = url_request_builder.Build(); BLOG(5, UrlRequestToString(url_request)); BLOG(7, UrlRequestHeadersToString(url_request)); - auto callback = std::bind(&RedeemUnblindedPaymentTokens::OnRedeem, this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + auto callback = std::bind(&RedeemUnblindedPaymentTokens::OnRedeem, this, + std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void RedeemUnblindedPaymentTokens::OnRedeem( @@ -129,30 +125,26 @@ void RedeemUnblindedPaymentTokens::OnRedeemUnblindedPaymentTokens( } Retry(); + return; } - Transactions transactions(ads_); - const TransactionList uncleared_transactions = transactions.GetUncleared(); - ads_->get_ad_rewards()->SetUnreconciledTransactions(uncleared_transactions); - - ads_->get_confirmations()->get_unblinded_payment_tokens()->RemoveAllTokens(); - retry_timer_.Stop(); - ScheduleNextTokenRedemption(); - if (delegate_) { delegate_->OnDidRedeemUnblindedPaymentTokens(); } + + ScheduleNextTokenRedemption(); } void RedeemUnblindedPaymentTokens::ScheduleNextTokenRedemption() { const base::Time next_token_redemption_date = CalculateNextTokenRedemptionDate(); - ads_->get_confirmations()->set_next_token_redemption_date( + ConfirmationsState::Get()->set_next_token_redemption_date( next_token_redemption_date); + ConfirmationsState::Get()->Save(); MaybeRedeemAfterDelay(wallet_); } @@ -177,13 +169,14 @@ void RedeemUnblindedPaymentTokens::OnRetry() { base::TimeDelta RedeemUnblindedPaymentTokens::CalculateTokenRedemptionDelay() { base::Time next_token_redemption_date = - ads_->get_confirmations()->get_next_token_redemption_date(); + ConfirmationsState::Get()->get_next_token_redemption_date(); if (next_token_redemption_date.is_null()) { next_token_redemption_date = CalculateNextTokenRedemptionDate(); - ads_->get_confirmations()->set_next_token_redemption_date( + ConfirmationsState::Get()->set_next_token_redemption_date( next_token_redemption_date); + ConfirmationsState::Get()->Save(); } const base::Time now = base::Time::Now(); @@ -191,7 +184,8 @@ base::TimeDelta RedeemUnblindedPaymentTokens::CalculateTokenRedemptionDelay() { base::TimeDelta delay; if (now >= next_token_redemption_date) { // Browser was launched after the next token redemption date - delay = base::TimeDelta::FromMinutes(1); + delay = base::TimeDelta::FromSeconds( + kExpiredNextTokenRedemptionAfterSeconds); } else { delay = next_token_redemption_date - now; } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h index cf380a9f7f75..76a8eed5f0d6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens.h @@ -6,7 +6,8 @@ #ifndef BAT_ADS_INTERNAL_REDEEM_UNBLINDED_PAYMENT_TOKENS_H_ #define BAT_ADS_INTERNAL_REDEEM_UNBLINDED_PAYMENT_TOKENS_H_ -#include "bat/ads/internal/account/wallet_info.h" +#include "base/time/time.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/backoff_timer.h" #include "bat/ads/internal/timer.h" #include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_delegate.h" @@ -15,12 +16,9 @@ namespace ads { -class AdsImpl; - class RedeemUnblindedPaymentTokens { public: - RedeemUnblindedPaymentTokens( - AdsImpl* ads); + RedeemUnblindedPaymentTokens(); ~RedeemUnblindedPaymentTokens(); @@ -53,8 +51,6 @@ class RedeemUnblindedPaymentTokens { base::TimeDelta CalculateTokenRedemptionDelay(); base::Time CalculateNextTokenRedemptionDate(); - AdsImpl* ads_; // NOT OWNED - RedeemUnblindedPaymentTokensDelegate* delegate_ = nullptr; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h index 521d9ec3b953..33954788a875 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h @@ -10,7 +10,7 @@ #include #include "base/values.h" -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" #include "bat/ads/internal/server/url_request_builder.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder_unittest.cc index 960c2636667b..2b740154f47f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder_unittest.cc @@ -5,10 +5,6 @@ #include "bat/ads/internal/tokens/redeem_unblinded_payment_tokens/redeem_unblinded_payment_tokens_url_request_builder.h" -#include -#include -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder_unittest.cc index 9290250318ff..ac94f06f19fe 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder_unittest.cc @@ -5,63 +5,20 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder.h" -#include -#include -#include - -#include "base/strings/stringprintf.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" +#include "bat/ads/internal/unittest_base.h" #include "bat/ads/internal/unittest_util.h" // npm run test -- brave_unit_tests --filter=BatAds* -using ::testing::NiceMock; using ::testing::Return; namespace ads { -class BatAdsCreateConfirmationUrlRequestBuilderTest : public ::testing::Test { +class BatAdsCreateConfirmationUrlRequestBuilderTest : public UnitTestBase { protected: - BatAdsCreateConfirmationUrlRequestBuilderTest() - : locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()) { - // You can do set-up work for each test here + BatAdsCreateConfirmationUrlRequestBuilderTest() = default; - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - } - - ~BatAdsCreateConfirmationUrlRequestBuilderTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - ON_CALL(*platform_helper_mock_, GetPlatformName()) - .WillByDefault(Return("test")); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case + ~BatAdsCreateConfirmationUrlRequestBuilderTest() override = default; ConfirmationInfo GetConfirmationForType( const ConfirmationType type) { @@ -89,9 +46,6 @@ class BatAdsCreateConfirmationUrlRequestBuilderTest : public ::testing::Test { return confirmation; } - - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; }; TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, @@ -102,8 +56,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(true, "release"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); + MockLocaleHelper(locale_helper_mock_, "en-US"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -116,7 +69,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","countryCode":"US","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","countryCode":"US","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; @@ -131,8 +84,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(true, "release"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-AS")); + MockLocaleHelper(locale_helper_mock_, "en-AS"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -145,7 +97,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","countryCode":"??","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","countryCode":"??","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; @@ -160,8 +112,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(true, "release"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-KY")); + MockLocaleHelper(locale_helper_mock_, "en-KY"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -174,7 +125,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"release","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; @@ -189,8 +140,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(false, "beta"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); + MockLocaleHelper(locale_helper_mock_, "en-US"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -203,7 +153,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; @@ -218,8 +168,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(false, "beta"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-AS")); + MockLocaleHelper(locale_helper_mock_, "en-AS"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -232,7 +181,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; @@ -247,8 +196,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, SetBuildChannel(false, "beta"); - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-KY")); + MockLocaleHelper(locale_helper_mock_, "en-KY"); CreateConfirmationUrlRequestBuilder url_request_builder(confirmation); @@ -261,7 +209,7 @@ TEST_F(BatAdsCreateConfirmationUrlRequestBuilderTest, expected_url_request->headers = { "accept: application/json" }; - expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"test","type":"view"})"; + expected_url_request->content = R"({"blindedPaymentToken":"PI3lFqpGVFKz4TH5yEwXI3R/QntmTpUgeBaK+STiBx8=","buildChannel":"beta","creativeInstanceId":"546fe7b0-5047-4f28-a11c-81f14edcf0f6","experiment":{},"payload":{},"platform":"windows","type":"view"})"; expected_url_request->content_type = "application/json"; expected_url_request->method = UrlRequestMethod::POST; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.cc index b2b93cb61e63..d25c926e1bac 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.cc @@ -6,19 +6,24 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h" #include +#include #include "base/base64url.h" +#include "base/guid.h" #include "base/json/json_writer.h" #include "base/strings/string_number_conversions.h" +#include "base/time/time.h" #include "base/values.h" #include "brave/components/l10n/browser/locale_helper.h" #include "brave/components/l10n/common/locale_util.h" #include "wrapper.hpp" #include "bat/ads/ads.h" +#include "bat/ads/confirmation_type.h" #include "bat/ads/internal/confirmations/confirmation_info.h" -#include "bat/ads/internal/features.h" +#include "bat/ads/internal/features/features.h" #include "bat/ads/internal/locale/country_code_util.h" #include "bat/ads/internal/platform/platform_helper.h" +#include "bat/ads/internal/privacy/privacy_util.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" namespace ads { @@ -27,6 +32,34 @@ using challenge_bypass_ristretto::VerificationKey; using challenge_bypass_ristretto::VerificationSignature; using challenge_bypass_ristretto::TokenPreimage; +ConfirmationInfo CreateConfirmationInfo( + const std::string& creative_instance_id, + const ConfirmationType& confirmation_type, + const privacy::UnblindedTokenInfo& unblinded_token) { + DCHECK(!creative_instance_id.empty()); + + ConfirmationInfo confirmation; + + confirmation.id = base::GenerateGUID(); + confirmation.creative_instance_id = creative_instance_id; + confirmation.type = confirmation_type; + confirmation.unblinded_token = unblinded_token; + + const std::vector tokens = privacy::GenerateTokens(1); + confirmation.payment_token = tokens.front(); + + const std::vector blinded_tokens = privacy::BlindTokens(tokens); + const BlindedToken blinded_token = blinded_tokens.front(); + confirmation.blinded_payment_token = blinded_token; + + const std::string payload = CreateConfirmationRequestDTO(confirmation); + confirmation.credential = CreateCredential(unblinded_token, payload); + + confirmation.timestamp = static_cast(base::Time::Now().ToDoubleT()); + + return confirmation; +} + std::string CreateConfirmationRequestDTO( const ConfirmationInfo& confirmation) { base::Value dto(base::Value::Type::DICTIONARY); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h index 0fcf69e3dafa..873b25e85a28 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h @@ -10,12 +10,18 @@ namespace ads { +class ConfirmationType; struct ConfirmationInfo; namespace privacy { struct UnblindedTokenInfo; } // privacy +ConfirmationInfo CreateConfirmationInfo( + const std::string& creative_instance_id, + const ConfirmationType& confirmation_type, + const privacy::UnblindedTokenInfo& unblinded_token); + std::string CreateConfirmationRequestDTO( const ConfirmationInfo& confirmation); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder_unittest.cc index ad66a4c680a6..456489772727 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder_unittest.cc @@ -5,8 +5,6 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder.h" -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.cc index 3c7ff91b87e9..72c152a9b87f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.cc @@ -5,8 +5,6 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h" -#include - #include #include #include @@ -14,30 +12,21 @@ #include "base/guid.h" #include "base/json/json_reader.h" #include "base/values.h" -#include "brave_base/random.h" #include "net/http/http_status_code.h" #include "wrapper.hpp" #include "bat/ads/confirmation_type.h" -#include "bat/ads/internal/account/wallet.h" -#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/confirmations/confirmation_info.h" #include "bat/ads/internal/confirmations/confirmations.h" #include "bat/ads/internal/logging.h" -#include "bat/ads/internal/privacy/privacy_util.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" -#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" #include "bat/ads/internal/security/security_util.h" -#include "bat/ads/internal/server/ads_server_util.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/fetch_payment_token_url_request_builder.h" -#include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h" namespace ads { -using std::placeholders::_1; - using challenge_bypass_ristretto::BatchDLEQProof; using challenge_bypass_ristretto::BlindedToken; using challenge_bypass_ristretto::PublicKey; @@ -45,55 +34,33 @@ using challenge_bypass_ristretto::SignedToken; using challenge_bypass_ristretto::Token; using challenge_bypass_ristretto::UnblindedToken; -RedeemUnblindedToken::RedeemUnblindedToken( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +RedeemUnblindedToken::RedeemUnblindedToken() = default; RedeemUnblindedToken::~RedeemUnblindedToken() = default; void RedeemUnblindedToken::set_delegate( RedeemUnblindedTokenDelegate* delegate) { - DCHECK(delegate); - delegate_ = delegate; } void RedeemUnblindedToken::Redeem( const std::string& creative_instance_id, - const ConfirmationType confirmation_type) { - BLOG(1, "Redeem token"); - - if (ads_->get_confirmations()->get_unblinded_tokens()->IsEmpty()) { - BLOG(1, "There are no unblinded tokens to redeem"); - - BLOG(3, "Failed to redeem unblinded token with creative instance id " - << creative_instance_id); - - return; - } - - const privacy::UnblindedTokenInfo unblinded_token - = ads_->get_confirmations()->get_unblinded_tokens()->GetToken(); - ads_->get_confirmations()->get_unblinded_tokens()-> - RemoveToken(unblinded_token); + const ConfirmationType& confirmation_type, + const privacy::UnblindedTokenInfo& unblinded_token) { + BLOG(1, "Redeem unblinded token"); const ConfirmationInfo confirmation = CreateConfirmationInfo( creative_instance_id, confirmation_type, unblinded_token); - CreateConfirmation(confirmation); - const WalletInfo wallet = ads_->get_wallet()->Get(); - ads_->get_refill_unblinded_tokens()->MaybeRefill(wallet); + CreateConfirmation(confirmation); } void RedeemUnblindedToken::Redeem( const ConfirmationInfo& confirmation) { - BLOG(1, "Redeem token"); + BLOG(1, "Redeem unblinded token"); if (!confirmation.created) { CreateConfirmation(confirmation); - return; } @@ -113,8 +80,8 @@ void RedeemUnblindedToken::CreateConfirmation( BLOG(7, UrlRequestHeadersToString(url_request)); auto callback = std::bind(&RedeemUnblindedToken::OnCreateConfirmation, - this, _1, confirmation); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + this, std::placeholders::_1, confirmation); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void RedeemUnblindedToken::OnCreateConfirmation( @@ -153,8 +120,8 @@ void RedeemUnblindedToken::FetchPaymentToken( BLOG(7, UrlRequestHeadersToString(url_request)); auto callback = std::bind(&RedeemUnblindedToken::OnFetchPaymentToken, - this, _1, confirmation); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + this, std::placeholders::_1, confirmation); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void RedeemUnblindedToken::OnFetchPaymentToken( @@ -170,26 +137,26 @@ void RedeemUnblindedToken::OnFetchPaymentToken( if (!security::Verify(confirmation)) { BLOG(1, "Failed to verify confirmation"); - OnRedeem(FAILED, confirmation, false); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ false); return; } ConfirmationInfo new_confirmation = confirmation; new_confirmation.created = false; - OnRedeem(FAILED, new_confirmation, true); + OnFailedToRedeemUnblindedToken(new_confirmation, /* should_retry */ true); return; } if (url_response.status_code == net::HTTP_BAD_REQUEST) { BLOG(1, "Credential is invalid"); - OnRedeem(FAILED, confirmation, false); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ false); return; } if (url_response.status_code != net::HTTP_OK) { BLOG(1, "Failed to fetch payment token"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } @@ -198,7 +165,7 @@ void RedeemUnblindedToken::OnFetchPaymentToken( base::JSONReader::Read(url_response.body); if (!dictionary || !dictionary->is_dict()) { BLOG(3, "Failed to parse response: " << url_response.body); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } @@ -206,7 +173,7 @@ void RedeemUnblindedToken::OnFetchPaymentToken( const std::string* id = dictionary->FindStringKey("id"); if (!id) { BLOG(0, "Response is missing id"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } @@ -214,7 +181,7 @@ void RedeemUnblindedToken::OnFetchPaymentToken( if (*id != confirmation.id) { BLOG(0, "Response id " << *id << " does not match confirmation id " << confirmation.id); - OnRedeem(FAILED, confirmation, false); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ false); return; } @@ -223,9 +190,7 @@ void RedeemUnblindedToken::OnFetchPaymentToken( dictionary->FindDictKey("paymentToken"); if (!payment_token_dictionary) { BLOG(1, "Response is missing paymentToken"); - - // Token is in a bad state so redeem a new token - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } @@ -234,29 +199,17 @@ void RedeemUnblindedToken::OnFetchPaymentToken( payment_token_dictionary->FindStringKey("publicKey"); if (!public_key_base64) { BLOG(0, "Response is missing publicKey in paymentToken dictionary"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } PublicKey public_key = PublicKey::decode_base64(*public_key_base64); - // Get catalog issuers - const CatalogIssuersInfo catalog_issuers = - ads_->get_confirmations()->GetCatalogIssuers(); - - // Validate public key - if (!catalog_issuers.PublicKeyExists(*public_key_base64)) { - BLOG(0, "Response public key " << *public_key_base64 << " was not found " - "in the catalog issuers"); - OnRedeem(FAILED, confirmation, true); - return; - } - // Get batch dleq proof const std::string* batch_dleq_proof_base64 = payment_token_dictionary->FindStringKey("batchProof"); if (!batch_dleq_proof_base64) { BLOG(0, "Response is missing batchProof"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } BatchDLEQProof batch_dleq_proof = @@ -267,13 +220,13 @@ void RedeemUnblindedToken::OnFetchPaymentToken( payment_token_dictionary->FindListKey("signedTokens"); if (!signed_tokens_list) { BLOG(0, "Response is missing signedTokens"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } if (signed_tokens_list->GetList().size() != 1) { BLOG(0, "Response has too many signedTokens"); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } @@ -304,123 +257,35 @@ void RedeemUnblindedToken::OnFetchPaymentToken( BLOG(1, " Batch proof: " << *batch_dleq_proof_base64); BLOG(1, " Public key: " << *public_key_base64); - OnRedeem(FAILED, confirmation, true); + OnFailedToRedeemUnblindedToken(confirmation, /* should_retry */ true); return; } - // Add unblinded token - privacy::UnblindedTokenInfo unblinded_token; - unblinded_token.value = batch_dleq_proof_unblinded_tokens.front(); - unblinded_token.public_key = public_key; - - if (ads_->get_confirmations()->get_unblinded_payment_tokens()-> - TokenExists(unblinded_token)) { - BLOG(1, "Unblinded payment token is a duplicate"); - OnRedeem(FAILED, confirmation, false); - return; - } - - const std::vector unblinded_tokens = { - unblinded_token - }; - - ads_->get_confirmations()->get_unblinded_payment_tokens()-> - AddTokens(unblinded_tokens); - - // Get estimated redemption value - const double estimated_redemption_value = - catalog_issuers.GetEstimatedRedemptionValue( - unblinded_token.public_key.encode_base64()); - - // Add transaction to history - BLOG(1, "Added 1 unblinded payment token with an estimated redemption value " - "of " << estimated_redemption_value << " BAT, you now have " - << ads_->get_confirmations()->get_unblinded_payment_tokens()->Count() - << " unblinded payment tokens"); + privacy::UnblindedTokenInfo unblinded_payment_token; + unblinded_payment_token.value = batch_dleq_proof_unblinded_tokens.front(); + unblinded_payment_token.public_key = public_key; - ads_->get_confirmations()->AppendTransaction(estimated_redemption_value, - confirmation.type); - - OnRedeem(SUCCESS, confirmation, false); + OnDidRedeemUnblindedToken(confirmation, unblinded_payment_token); } -void RedeemUnblindedToken::OnRedeem( - const Result result, +void RedeemUnblindedToken::OnDidRedeemUnblindedToken( const ConfirmationInfo& confirmation, - const bool should_retry) { - if (result != SUCCESS) { - if (delegate_) { - delegate_->OnFailedToRedeemUnblindedToken(confirmation); - } - - if (should_retry) { - if (!confirmation.created) { - CreateAndAppendNewConfirmationToRetryQueue(confirmation); - } else { - AppendConfirmationToRetryQueue(confirmation); - } - } - + const privacy::UnblindedTokenInfo& unblinded_payment_token) { + if (!delegate_) { return; } - if (delegate_) { - delegate_->OnDidRedeemUnblindedToken(confirmation); - } + delegate_->OnDidRedeemUnblindedToken(confirmation, unblinded_payment_token); } -void RedeemUnblindedToken::CreateAndAppendNewConfirmationToRetryQueue( - const ConfirmationInfo& confirmation) { - if (ads_->get_confirmations()->get_unblinded_tokens()->IsEmpty()) { - AppendConfirmationToRetryQueue(confirmation); +void RedeemUnblindedToken::OnFailedToRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const bool should_retry) { + if (!delegate_) { return; } - const privacy::UnblindedTokenInfo unblinded_token = - ads_->get_confirmations()->get_unblinded_tokens()->GetToken(); - ads_->get_confirmations()->get_unblinded_tokens()-> - RemoveToken(unblinded_token); - - const ConfirmationInfo new_confirmation = CreateConfirmationInfo( - confirmation.creative_instance_id, confirmation.type, unblinded_token); - - AppendConfirmationToRetryQueue(new_confirmation); - - const WalletInfo wallet = ads_->get_wallet()->Get(); - ads_->get_refill_unblinded_tokens()->MaybeRefill(wallet); -} - -void RedeemUnblindedToken::AppendConfirmationToRetryQueue( - const ConfirmationInfo& confirmation) { - ads_->get_confirmations()->AppendConfirmationToRetryQueue(confirmation); -} - -ConfirmationInfo RedeemUnblindedToken::CreateConfirmationInfo( - const std::string& creative_instance_id, - const ConfirmationType confirmation_type, - const privacy::UnblindedTokenInfo& unblinded_token) { - DCHECK(!creative_instance_id.empty()); - - ConfirmationInfo confirmation; - - confirmation.id = base::GenerateGUID(); - confirmation.creative_instance_id = creative_instance_id; - confirmation.type = confirmation_type; - confirmation.unblinded_token = unblinded_token; - - const std::vector tokens = privacy::GenerateTokens(1); - confirmation.payment_token = tokens.front(); - - const std::vector blinded_tokens = privacy::BlindTokens(tokens); - const BlindedToken blinded_token = blinded_tokens.front(); - confirmation.blinded_payment_token = blinded_token; - - const std::string payload = CreateConfirmationRequestDTO(confirmation); - confirmation.credential = CreateCredential(unblinded_token, payload); - - confirmation.timestamp = static_cast(base::Time::Now().ToDoubleT()); - - return confirmation; + delegate_->OnFailedToRedeemUnblindedToken(confirmation, should_retry); } } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h index d667a6ecf363..cb67e7b7120f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h @@ -10,15 +10,11 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h" #include "bat/ads/mojom.h" -#include "bat/ads/result.h" namespace ads { -class AdsImpl; class ConfirmationType; -struct AdInfo; struct ConfirmationInfo; -struct TokenInfo; namespace privacy { struct UnblindedTokenInfo; @@ -26,8 +22,7 @@ struct UnblindedTokenInfo; class RedeemUnblindedToken { public: - RedeemUnblindedToken( - AdsImpl* ads); + RedeemUnblindedToken(); ~RedeemUnblindedToken(); @@ -36,7 +31,9 @@ class RedeemUnblindedToken { void Redeem( const std::string& creative_instance_id, - const ConfirmationType confirmation_type); + const ConfirmationType& confirmation_type, + const privacy::UnblindedTokenInfo& unblinded_token); + void Redeem( const ConfirmationInfo& confirmation); @@ -53,22 +50,13 @@ class RedeemUnblindedToken { const UrlResponse& url_response, const ConfirmationInfo& confirmation); - void OnRedeem( - const Result result, + void OnDidRedeemUnblindedToken( const ConfirmationInfo& confirmation, - const bool should_retry); - - void CreateAndAppendNewConfirmationToRetryQueue( - const ConfirmationInfo& confirmation); - void AppendConfirmationToRetryQueue( - const ConfirmationInfo& confirmation); + const privacy::UnblindedTokenInfo& unblinded_payment_token); - ConfirmationInfo CreateConfirmationInfo( - const std::string& creative_instance_id, - const ConfirmationType confirmation_type, - const privacy::UnblindedTokenInfo& unblinded_token); - - AdsImpl* ads_; // NOT OWNED + void OnFailedToRedeemUnblindedToken( + const ConfirmationInfo& confirmation, + const bool should_retry); RedeemUnblindedTokenDelegate* delegate_ = nullptr; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h index 373d761a49b7..c8ed6d8f7998 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h @@ -7,19 +7,21 @@ #define BAT_ADS_INTERNAL_TOKENS_REDEEM_UNBLINDED_TOKEN_REDEEM_UNBLINDED_TOKEN_DELEGATE_H_ // NOLINT #include "bat/ads/internal/confirmations/confirmation_info.h" +#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" namespace ads { class RedeemUnblindedTokenDelegate { public: - RedeemUnblindedTokenDelegate() = default; - virtual ~RedeemUnblindedTokenDelegate() = default; virtual void OnDidRedeemUnblindedToken( - const ConfirmationInfo& confirmation) = 0; + const ConfirmationInfo& confirmation, + const privacy::UnblindedTokenInfo& unblinded_payment_token) = 0; + virtual void OnFailedToRedeemUnblindedToken( - const ConfirmationInfo& confirmation) = 0; + const ConfirmationInfo& confirmation, + const bool should_retry) = 0; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate_mock.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate_mock.h index 4013d0c03427..fde3920c8f07 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate_mock.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate_mock.h @@ -8,6 +8,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate.h" +#include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" namespace ads { @@ -23,10 +24,12 @@ class RedeemUnblindedTokenDelegateMock : public RedeemUnblindedTokenDelegate { const RedeemUnblindedTokenDelegateMock&) = delete; MOCK_METHOD(void, OnDidRedeemUnblindedToken, ( - const ConfirmationInfo& confirmation)); + const ConfirmationInfo& confirmation, + const privacy::UnblindedTokenInfo& unblinded_payment_token)); MOCK_METHOD(void, OnFailedToRedeemUnblindedToken, ( - const ConfirmationInfo& confirmation)); + const ConfirmationInfo& confirmation, + const bool should_retry)); }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_unittest.cc index 4b04d05ecc91..718c7d08ad64 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_unittest.cc @@ -6,108 +6,38 @@ #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token.h" #include -#include -#include -#include "base/files/scoped_temp_dir.h" -#include "base/test/task_environment.h" -#include "brave/components/l10n/browser/locale_helper_mock.h" #include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" -#include "bat/ads/internal/platform/platform_helper_mock.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_url_request_builder.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/create_confirmation_util.h" #include "bat/ads/internal/tokens/redeem_unblinded_token/redeem_unblinded_token_delegate_mock.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* +using ::testing::_; using ::testing::NiceMock; -using ::testing::Return; namespace ads { using challenge_bypass_ristretto::PublicKey; -class BatAdsRedeemUnblindedTokenTest : public ::testing::Test { +class BatAdsRedeemUnblindedTokenTest : public UnitTestBase { protected: BatAdsRedeemUnblindedTokenTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - ads_client_mock_(std::make_unique>()), - ads_(std::make_unique>(ads_client_mock_.get())), - locale_helper_mock_(std::make_unique< - NiceMock>()), - platform_helper_mock_(std::make_unique< - NiceMock>()), - redeem_token_delegate_mock_(std::make_unique< + : redeem_unblinded_token_(std::make_unique()), + redeem_unblinded_token_delegate_mock_(std::make_unique< NiceMock>()) { - // You can do set-up work for each test here - - brave_l10n::LocaleHelper::GetInstance()->set_for_testing( - locale_helper_mock_.get()); - - PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); - - get_redeem_unblinded_token()->set_delegate( - redeem_token_delegate_mock_.get()); + redeem_unblinded_token_->set_delegate( + redeem_unblinded_token_delegate_mock_.get()); } - ~BatAdsRedeemUnblindedTokenTest() override { - // You can do clean-up work that doesn't throw exceptions here - } - - // If the constructor and destructor are not enough for setting up and - // cleaning up each test, you can use the following methods - - void SetUp() override { - // Code here will be called immediately after the constructor (right before - // each test) - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - const base::FilePath path = temp_dir_.GetPath(); - - SetBuildChannel(false, "test"); - - ON_CALL(*locale_helper_mock_, GetLocale()) - .WillByDefault(Return("en-US")); - - MockPlatformHelper(platform_helper_mock_, PlatformType::kMacOS); - - ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", - "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); - - MockLoad(ads_client_mock_); - MockLoadUserModelForId(ads_client_mock_); - MockLoadResourceForId(ads_client_mock_); - MockSave(ads_client_mock_); - - MockPrefs(ads_client_mock_); - - database_ = std::make_unique(path.AppendASCII("database.sqlite")); - MockRunDBTransaction(ads_client_mock_, database_); - - Initialize(ads_); - } - - void TearDown() override { - // Code here will be called immediately after each test (right before the - // destructor) - } - - // Objects declared here can be used by all tests in the test case + ~BatAdsRedeemUnblindedTokenTest() override = default; privacy::UnblindedTokens* get_unblinded_tokens() { - return ads_->get_confirmations()->get_unblinded_tokens(); - } - - RedeemUnblindedToken* get_redeem_unblinded_token() { - return ads_->get_redeem_unblinded_token(); + return ConfirmationsState::Get()->get_unblinded_tokens(); } void SetUnblindedTokens() { @@ -153,16 +83,9 @@ class BatAdsRedeemUnblindedTokenTest : public ::testing::Test { return confirmation; } - base::test::TaskEnvironment task_environment_; - - base::ScopedTempDir temp_dir_; - - std::unique_ptr ads_client_mock_; - std::unique_ptr ads_; - std::unique_ptr locale_helper_mock_; - std::unique_ptr platform_helper_mock_; - std::unique_ptr redeem_token_delegate_mock_; - std::unique_ptr database_; + std::unique_ptr redeem_unblinded_token_; + std::unique_ptr + redeem_unblinded_token_delegate_mock_; }; TEST_F(BatAdsRedeemUnblindedTokenTest, @@ -221,13 +144,13 @@ TEST_F(BatAdsRedeemUnblindedTokenTest, ConfirmationInfo expected_confirmation = confirmation; expected_confirmation.created = true; - EXPECT_CALL(*redeem_token_delegate_mock_, - OnDidRedeemUnblindedToken(expected_confirmation)).Times(1); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnDidRedeemUnblindedToken(expected_confirmation, _)).Times(1); - EXPECT_CALL(*redeem_token_delegate_mock_, - OnFailedToRedeemUnblindedToken(expected_confirmation)).Times(0); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnFailedToRedeemUnblindedToken(_, _)).Times(0); - get_redeem_unblinded_token()->Redeem(confirmation); + redeem_unblinded_token_->Redeem(confirmation); // Assert } @@ -271,13 +194,13 @@ TEST_F(BatAdsRedeemUnblindedTokenTest, // Act ConfirmationInfo expected_confirmation = confirmation; - EXPECT_CALL(*redeem_token_delegate_mock_, - OnDidRedeemUnblindedToken(expected_confirmation)).Times(1); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnDidRedeemUnblindedToken(expected_confirmation, _)).Times(1); - EXPECT_CALL(*redeem_token_delegate_mock_, - OnFailedToRedeemUnblindedToken(expected_confirmation)).Times(0); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnFailedToRedeemUnblindedToken(_, _)).Times(0); - get_redeem_unblinded_token()->Redeem(confirmation); + redeem_unblinded_token_->Redeem(confirmation); // Assert } @@ -314,13 +237,13 @@ TEST_F(BatAdsRedeemUnblindedTokenTest, ConfirmationInfo expected_confirmation = confirmation; expected_confirmation.created = false; // Should retry with new confirmation - EXPECT_CALL(*redeem_token_delegate_mock_, - OnDidRedeemUnblindedToken(expected_confirmation)).Times(0); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnDidRedeemUnblindedToken(_, _)).Times(0); - EXPECT_CALL(*redeem_token_delegate_mock_, - OnFailedToRedeemUnblindedToken(expected_confirmation)).Times(1); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnFailedToRedeemUnblindedToken(expected_confirmation, true)).Times(1); - get_redeem_unblinded_token()->Redeem(confirmation); + redeem_unblinded_token_->Redeem(confirmation); // Assert } @@ -357,13 +280,13 @@ TEST_F(BatAdsRedeemUnblindedTokenTest, ConfirmationInfo expected_confirmation = confirmation; expected_confirmation.created = true; // Should retry with same confirmation - EXPECT_CALL(*redeem_token_delegate_mock_, - OnDidRedeemUnblindedToken(expected_confirmation)).Times(0); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnDidRedeemUnblindedToken(_, _)).Times(0); - EXPECT_CALL(*redeem_token_delegate_mock_, - OnFailedToRedeemUnblindedToken(expected_confirmation)).Times(1); + EXPECT_CALL(*redeem_unblinded_token_delegate_mock_, + OnFailedToRedeemUnblindedToken(expected_confirmation, true)).Times(1); - get_redeem_unblinded_token()->Redeem(confirmation); + redeem_unblinded_token_->Redeem(confirmation); // Assert } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h index 47842323c54c..edaf3101ff8a 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h @@ -8,7 +8,7 @@ #include -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/server/url_request_builder.h" #include "bat/ads/mojom.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder_unittest.cc index 7577b588db16..232d33f0759f 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder_unittest.cc @@ -5,8 +5,6 @@ #include "bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h" -#include - #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=BatAds* diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.cc index 735d2c9b93c5..1a132c937d4e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.cc @@ -11,22 +11,22 @@ #include #include "base/json/json_reader.h" +#include "base/time/time.h" #include "net/http/http_status_code.h" +#include "bat/ads/internal/ads_client_helper.h" #include "bat/ads/internal/ads_impl.h" -#include "bat/ads/internal/confirmations/confirmations.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" #include "bat/ads/internal/logging.h" #include "bat/ads/internal/privacy/privacy_util.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_token_info.h" #include "bat/ads/internal/privacy/unblinded_tokens/unblinded_tokens.h" #include "bat/ads/internal/server/ads_server_util.h" -#include "bat/ads/internal/time_util.h" +#include "bat/ads/internal/time_formatting_util.h" #include "bat/ads/internal/tokens/refill_unblinded_tokens/get_signed_tokens_url_request_builder.h" #include "bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h" namespace ads { -using std::placeholders::_1; - using challenge_bypass_ristretto::BatchDLEQProof; using challenge_bypass_ristretto::PublicKey; using challenge_bypass_ristretto::SignedToken; @@ -34,18 +34,14 @@ using challenge_bypass_ristretto::UnblindedToken; namespace { -const uint64_t kRetryAfterSeconds = 15; +const int64_t kRetryAfterSeconds = 15; const int kMinimumUnblindedTokens = 20; const int kMaximumUnblindedTokens = 50; } // namespace -RefillUnblindedTokens::RefillUnblindedTokens( - AdsImpl* ads) - : ads_(ads) { - DCHECK(ads_); -} +RefillUnblindedTokens::RefillUnblindedTokens() = default; RefillUnblindedTokens::~RefillUnblindedTokens() = default; @@ -62,7 +58,7 @@ void RefillUnblindedTokens::MaybeRefill( if (!ShouldRefillUnblindedTokens()) { BLOG(1, "No need to refill unblinded tokens as we already have " - << ads_->get_confirmations()->get_unblinded_tokens()->Count() + << ConfirmationsState::Get()->get_unblinded_tokens()->Count() << " unblinded tokens which is above the minimum threshold of " << kMinimumUnblindedTokens); return; @@ -76,7 +72,7 @@ void RefillUnblindedTokens::MaybeRefill( wallet_ = wallet; const CatalogIssuersInfo catalog_issuers = - ads_->get_confirmations()->GetCatalogIssuers(); + ConfirmationsState::Get()->get_catalog_issuers(); if (!catalog_issuers.IsValid()) { BLOG(0, "Failed to refill unblinded tokens due to missing catalog issuers"); return; @@ -115,8 +111,8 @@ void RefillUnblindedTokens::RequestSignedTokens() { BLOG(7, UrlRequestHeadersToString(url_request)); auto callback = std::bind(&RefillUnblindedTokens::OnRequestSignedTokens, - this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + this, std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void RefillUnblindedTokens::OnRequestSignedTokens( @@ -164,8 +160,8 @@ void RefillUnblindedTokens::GetSignedTokens() { BLOG(7, UrlRequestHeadersToString(url_request)); auto callback = std::bind(&RefillUnblindedTokens::OnGetSignedTokens, - this, _1); - ads_->get_ads_client()->UrlRequest(std::move(url_request), callback); + this, std::placeholders::_1); + AdsClientHelper::Get()->UrlRequest(std::move(url_request), callback); } void RefillUnblindedTokens::OnGetSignedTokens( @@ -262,11 +258,12 @@ void RefillUnblindedTokens::OnGetSignedTokens( unblinded_tokens.push_back(unblinded_token); } - ads_->get_confirmations()->get_unblinded_tokens()-> - AddTokens(unblinded_tokens); + ConfirmationsState::Get()->get_unblinded_tokens()->AddTokens( + unblinded_tokens); + ConfirmationsState::Get()->Save(); BLOG(1, "Added " << unblinded_tokens.size() << " unblinded tokens, you now " - "have " << ads_->get_confirmations()->get_unblinded_tokens()->Count() + "have " << ConfirmationsState::Get()->get_unblinded_tokens()->Count() << " unblinded tokens"); OnRefill(SUCCESS, false); @@ -293,7 +290,8 @@ void RefillUnblindedTokens::OnRefill( blinded_tokens_.clear(); tokens_.clear(); - ads_->get_confirmations()->Save(); + + ConfirmationsState::Get()->Save(); if (delegate_) { delegate_->OnDidRefillUnblindedTokens(); @@ -324,7 +322,7 @@ void RefillUnblindedTokens::OnRetry() { } bool RefillUnblindedTokens::ShouldRefillUnblindedTokens() const { - if (ads_->get_confirmations()->get_unblinded_tokens()->Count() >= + if (ConfirmationsState::Get()->get_unblinded_tokens()->Count() >= kMinimumUnblindedTokens) { return false; } @@ -334,7 +332,7 @@ bool RefillUnblindedTokens::ShouldRefillUnblindedTokens() const { int RefillUnblindedTokens::CalculateAmountOfTokensToRefill() const { return kMaximumUnblindedTokens - - ads_->get_confirmations()->get_unblinded_tokens()->Count(); + ConfirmationsState::Get()->get_unblinded_tokens()->Count(); } void RefillUnblindedTokens::GenerateAndBlindTokens(const int count) { diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h index f72009621288..6bcab3984e92 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens.h @@ -10,23 +10,20 @@ #include #include "wrapper.hpp" -#include "bat/ads/ads_client.h" -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/backoff_timer.h" #include "bat/ads/internal/tokens/refill_unblinded_tokens/refill_unblinded_tokens_delegate.h" #include "bat/ads/mojom.h" +#include "bat/ads/result.h" namespace ads { -class AdsImpl; - using challenge_bypass_ristretto::Token; using challenge_bypass_ristretto::BlindedToken; class RefillUnblindedTokens { public: - RefillUnblindedTokens( - AdsImpl* ads); + RefillUnblindedTokens(); ~RefillUnblindedTokens(); @@ -71,8 +68,6 @@ class RefillUnblindedTokens { bool is_processing_ = false; - AdsImpl* ads_; // NOT OWNED - RefillUnblindedTokensDelegate* delegate_ = nullptr; }; diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h index 584f922d38be..bfe8aa315f23 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h @@ -10,7 +10,7 @@ #include #include "wrapper.hpp" -#include "bat/ads/internal/account/wallet_info.h" +#include "bat/ads/internal/account/wallet/wallet_info.h" #include "bat/ads/internal/server/url_request_builder.h" #include "bat/ads/mojom.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder_unittest.cc index 57ba42f6ed1f..b6b0f566d2e5 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder_unittest.cc @@ -5,9 +5,6 @@ #include "bat/ads/internal/tokens/refill_unblinded_tokens/request_signed_tokens_url_request_builder.h" -#include -#include - #include "testing/gtest/include/gtest/gtest.h" #include "bat/ads/internal/privacy/privacy_util.h" diff --git a/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.cc b/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.cc new file mode 100644 index 000000000000..ad96e0136961 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.cc @@ -0,0 +1,165 @@ +/* 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/unittest_base.h" + +#include "base/files/file_path.h" +#include "bat/ads/internal/unittest_util.h" +#include "bat/ads/result.h" +#include "bat/ads/mojom.h" + +using ::testing::NiceMock; + +namespace ads { + +namespace { +const char kDatabaseFilename[] = "database.sqlite"; +} // namespace + +UnitTestBase::UnitTestBase() + : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), + ads_client_mock_(std::make_unique>()), + locale_helper_mock_(std::make_unique>()), + platform_helper_mock_(std::make_unique>()) { + // You can do set-up work for each test here + brave_l10n::LocaleHelper::GetInstance()->set_for_testing( + locale_helper_mock_.get()); + + PlatformHelper::GetInstance()->set_for_testing(platform_helper_mock_.get()); +} + +UnitTestBase::~UnitTestBase() { + // You can do clean-up work that doesn't throw exceptions here + + CHECK(setup_called_) + << "You have overridden SetUp but never called UnitTestBase::SetUp"; + + CHECK(teardown_called_) + << "You have overridden TearDown but never called UnitTestBase::TearDown"; +} + +void UnitTestBase::SetUp() { + // Code here will be called immediately after the constructor (right before + // each test) + + SetUpForTesting(/* end to end testing */ false); +} + +void UnitTestBase::SetUpForTesting( + const bool integration_test) { + setup_called_ = true; + + integration_test_ = integration_test; + + Initialize(); +} + +void UnitTestBase::TearDown() { + // Code here will be called immediately after each test (right before the + // destructor) + + teardown_called_ = true; +} + +// Objects declared here can be used by all tests in the test case + +void UnitTestBase::FastForwardClockBy( + const base::TimeDelta& time_delta) { + task_environment_.FastForwardBy(time_delta); +} + +void UnitTestBase::AdvanceClockToMidnightUTC() { + const base::TimeDelta time_delta = base::Time::Now().LocalMidnight() + + base::TimeDelta::FromHours(24) - base::Time::Now(); + + return AdvanceClock(time_delta); +} + +void UnitTestBase::AdvanceClock( + const base::TimeDelta& time_delta) { + task_environment_.AdvanceClock(time_delta); +} + +/////////////////////////////////////////////////////////////////////////////// + +void UnitTestBase::Initialize() { + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + + SetEnvironment(Environment::DEVELOPMENT); + + SetBuildChannel(false, "test"); + + MockLocaleHelper(locale_helper_mock_, "en-US"); + + MockPlatformHelper(platform_helper_mock_, PlatformType::kWindows); + + MockIsNetworkConnectionAvailable(ads_client_mock_, true); + + MockIsForeground(ads_client_mock_, true); + + MockShouldShowNotifications(ads_client_mock_, true); + MockShowNotification(ads_client_mock_); + MockCloseNotification(ads_client_mock_); + + MockLoad(ads_client_mock_); + MockLoadUserModelForId(ads_client_mock_); + MockLoadResourceForId(ads_client_mock_); + MockSave(ads_client_mock_); + + MockPrefs(ads_client_mock_); + + const base::FilePath path = temp_dir_.GetPath(); + database_ = std::make_unique(path.AppendASCII(kDatabaseFilename)); + MockRunDBTransaction(ads_client_mock_, database_); + + if (integration_test_) { + ads_ = std::make_unique(ads_client_mock_.get()); + + ads_->OnWalletUpdated("c387c2d8-a26d-4451-83e4-5c0c6fd942be", + "5BEKM1Y7xcRSg/1q8in/+Lki2weFZQB+UMYZlRw8ql8="); + + return; + } + + ads_client_helper_ = + std::make_unique(ads_client_mock_.get()); + + client_ = std::make_unique(); + + ad_notifications_ = std::make_unique(); + ad_notifications_->Initialize([]( + const Result result) { + ASSERT_EQ(Result::SUCCESS, result); + }); + + confirmations_state_ = std::make_unique(); + confirmations_state_->Initialize([]( + const Result result) { + ASSERT_EQ(Result::SUCCESS, result); + }); + + database_initialize_ = std::make_unique(); + database_initialize_->CreateOrOpen([]( + const Result result) { + ASSERT_EQ(Result::SUCCESS, result); + }); + + tab_manager_ = std::make_unique(); + + user_activity_ = std::make_unique(); +} + +void UnitTestBase::InitializeAds() { + CHECK(integration_test_) << "|InitializeAds| should only be called if " + "|SetUpForTesting| was initialized for integration testing"; + + ads_->Initialize([]( + const Result result) { + ASSERT_EQ(Result::SUCCESS, result); + }); +} + +} // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.h b/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.h new file mode 100644 index 000000000000..ec2c439ac26e --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/unittest_base.h @@ -0,0 +1,94 @@ +/* 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 BAT_ADS_INTERNAL_UNITTEST_BASE_H_ +#define BAT_ADS_INTERNAL_UNITTEST_BASE_H_ + +#include + +#include "base/files/scoped_temp_dir.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "brave/components/l10n/browser/locale_helper_mock.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "bat/ads/database.h" +#include "bat/ads/internal/ads/ad_notifications/ad_notifications.h" +#include "bat/ads/internal/ads_client_helper.h" +#include "bat/ads/internal/ads_client_mock.h" +#include "bat/ads/internal/ads_impl.h" +#include "bat/ads/internal/client/client.h" +#include "bat/ads/internal/confirmations/confirmations_state.h" +#include "bat/ads/internal/database/database_initialize.h" +#include "bat/ads/internal/platform/platform_helper_mock.h" +#include "bat/ads/internal/tab_manager/tab_manager.h" +#include "bat/ads/internal/user_activity/user_activity.h" + +namespace ads { + +class UnitTestBase : public testing::Test { + public: + UnitTestBase(); + + ~UnitTestBase() override; + + UnitTestBase(const UnitTestBase&) = delete; + UnitTestBase& operator=(const UnitTestBase&) = delete; + + // If |integration_test| is set to true test the functionality and performance + // under product-like circumstances with data to replicate live settings to + // simulate what a real user scenario looks like from start to finish. You + // must call |InitializeAds| manually after setting up your mocks + void SetUpForTesting( + const bool integration_test); + + void InitializeAds(); + + // testing::Test implementation + void SetUp() override; + void TearDown() override; + + protected: + base::test::TaskEnvironment task_environment_; + + base::ScopedTempDir temp_dir_; + + std::unique_ptr ads_client_mock_; + std::unique_ptr locale_helper_mock_; + std::unique_ptr platform_helper_mock_; + + // Fast-forwards virtual time by |time_delta|, causing all tasks on the main + // thread and thread pool with a remaining delay less than or equal to + // |time_delta| to be executed in their natural order before this returns + void FastForwardClockBy( + const base::TimeDelta& time_delta); + + // Unlike |FastForwardBy| AdvanceClock does not run tasks + void AdvanceClockToMidnightUTC(); + void AdvanceClock( + const base::TimeDelta& time_delta); + + private: + bool setup_called_ = false; + bool teardown_called_ = false; + + bool integration_test_ = false; + + std::unique_ptr ads_client_helper_; + std::unique_ptr client_; + std::unique_ptr ad_notifications_; + std::unique_ptr confirmations_state_; + std::unique_ptr database_initialize_; + std::unique_ptr database_; + std::unique_ptr tab_manager_; + std::unique_ptr user_activity_; + std::unique_ptr ads_; + + void Initialize(); +}; + +} // namespace ads + +#endif // BAT_ADS_INTERNAL_UNITTEST_BASE_H_ 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 73b4f43a990b..e79e8a66106f 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 @@ -19,13 +19,16 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" +#include "bat/ads/internal/logging.h" #include "brave/base/containers/utils.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/http/http_status_code.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/re2/src/re2/re2.h" #include "url/gurl.h" +#include "url/url_constants.h" #include "bat/ads/internal/ads_client_mock.h" -#include "bat/ads/internal/time_util.h" #include "bat/ads/internal/url_util.h" #include "bat/ads/pref_names.h" @@ -235,6 +238,28 @@ bool GetNextUrlEndpointResponse( return true; } +std::map UrlRequestHeadersToMap( + const std::vector& headers) { + std::map normalized_headers; + + for (const auto& header : headers) { + const std::vector components = base::SplitString(header, + ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + + if (components.size() != 2) { + NOTREACHED(); + continue; + } + + const std::string key = components.at(0); + const std::string value = components.at(1); + + normalized_headers[key] = value; + } + + return normalized_headers; +} + void MockGetBooleanPref( const std::unique_ptr& mock) { ON_CALL(*mock, GetBooleanPref(_)) @@ -399,14 +424,23 @@ void MockClearPref( void MockDefaultPrefs( const std::unique_ptr& mock) { - mock->SetUint64Pref(prefs::kAdsPerDay, 20); - mock->SetUint64Pref(prefs::kAdsPerHour, 2); mock->SetBooleanPref(prefs::kEnabled, true); + + mock->SetUint64Pref(prefs::kAdsPerHour, 2); + mock->SetUint64Pref(prefs::kAdsPerDay, 20); + + mock->SetIntegerPref(prefs::kIdleThreshold, 15); + mock->SetBooleanPref(prefs::kShouldAllowConversionTracking, true); + mock->SetBooleanPref(prefs::kShouldAllowAdsSubdivisionTargeting, false); mock->SetStringPref(prefs::kAdsSubdivisionTargetingCode, "AUTO"); mock->SetStringPref(prefs::kAutoDetectedAdsSubdivisionTargetingCode, ""); - mock->SetIntegerPref(prefs::kIdleThreshold, 15); + + mock->SetStringPref(prefs::kCatalogId, ""); + mock->SetIntegerPref(prefs::kCatalogVersion, 1); + mock->SetInt64Pref(prefs::kCatalogPing, 7200000); + mock->SetInt64Pref(prefs::kCatalogLastUpdated, DistantPast()); } } // namespace @@ -445,6 +479,13 @@ void SetBuildChannel( _build_channel.name = name; } +void MockLocaleHelper( + const std::unique_ptr& mock, + const std::string& locale) { + ON_CALL(*mock, GetLocale()) + .WillByDefault(Return(locale)); +} + void MockPlatformHelper( const std::unique_ptr& mock, const PlatformType platform_type) { @@ -506,6 +547,13 @@ void MockIsNetworkConnectionAvailable( .WillByDefault(Return(is_available)); } +void MockIsForeground( + const std::unique_ptr& mock, + const bool is_foreground) { + ON_CALL(*mock, IsForeground()) + .WillByDefault(Return(is_foreground)); +} + void MockShouldShowNotifications( const std::unique_ptr& mock, const bool should_show) { @@ -513,6 +561,22 @@ void MockShouldShowNotifications( .WillByDefault(Return(should_show)); } +void MockShowNotification( + const std::unique_ptr& mock) { + ON_CALL(*mock, ShowNotification(_)) + .WillByDefault(Invoke([]( + const AdNotificationInfo& ad_notification) { + })); +} + +void MockCloseNotification( + const std::unique_ptr& mock) { + ON_CALL(*mock, CloseNotification(_)) + .WillByDefault(Invoke([]( + const std::string& uuid) { + })); +} + void MockSave( const std::unique_ptr& mock) { ON_CALL(*mock, Save(_, _, _)) @@ -590,7 +654,7 @@ void MockUrlRequest( std::string body; const std::map headers_as_map = - HeadersToMap(url_request->headers); + UrlRequestHeadersToMap(url_request->headers); URLEndpointResponse url_endpoint_response; if (GetNextUrlEndpointResponse(url_request->url, endpoints, @@ -665,10 +729,26 @@ void MockPrefs( MockDefaultPrefs(mock); } +base::Time TimeFromDateString( + const std::string& date) { + const std::string utc_date = date + " 23:59:59.999 +00:00"; + + base::Time time; + if (!base::Time::FromString(utc_date.c_str(), &time)) { + return base::Time(); + } + + return time; +} + int64_t DistantPast() { return 0; // Thursday, 1 January 1970 00:00:00 UTC } +int64_t Now() { + return static_cast(base::Time::Now().ToDoubleT()); +} + int64_t DistantFuture() { return 4102444799; // Thursday, December 31 2099 23:59:59 UTC } diff --git a/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.h b/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.h index 27144f4e1e1c..36ae716ac527 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/unittest_util.h @@ -15,11 +15,12 @@ #include #include "base/files/file_path.h" +#include "base/time/time.h" +#include "brave/components/l10n/browser/locale_helper_mock.h" #include "testing/gtest/include/gtest/gtest.h" #include "bat/ads/ads.h" #include "bat/ads/database.h" #include "bat/ads/internal/platform/platform_helper_mock.h" -#include "bat/ads/result.h" namespace ads { @@ -74,16 +75,6 @@ using URLEndpointResponses = std::vector; using URLEndpoints = std::map; class AdsClientMock; -class AdsImpl; - -template -void Initialize( - const T& object) { - object->Initialize([]( - const Result result) { - ASSERT_EQ(Result::SUCCESS, result); - }); -} base::FilePath GetTestPath(); @@ -96,6 +87,10 @@ void SetBuildChannel( const bool is_release, const std::string& name); +void MockLocaleHelper( + const std::unique_ptr& mock, + const std::string& locale); + void MockPlatformHelper( const std::unique_ptr& mock, const PlatformType platform_type); @@ -104,10 +99,20 @@ void MockIsNetworkConnectionAvailable( const std::unique_ptr& mock, const bool is_available); +void MockIsForeground( + const std::unique_ptr& mock, + const bool is_foreground); + void MockShouldShowNotifications( const std::unique_ptr& mock, const bool should_show); +void MockShowNotification( + const std::unique_ptr& mock); + +void MockCloseNotification( + const std::unique_ptr& mock); + void MockSave( const std::unique_ptr& mock); @@ -131,8 +136,13 @@ void MockRunDBTransaction( void MockPrefs( const std::unique_ptr& mock); +base::Time TimeFromDateString( + const std::string& date); + int64_t DistantPast(); +int64_t Now(); + int64_t DistantFuture(); } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/url_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/url_util.cc index 2b21fc844fec..635d637e01e1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/url_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/url_util.cc @@ -5,9 +5,6 @@ #include "bat/ads/internal/url_util.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "third_party/re2/src/re2/re2.h" #include "url/gurl.h" @@ -16,7 +13,7 @@ namespace ads { -bool UrlMatchesPattern( +bool DoesUrlMatchPattern( const std::string& url, const std::string& pattern) { if (url.empty() || pattern.empty()) { @@ -29,14 +26,14 @@ bool UrlMatchesPattern( return RE2::FullMatch(url, quoted_pattern); } -bool UrlHasScheme( +bool DoesUrlHaveSchemeHTTPOrHTTPS( const std::string& url) { DCHECK(!url.empty()); return GURL(url).SchemeIsHTTPOrHTTPS(); } -std::string GetUrlHost( +std::string GetHostFromUrl( const std::string& url) { GURL gurl(url); if (!gurl.is_valid()) { @@ -46,33 +43,11 @@ std::string GetUrlHost( return gurl.host(); } -bool SameSite( +bool SameDomainOrHost( const std::string& url1, const std::string& url2) { return net::registry_controlled_domains::SameDomainOrHost(GURL(url1), GURL(url2), net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); } -std::map HeadersToMap( - const std::vector& headers) { - std::map normalized_headers; - - for (const auto& header : headers) { - const std::vector components = base::SplitString(header, - ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - - if (components.size() != 2) { - NOTREACHED(); - continue; - } - - const std::string key = components.at(0); - const std::string value = components.at(1); - - normalized_headers[key] = value; - } - - return normalized_headers; -} - } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/url_util.h b/vendor/bat-native-ads/src/bat/ads/internal/url_util.h index cde815805895..0cbd3373f9e6 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/url_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/url_util.h @@ -6,29 +6,24 @@ #ifndef BAT_ADS_INTERNAL_URL_UTIL_H_ #define BAT_ADS_INTERNAL_URL_UTIL_H_ -#include #include -#include namespace ads { -bool UrlMatchesPattern( +bool DoesUrlMatchPattern( const std::string& url, const std::string& pattern); -bool UrlHasScheme( +bool DoesUrlHaveSchemeHTTPOrHTTPS( const std::string& url); -std::string GetUrlHost( +std::string GetHostFromUrl( const std::string& url); -bool SameSite( +bool SameDomainOrHost( const std::string& url1, const std::string& url2); -std::map HeadersToMap( - const std::vector& headers); - } // namespace ads #endif // BAT_ADS_INTERNAL_URL_UTIL_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/url_util_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/url_util_unittest.cc index 11f007fbf621..d0b2e2557ff0 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/url_util_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/url_util_unittest.cc @@ -20,7 +20,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com/"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_TRUE(does_match); @@ -33,7 +33,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com/bar"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_TRUE(does_match); @@ -46,7 +46,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "www.foo.com"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_FALSE(does_match); @@ -59,7 +59,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_FALSE(does_match); @@ -72,7 +72,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com/bar*"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_TRUE(does_match); @@ -85,7 +85,7 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com/woo*hoo"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_TRUE(does_match); @@ -98,85 +98,85 @@ TEST(BatAdsUrlUtilTest, const std::string pattern = "https://www.foo.com/woo*hoo"; // Act - const bool does_match = UrlMatchesPattern(url, pattern); + const bool does_match = DoesUrlMatchPattern(url, pattern); // Assert EXPECT_FALSE(does_match); } TEST(BatAdsUrlUtilTest, - SameSite) { + SameDomainOrHost) { // Arrange const std::string url1 = "https://foo.com?bar=test"; const std::string url2 = "https://subdomain.foo.com/bar"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_TRUE(is_same_site); } TEST(BatAdsUrlUtilTest, - NotSameSite) { + NotSameDomainOrHost) { // Arrange const std::string url1 = "https://foo.com?bar=test"; const std::string url2 = "https://subdomain.bar.com/foo"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_FALSE(is_same_site); } TEST(BatAdsUrlUtilTest, - SameSiteForUrlWithNoSubdomain) { + SameDomainOrHostForUrlWithNoSubdomain) { // Arrange const std::string url1 = "https://foo.com?bar=test"; const std::string url2 = "https://foo.com/bar"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_TRUE(is_same_site); } TEST(BatAdsUrlUtilTest, - NotSameSiteForUrlWithNoSubdomain) { + NotSameDomainOrHostForUrlWithNoSubdomain) { // Arrange const std::string url1 = "https://foo.com?bar=test"; const std::string url2 = "https://bar.com/foo"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_FALSE(is_same_site); } TEST(BatAdsUrlUtilTest, - SameSiteForUrlWithRef) { + SameDomainOrHostForUrlWithRef) { // Arrange const std::string url1 = "https://foo.com?bar=test#ref"; const std::string url2 = "https://foo.com/bar"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_TRUE(is_same_site); } TEST(BatAdsUrlUtilTest, - NotSameSiteForUrlWithRef) { + NotSameDomainOrHostForUrlWithRef) { // Arrange const std::string url1 = "https://foo.com?bar=test#ref"; const std::string url2 = "https://bar.com/foo"; // Act - const bool is_same_site = SameSite(url1, url2); + const bool is_same_site = SameDomainOrHost(url1, url2); // Assert EXPECT_FALSE(is_same_site); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.cc b/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.cc index 3a5bc553948b..3de103d8f176 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.cc @@ -5,38 +5,56 @@ #include "bat/ads/internal/user_activity/user_activity.h" -#include "bat/ads/internal/logging.h" -#include "bat/ads/internal/time_util.h" +#include "base/time/time.h" namespace ads { namespace { -const size_t kMaximumUserActivityEntries = 100; + +UserActivity* g_user_activity = nullptr; + +const size_t kMaximumUserActivityEventHistoryEntries = 100; + +} // namespace + +UserActivity::UserActivity() { + DCHECK_EQ(g_user_activity, nullptr); + g_user_activity = this; } -UserActivity::UserActivity() = default; +UserActivity::~UserActivity() { + DCHECK(g_user_activity); + g_user_activity = nullptr; +} -UserActivity::~UserActivity() = default; +// static +UserActivity* UserActivity::Get() { + DCHECK(g_user_activity); + return g_user_activity; +} + +// static +bool UserActivity::HasInstance() { + return g_user_activity; +} -void UserActivity::RecordActivityForType( - const UserActivityType type) { - if (history_.find(type) == history_.end()) { - history_.insert({type, {}}); +void UserActivity::RecordEvent( + const UserActivityEventType event_type) { + if (history_.find(event_type) == history_.end()) { + history_.insert({event_type, {}}); } - const uint64_t timestamp = - static_cast(base::Time::Now().ToDoubleT()); - history_.at(type).push_front(timestamp); + const int64_t timestamp = static_cast(base::Time::Now().ToDoubleT()); + history_.at(event_type).push_front(timestamp); - if (history_.at(type).size() > kMaximumUserActivityEntries) { - history_.at(type).pop_back(); + if (history_.at(event_type).size() > + kMaximumUserActivityEventHistoryEntries) { + history_.at(event_type).pop_back(); } } -const UserActivityHistoryMap& UserActivity::get_history() const { +const UserActivityEventHistoryMap& UserActivity::get_history() const { return history_; } -/////////////////////////////////////////////////////////////////////////////// - } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.h b/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.h index 38536e985762..9605c8ff5109 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/user_activity/user_activity.h @@ -13,16 +13,17 @@ namespace ads { -enum class UserActivityType { +enum class UserActivityEventType { kOpenedNewOrFocusedOnExistingTab, kClosedTab, - kStartedPlayingMedia, + kPlayedMedia, kBrowserWindowDidBecomeActive, kBrowserWindowDidEnterBackground }; -using UserActivityHistory = std::deque; -using UserActivityHistoryMap = std::map; +using UserActivityEventHistory = std::deque; +using UserActivityEventHistoryMap = + std::map; class UserActivity { public: @@ -30,13 +31,20 @@ class UserActivity { ~UserActivity(); - void RecordActivityForType( - const UserActivityType type); + UserActivity(const UserActivity&) = delete; + UserActivity& operator=(const UserActivity&) = delete; - const UserActivityHistoryMap& get_history() const; + static UserActivity* Get(); + + static bool HasInstance(); + + void RecordEvent( + const UserActivityEventType event); + + const UserActivityEventHistoryMap& get_history() const; private: - UserActivityHistoryMap history_; + UserActivityEventHistoryMap history_; }; } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/pref_names.cc b/vendor/bat-native-ads/src/bat/ads/pref_names.cc index a45ea0511b8a..4e2a7f2db2c2 100644 --- a/vendor/bat-native-ads/src/bat/ads/pref_names.cc +++ b/vendor/bat-native-ads/src/bat/ads/pref_names.cc @@ -37,6 +37,22 @@ const char kAdsSubdivisionTargetingCode[] = const char kAutoDetectedAdsSubdivisionTargetingCode[] = "brave.brave_ads.automatically_detected_ads_subdivision_targeting_code"; +// Stores catalog id +const char kCatalogId[] = + "brave.brave_ads.catalog_id"; + +// Stores catalog version +const char kCatalogVersion[] = + "brave.brave_ads.catalog_version"; + +// Stores catalog ping +const char kCatalogPing[] = + "brave.brave_ads.catalog_ping"; + +// Stores catalog last updated +const char kCatalogLastUpdated[] = + "brave.brave_ads.catalog_last_updated"; + } // namespace prefs } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/statement_info.cc b/vendor/bat-native-ads/src/bat/ads/statement_info.cc index b4aa5165463c..dd43fdfb42e9 100644 --- a/vendor/bat-native-ads/src/bat/ads/statement_info.cc +++ b/vendor/bat-native-ads/src/bat/ads/statement_info.cc @@ -38,6 +38,11 @@ std::string StatementInfo::ToJson() const { base::Value transactions_list = GetTransactionsAsList(); dictionary.SetKey("transactions", base::Value(std::move(transactions_list))); + // Uncleared transactions + base::Value uncleared_transactions_list = GetUnclearedTransactionsAsList(); + dictionary.SetKey("uncleared_transactions", + base::Value(std::move(uncleared_transactions_list))); + // Write to JSON std::string json; base::JSONWriter::Write(dictionary, &json); @@ -68,6 +73,8 @@ bool StatementInfo::FromJson( transactions = GetTransactionsFromDictionary(dictionary); + uncleared_transactions = GetUnclearedTransactionsFromDictionary(dictionary); + return true; } @@ -156,4 +163,44 @@ TransactionList StatementInfo::GetTransactionsFromDictionary( return transactions; } +base::Value StatementInfo::GetUnclearedTransactionsAsList() const { + base::Value list(base::Value::Type::LIST); + + for (const auto& transaction : uncleared_transactions) { + base::Value dictionary(base::Value::Type::DICTIONARY); + transaction.ToDictionary(&dictionary); + + list.Append(std::move(dictionary)); + } + + return list; +} + +TransactionList StatementInfo::GetUnclearedTransactionsFromDictionary( + base::DictionaryValue* dictionary) const { + DCHECK(dictionary); + + base::Value* transactions_list = + dictionary->FindListKey("uncleared_transactions"); + if (!transactions_list) { + return {}; + } + + TransactionList transactions; + + for (auto& value : transactions_list->GetList()) { + base::DictionaryValue* transaction_dictionary = nullptr; + if (!value.GetAsDictionary(&transaction_dictionary)) { + continue; + } + + TransactionInfo transaction; + transaction.FromDictionary(transaction_dictionary); + + transactions.push_back(transaction); + } + + return transactions; +} + } // namespace ads