Skip to content

Commit 7625160

Browse files
committed
Added NTP SI ads frequency capping tests.
fix brave/brave-browser#14015
1 parent 573dca2 commit 7625160

11 files changed

+386
-15
lines changed

components/brave_ads/browser/BUILD.gn

+13
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,16 @@ source_set("browser") {
5050
deps += [ "//brave/components/brave_adaptive_captcha" ]
5151
}
5252
}
53+
54+
source_set("test_support") {
55+
testonly = true
56+
57+
public_deps = [ ":browser" ]
58+
59+
deps = [ "//testing/gmock" ]
60+
61+
sources = [
62+
"mock_ads_service.cc",
63+
"mock_ads_service.h",
64+
]
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
5+
6+
#include "brave/components/brave_ads/browser/mock_ads_service.h"
7+
8+
namespace brave_ads {
9+
10+
MockAdsService::MockAdsService() = default;
11+
12+
MockAdsService::~MockAdsService() = default;
13+
14+
} // namespace brave_ads
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BRAVE_COMPONENTS_BRAVE_ADS_BROWSER_MOCK_ADS_SERVICE_H_
7+
#define BRAVE_COMPONENTS_BRAVE_ADS_BROWSER_MOCK_ADS_SERVICE_H_
8+
9+
#include <string>
10+
#include <vector>
11+
12+
#include "brave/components/brave_ads/browser/ads_service.h"
13+
#include "testing/gmock/include/gmock/gmock.h"
14+
15+
namespace brave_ads {
16+
17+
class MockAdsService : public AdsService {
18+
public:
19+
MockAdsService();
20+
~MockAdsService() override;
21+
22+
MockAdsService(const MockAdsService&) = delete;
23+
MockAdsService& operator=(const MockAdsService&) = delete;
24+
25+
MOCK_CONST_METHOD0(IsSupportedLocale, bool());
26+
27+
MOCK_CONST_METHOD0(IsEnabled, bool());
28+
MOCK_METHOD1(SetEnabled, void(bool));
29+
30+
MOCK_METHOD1(SetAllowConversionTracking, void(bool));
31+
32+
MOCK_CONST_METHOD0(GetAdsPerHour, int64_t());
33+
MOCK_METHOD1(SetAdsPerHour, void(int64_t));
34+
35+
MOCK_CONST_METHOD0(ShouldAllowAdsSubdivisionTargeting, bool());
36+
MOCK_CONST_METHOD0(GetAdsSubdivisionTargetingCode, std::string());
37+
MOCK_METHOD1(SetAdsSubdivisionTargetingCode, void(const std::string&));
38+
MOCK_CONST_METHOD0(GetAutoDetectedAdsSubdivisionTargetingCode, std::string());
39+
MOCK_METHOD1(SetAutoDetectedAdsSubdivisionTargetingCode,
40+
void(const std::string&));
41+
42+
#if BUILDFLAG(BRAVE_ADAPTIVE_CAPTCHA_ENABLED)
43+
MOCK_METHOD2(ShowScheduledCaptcha,
44+
void(const std::string&, const std::string&));
45+
MOCK_METHOD0(SnoozeScheduledCaptcha, void());
46+
#endif
47+
48+
MOCK_METHOD1(OnShowAdNotification, void(const std::string&));
49+
MOCK_METHOD2(OnCloseAdNotification, void(const std::string&, bool));
50+
MOCK_METHOD1(OnClickAdNotification, void(const std::string&));
51+
52+
MOCK_METHOD1(ChangeLocale, void(const std::string&));
53+
54+
MOCK_METHOD3(OnHtmlLoaded,
55+
void(const SessionID&,
56+
const std::vector<GURL>&,
57+
const std::string&));
58+
59+
MOCK_METHOD3(OnTextLoaded,
60+
void(const SessionID&,
61+
const std::vector<GURL>&,
62+
const std::string&));
63+
64+
MOCK_METHOD1(OnUserGesture, void(int32_t));
65+
66+
MOCK_METHOD1(OnMediaStart, void(const SessionID&));
67+
MOCK_METHOD1(OnMediaStop, void(const SessionID&));
68+
69+
MOCK_METHOD4(OnTabUpdated, void(const SessionID&, const GURL&, bool, bool));
70+
71+
MOCK_METHOD1(OnTabClosed, void(const SessionID&));
72+
73+
MOCK_METHOD1(OnResourceComponentUpdated, void(const std::string&));
74+
75+
MOCK_METHOD3(OnNewTabPageAdEvent,
76+
void(const std::string&,
77+
const std::string&,
78+
ads::mojom::NewTabPageAdEventType));
79+
80+
MOCK_METHOD3(OnPromotedContentAdEvent,
81+
void(const std::string&,
82+
const std::string&,
83+
ads::mojom::PromotedContentAdEventType));
84+
85+
MOCK_METHOD2(GetInlineContentAd,
86+
void(const std::string&, OnGetInlineContentAdCallback));
87+
MOCK_METHOD3(OnInlineContentAdEvent,
88+
void(const std::string&,
89+
const std::string&,
90+
ads::mojom::InlineContentAdEventType));
91+
92+
MOCK_METHOD0(GetPrefetchedNewTabPageAd, absl::optional<std::string>());
93+
94+
MOCK_METHOD1(PurgeOrphanedAdEventsForType, void(ads::mojom::AdType));
95+
96+
MOCK_METHOD3(GetAdsHistory, void(double, double, OnGetAdsHistoryCallback));
97+
98+
MOCK_METHOD1(GetAccountStatement, void(GetAccountStatementCallback));
99+
100+
MOCK_METHOD1(GetAdDiagnostics, void(GetAdDiagnosticsCallback));
101+
102+
MOCK_METHOD2(ToggleAdThumbUp,
103+
void(const std::string&, OnToggleAdThumbUpCallback));
104+
MOCK_METHOD2(ToggleAdThumbDown,
105+
void(const std::string&, OnToggleAdThumbDownCallback));
106+
107+
MOCK_METHOD3(ToggleAdOptIn,
108+
void(const std::string&, int, OnToggleAdOptInCallback));
109+
MOCK_METHOD3(ToggleAdOptOut,
110+
void(const std::string&, int, OnToggleAdOptOutCallback));
111+
112+
MOCK_METHOD2(ToggleSavedAd,
113+
void(const std::string&, OnToggleSavedAdCallback));
114+
115+
MOCK_METHOD2(ToggleFlaggedAd,
116+
void(const std::string&, OnToggleFlaggedAdCallback));
117+
118+
MOCK_METHOD1(ResetAllState, void(bool));
119+
};
120+
121+
} // namespace brave_ads
122+
123+
#endif // BRAVE_COMPONENTS_BRAVE_ADS_BROWSER_MOCK_ADS_SERVICE_H_

components/ntp_background_images/browser/ntp_background_images_service.h

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class NTPBackgroundImagesService {
7575
private:
7676
friend class TestNTPBackgroundImagesService;
7777
friend class NTPBackgroundImagesServiceTest;
78+
friend class NTPBackgroundImagesViewCounterTest;
7879
FRIEND_TEST_ALL_PREFIXES(NTPBackgroundImagesServiceTest, InternalDataTest);
7980
FRIEND_TEST_ALL_PREFIXES(NTPBackgroundImagesServiceTest,
8081
MultipleCampaignsTest);

components/ntp_background_images/browser/ntp_background_images_service_unittest.cc

+17
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ constexpr char kTestEmptyComponent[] = R"(
3030
constexpr char kTestSponsoredImages[] = R"(
3131
{
3232
"schemaVersion": 1,
33+
"campaignId": "fb7ee174-5430-4fb9-8e97-29bf14e8d828",
3334
"logo": {
3435
"imageUrl": "logo.png",
3536
"alt": "Technikke: For music lovers",
@@ -43,6 +44,7 @@ constexpr char kTestSponsoredImages[] = R"(
4344
},
4445
{
4546
"imageUrl": "background-2.jpg",
47+
"creativeInstanceId": "c0d61af3-3b85-4af4-a3cc-cf1b3dd40e70",
4648
"logo": {
4749
"imageUrl": "logo-2.png",
4850
"alt": "logo2",
@@ -62,6 +64,7 @@ constexpr char kTestSponsoredImagesWithMultipleCampaigns[] = R"(
6264
"schemaVersion": 1,
6365
"campaigns": [
6466
{
67+
"campaignId": "fb7ee174-5430-4fb9-8e97-29bf14e8d828",
6568
"logo": {
6669
"imageUrl": "logo.png",
6770
"alt": "Technikke: For music lovers",
@@ -75,6 +78,7 @@ constexpr char kTestSponsoredImagesWithMultipleCampaigns[] = R"(
7578
},
7679
{
7780
"imageUrl": "background-2.jpg",
81+
"creativeInstanceId": "c0d61af3-3b85-4af4-a3cc-cf1b3dd40e70",
7882
"logo": {
7983
"imageUrl": "logo-2.png",
8084
"alt": "logo2",
@@ -89,6 +93,7 @@ constexpr char kTestSponsoredImagesWithMultipleCampaigns[] = R"(
8993
]
9094
},
9195
{
96+
"campaignId": "b4fa7661-235f-457e-9911-3de6ec19cfd3",
9297
"logo": {
9398
"imageUrl": "logo-3.png",
9499
"alt": "Technikke: For music lovers",
@@ -98,6 +103,7 @@ constexpr char kTestSponsoredImagesWithMultipleCampaigns[] = R"(
98103
"wallpapers": [
99104
{
100105
"imageUrl": "background-4.jpg",
106+
"creativeInstanceId": "1744602b-253b-47b2-909b-f9b248a6b681",
101107
"focalPoint": { "x": 696, "y": 691 }
102108
},
103109
{
@@ -291,6 +297,7 @@ TEST_F(NTPBackgroundImagesServiceTest, InternalDataTest) {
291297
// Above json data has 3 wallpapers.
292298
EXPECT_EQ(1UL, si_data->campaigns.size());
293299
const auto campaign = si_data->campaigns[0];
300+
EXPECT_FALSE(campaign.campaign_id.empty());
294301
const size_t image_count = 3;
295302
EXPECT_EQ(image_count, campaign.backgrounds.size());
296303
EXPECT_EQ(696, campaign.backgrounds[0].focal_point.x());
@@ -303,6 +310,9 @@ TEST_F(NTPBackgroundImagesServiceTest, InternalDataTest) {
303310
EXPECT_EQ(0, campaign.backgrounds[2].focal_point.x());
304311
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("background-3.jpg"),
305312
campaign.backgrounds[2].image_file.BaseName());
313+
EXPECT_TRUE(campaign.backgrounds[0].creative_instance_id.empty());
314+
EXPECT_FALSE(campaign.backgrounds[1].creative_instance_id.empty());
315+
EXPECT_TRUE(campaign.backgrounds[2].creative_instance_id.empty());
306316
EXPECT_TRUE(observer.on_si_updated_);
307317
EXPECT_FALSE(
308318
observer.si_data_->campaigns[0].backgrounds[0].logo.alt_text.empty());
@@ -419,22 +429,29 @@ TEST_F(NTPBackgroundImagesServiceTest, MultipleCampaignsTest) {
419429
EXPECT_FALSE(si_data->IsSuperReferral());
420430
EXPECT_EQ(2UL, si_data->campaigns.size());
421431
const auto campaign_0 = si_data->campaigns[0];
432+
EXPECT_FALSE(campaign_0.campaign_id.empty());
422433
EXPECT_EQ(3UL, campaign_0.backgrounds.size());
423434
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("background-1.jpg"),
424435
campaign_0.backgrounds[0].image_file.BaseName());
425436
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("logo.png"),
426437
campaign_0.backgrounds[0].logo.image_file.BaseName());
427438
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("logo-2.png"),
428439
campaign_0.backgrounds[1].logo.image_file.BaseName());
440+
EXPECT_TRUE(campaign_0.backgrounds[0].creative_instance_id.empty());
441+
EXPECT_FALSE(campaign_0.backgrounds[1].creative_instance_id.empty());
442+
EXPECT_TRUE(campaign_0.backgrounds[2].creative_instance_id.empty());
429443

430444
const auto campaign_1 = si_data->campaigns[1];
445+
EXPECT_FALSE(campaign_1.campaign_id.empty());
431446
EXPECT_EQ(2UL, campaign_1.backgrounds.size());
432447
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("background-4.jpg"),
433448
campaign_1.backgrounds[0].image_file.BaseName());
434449
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("background-5.jpg"),
435450
campaign_1.backgrounds[1].image_file.BaseName());
436451
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("logo-4.png"),
437452
campaign_1.backgrounds[1].logo.image_file.BaseName());
453+
EXPECT_FALSE(campaign_1.backgrounds[0].creative_instance_id.empty());
454+
EXPECT_TRUE(campaign_1.backgrounds[1].creative_instance_id.empty());
438455

439456
service_->RemoveObserver(&observer);
440457
}

components/ntp_background_images/browser/ntp_sponsored_images_data.cc

+9-4
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,15 @@ Logo::Logo(const Logo&) = default;
110110
Logo::~Logo() = default;
111111

112112
SponsoredBackground::SponsoredBackground() = default;
113-
SponsoredBackground::SponsoredBackground(const base::FilePath& image_file_path,
114-
const gfx::Point& point,
115-
const Logo& test_logo)
116-
: image_file(image_file_path), focal_point(point), logo(test_logo) {}
113+
SponsoredBackground::SponsoredBackground(
114+
const base::FilePath& image_file_path,
115+
const gfx::Point& point,
116+
const Logo& test_logo,
117+
const std::string& creative_instance_id)
118+
: image_file(image_file_path),
119+
focal_point(point),
120+
creative_instance_id(creative_instance_id),
121+
logo(test_logo) {}
117122
SponsoredBackground::SponsoredBackground(const SponsoredBackground&) = default;
118123
SponsoredBackground::~SponsoredBackground() = default;
119124

components/ntp_background_images/browser/ntp_sponsored_images_data.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ struct SponsoredBackground {
6868
// For unit test.
6969
SponsoredBackground(const base::FilePath& image_file_path,
7070
const gfx::Point& point,
71-
const Logo& test_logo);
71+
const Logo& test_logo,
72+
const std::string& creative_instance_id);
7273
SponsoredBackground(const SponsoredBackground&);
7374

7475
~SponsoredBackground();

components/ntp_background_images/browser/view_counter_model.h

+3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@ class ViewCounterModel {
5050
static const int kInitialCountToBrandedWallpaper = 1;
5151
static const int kRegularCountToBrandedWallpaper = 3;
5252

53+
friend class NTPBackgroundImagesViewCounterTest;
5354
FRIEND_TEST_ALL_PREFIXES(ViewCounterModelTest, NTPSponsoredImagesTest);
5455
FRIEND_TEST_ALL_PREFIXES(ViewCounterModelTest, NTPBackgroundImagesTest);
5556
FRIEND_TEST_ALL_PREFIXES(ViewCounterModelTest, NTPBackgroundImagesOnlyTest);
57+
FRIEND_TEST_ALL_PREFIXES(ViewCounterModelTest,
58+
NTPFailedToLoadSponsoredImagesTest);
5659
FRIEND_TEST_ALL_PREFIXES(NTPBackgroundImagesViewCounterTest, ModelTest);
5760
FRIEND_TEST_ALL_PREFIXES(NTPBackgroundImagesViewCounterTest,
5861
PrefsWithModelTest);

components/ntp_background_images/browser/view_counter_model_unittest.cc

+30
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,34 @@ TEST(ViewCounterModelTest, NTPSuperReferralTest) {
212212
}
213213
}
214214

215+
TEST(ViewCounterModelTest, NTPFailedToLoadSponsoredImagesTest) {
216+
ViewCounterModel model;
217+
model.SetCampaignsTotalBrandedImageCount(kTestCampaignsTotalImageCount);
218+
model.set_total_image_count(kTestImageCount);
219+
220+
// Loading initial count times.
221+
for (int i = 0; i < ViewCounterModel::kInitialCountToBrandedWallpaper; ++i) {
222+
EXPECT_EQ(i, model.current_wallpaper_image_index());
223+
model.RegisterPageView();
224+
}
225+
EXPECT_TRUE(model.ShouldShowBrandedWallpaper());
226+
const int initial_wallpaper_image_index =
227+
model.current_wallpaper_image_index();
228+
229+
// Simulate that ad was frequency capped by ads service.
230+
model.SetBrandedWallpaperRetrieveFailed();
231+
// If failed to get sponsored image then increment background image index to
232+
// show next background image.
233+
int expected_image_index =
234+
(initial_wallpaper_image_index + 1) % model.total_image_count_;
235+
EXPECT_EQ(expected_image_index, model.current_wallpaper_image_index());
236+
237+
// Process register page view for sponsored image.
238+
model.RegisterPageView();
239+
240+
expected_image_index =
241+
(initial_wallpaper_image_index + 2) % model.total_image_count_;
242+
EXPECT_EQ(expected_image_index, model.current_wallpaper_image_index());
243+
}
244+
215245
} // namespace ntp_background_images

0 commit comments

Comments
 (0)