1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "chrome/browser/banners/app_banner_settings_helper.h"
8 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
12 const char kTestURL
[] = "https://www.google.com";
13 const char kTestPackageName
[] = "test.package";
15 base::Time
GetReferenceTime() {
16 base::Time::Exploded exploded_reference_time
;
17 exploded_reference_time
.year
= 2015;
18 exploded_reference_time
.month
= 1;
19 exploded_reference_time
.day_of_month
= 30;
20 exploded_reference_time
.day_of_week
= 5;
21 exploded_reference_time
.hour
= 11;
22 exploded_reference_time
.minute
= 0;
23 exploded_reference_time
.second
= 0;
24 exploded_reference_time
.millisecond
= 0;
26 return base::Time::FromLocalExploded(exploded_reference_time
);
29 bool IsWithinDay(base::Time time1
, base::Time time2
) {
30 return time1
- time2
< base::TimeDelta::FromDays(1) ||
31 time2
- time1
< base::TimeDelta::FromDays(1);
34 class AppBannerSettingsHelperTest
: public ChromeRenderViewHostTestHarness
{};
38 TEST_F(AppBannerSettingsHelperTest
, Block
) {
40 NavigateAndCommit(url
);
42 // Check that by default, showing the banner is allowed.
43 EXPECT_TRUE(AppBannerSettingsHelper::IsAllowed(web_contents(), url
,
46 // Block the banner and test it is no longer allowed.
47 AppBannerSettingsHelper::Block(web_contents(), url
, kTestPackageName
);
48 EXPECT_FALSE(AppBannerSettingsHelper::IsAllowed(web_contents(), url
,
52 TEST_F(AppBannerSettingsHelperTest
, CouldShowEvents
) {
54 NavigateAndCommit(url
);
56 // Check that by default, there are no events recorded.
57 std::vector
<base::Time
> events
=
58 AppBannerSettingsHelper::GetCouldShowBannerEvents(web_contents(), url
,
60 EXPECT_TRUE(events
.empty());
62 base::Time reference_time
= GetReferenceTime();
63 base::Time same_day
= reference_time
+ base::TimeDelta::FromHours(2);
64 base::Time three_days_prior
= reference_time
- base::TimeDelta::FromDays(3);
65 base::Time previous_fortnight
=
66 reference_time
- base::TimeDelta::FromDays(14);
68 // Test adding the first date.
69 AppBannerSettingsHelper::RecordBannerEvent(
70 web_contents(), url
, kTestPackageName
,
71 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, previous_fortnight
);
73 // It should be the only date recorded.
74 events
= AppBannerSettingsHelper::GetCouldShowBannerEvents(
75 web_contents(), url
, kTestPackageName
);
76 EXPECT_EQ(1u, events
.size());
77 EXPECT_TRUE(IsWithinDay(events
[0], previous_fortnight
));
79 // Now add the next date.
80 AppBannerSettingsHelper::RecordBannerEvent(
81 web_contents(), url
, kTestPackageName
,
82 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, three_days_prior
);
84 // Now there should be two days.
85 events
= AppBannerSettingsHelper::GetCouldShowBannerEvents(
86 web_contents(), url
, kTestPackageName
);
87 EXPECT_EQ(2u, events
.size());
88 EXPECT_TRUE(IsWithinDay(events
[0], previous_fortnight
));
89 EXPECT_TRUE(IsWithinDay(events
[1], three_days_prior
));
91 // Now add the reference date.
92 AppBannerSettingsHelper::RecordBannerEvent(
93 web_contents(), url
, kTestPackageName
,
94 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, reference_time
);
96 // Now there should still be two days, but the first date should have been
98 events
= AppBannerSettingsHelper::GetCouldShowBannerEvents(
99 web_contents(), url
, kTestPackageName
);
100 EXPECT_EQ(2u, events
.size());
101 EXPECT_TRUE(IsWithinDay(events
[0], three_days_prior
));
102 EXPECT_TRUE(IsWithinDay(events
[1], reference_time
));
104 // Now add the the other day on the reference date.
105 AppBannerSettingsHelper::RecordBannerEvent(
106 web_contents(), url
, kTestPackageName
,
107 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, same_day
);
109 // Now there should still be the same two days.
110 events
= AppBannerSettingsHelper::GetCouldShowBannerEvents(
111 web_contents(), url
, kTestPackageName
);
112 EXPECT_EQ(2u, events
.size());
113 EXPECT_TRUE(IsWithinDay(events
[0], three_days_prior
));
114 EXPECT_TRUE(IsWithinDay(events
[1], reference_time
));
117 TEST_F(AppBannerSettingsHelperTest
, SingleEvents
) {
119 NavigateAndCommit(url
);
121 base::Time reference_time
= GetReferenceTime();
122 base::Time other_time
= reference_time
- base::TimeDelta::FromDays(3);
123 for (int event
= AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW
;
124 event
< AppBannerSettingsHelper::APP_BANNER_EVENT_NUM_EVENTS
; ++event
) {
125 // Check that by default, there is no event.
126 base::Time event_time
= AppBannerSettingsHelper::GetSingleBannerEvent(
127 web_contents(), url
, kTestPackageName
,
128 AppBannerSettingsHelper::AppBannerEvent(event
));
129 EXPECT_TRUE(event_time
.is_null());
131 // Check that a time can be recorded.
132 AppBannerSettingsHelper::RecordBannerEvent(
133 web_contents(), url
, kTestPackageName
,
134 AppBannerSettingsHelper::AppBannerEvent(event
), reference_time
);
136 event_time
= AppBannerSettingsHelper::GetSingleBannerEvent(
137 web_contents(), url
, kTestPackageName
,
138 AppBannerSettingsHelper::AppBannerEvent(event
));
139 EXPECT_EQ(reference_time
, event_time
);
141 // Check that another time can be recorded.
142 AppBannerSettingsHelper::RecordBannerEvent(
143 web_contents(), url
, kTestPackageName
,
144 AppBannerSettingsHelper::AppBannerEvent(event
), other_time
);
146 event_time
= AppBannerSettingsHelper::GetSingleBannerEvent(
147 web_contents(), url
, kTestPackageName
,
148 AppBannerSettingsHelper::AppBannerEvent(event
));
149 EXPECT_EQ(other_time
, event_time
);
153 TEST_F(AppBannerSettingsHelperTest
, ShouldShowFromEngagement
) {
155 NavigateAndCommit(url
);
157 base::Time reference_time
= GetReferenceTime();
158 base::Time one_day_ago
= reference_time
- base::TimeDelta::FromDays(1);
159 base::Time one_year_ago
= reference_time
- base::TimeDelta::FromDays(366);
161 // By default the banner should not be shown.
162 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
163 web_contents(), url
, kTestPackageName
, reference_time
));
165 // Visit the site once, it still should not be shown.
166 AppBannerSettingsHelper::RecordBannerEvent(
167 web_contents(), url
, kTestPackageName
,
168 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, one_year_ago
);
169 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
170 web_contents(), url
, kTestPackageName
, reference_time
));
172 // Visit the site again after a long delay, it still should not be shown.
173 AppBannerSettingsHelper::RecordBannerEvent(
174 web_contents(), url
, kTestPackageName
,
175 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, one_day_ago
);
176 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
177 web_contents(), url
, kTestPackageName
, reference_time
));
179 // Visit the site again; now it should be shown.
180 AppBannerSettingsHelper::RecordBannerEvent(
181 web_contents(), url
, kTestPackageName
,
182 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, reference_time
);
183 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
184 web_contents(), url
, kTestPackageName
, reference_time
));
187 TEST_F(AppBannerSettingsHelperTest
, ShouldNotShowAfterBlocking
) {
189 NavigateAndCommit(url
);
191 base::Time reference_time
= GetReferenceTime();
192 base::Time one_day_ago
= reference_time
- base::TimeDelta::FromDays(1);
193 base::Time two_months_ago
= reference_time
- base::TimeDelta::FromDays(60);
194 base::Time one_year_ago
= reference_time
- base::TimeDelta::FromDays(366);
196 // By default the banner should not be shown.
197 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
198 web_contents(), url
, kTestPackageName
, reference_time
));
200 // Record events such that the banner should show.
201 AppBannerSettingsHelper::RecordBannerEvent(
202 web_contents(), url
, kTestPackageName
,
203 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, one_day_ago
);
204 AppBannerSettingsHelper::RecordBannerEvent(
205 web_contents(), url
, kTestPackageName
,
206 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, reference_time
);
207 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
208 web_contents(), url
, kTestPackageName
, reference_time
));
210 // Block the site a long time ago. It should still be shown.
211 AppBannerSettingsHelper::RecordBannerEvent(
212 web_contents(), url
, kTestPackageName
,
213 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK
, one_year_ago
);
214 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
215 web_contents(), url
, kTestPackageName
, reference_time
));
217 // Block the site more recently. Now it should not be shown.
218 AppBannerSettingsHelper::RecordBannerEvent(
219 web_contents(), url
, kTestPackageName
,
220 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK
, two_months_ago
);
221 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
222 web_contents(), url
, kTestPackageName
, reference_time
));
225 TEST_F(AppBannerSettingsHelperTest
, ShouldNotShowAfterShowing
) {
227 NavigateAndCommit(url
);
229 base::Time reference_time
= GetReferenceTime();
230 base::Time one_day_ago
= reference_time
- base::TimeDelta::FromDays(1);
231 base::Time three_weeks_ago
= reference_time
- base::TimeDelta::FromDays(21);
232 base::Time one_year_ago
= reference_time
- base::TimeDelta::FromDays(366);
234 // By default the banner should not be shown.
235 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
236 web_contents(), url
, kTestPackageName
, reference_time
));
238 // Record events such that the banner should show.
239 AppBannerSettingsHelper::RecordBannerEvent(
240 web_contents(), url
, kTestPackageName
,
241 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, one_day_ago
);
242 AppBannerSettingsHelper::RecordBannerEvent(
243 web_contents(), url
, kTestPackageName
,
244 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, reference_time
);
245 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
246 web_contents(), url
, kTestPackageName
, reference_time
));
248 // Show the banner a long time ago. It should still be shown.
249 AppBannerSettingsHelper::RecordBannerEvent(
250 web_contents(), url
, kTestPackageName
,
251 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW
, one_year_ago
);
252 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
253 web_contents(), url
, kTestPackageName
, reference_time
));
255 // Show the site more recently. Now it should not be shown.
256 AppBannerSettingsHelper::RecordBannerEvent(
257 web_contents(), url
, kTestPackageName
,
258 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW
, three_weeks_ago
);
259 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
260 web_contents(), url
, kTestPackageName
, reference_time
));
263 TEST_F(AppBannerSettingsHelperTest
, ShouldNotShowAfterAdding
) {
265 NavigateAndCommit(url
);
267 base::Time reference_time
= GetReferenceTime();
268 base::Time one_day_ago
= reference_time
- base::TimeDelta::FromDays(1);
269 base::Time one_year_ago
= reference_time
- base::TimeDelta::FromDays(366);
271 // By default the banner should not be shown.
272 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
273 web_contents(), url
, kTestPackageName
, reference_time
));
275 // Record events such that the banner should show.
276 AppBannerSettingsHelper::RecordBannerEvent(
277 web_contents(), url
, kTestPackageName
,
278 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, one_day_ago
);
279 AppBannerSettingsHelper::RecordBannerEvent(
280 web_contents(), url
, kTestPackageName
,
281 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW
, reference_time
);
282 EXPECT_TRUE(AppBannerSettingsHelper::ShouldShowBanner(
283 web_contents(), url
, kTestPackageName
, reference_time
));
285 // Add the site a long time ago. It should not be shown.
286 AppBannerSettingsHelper::RecordBannerEvent(
287 web_contents(), url
, kTestPackageName
,
288 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN
,
290 EXPECT_FALSE(AppBannerSettingsHelper::ShouldShowBanner(
291 web_contents(), url
, kTestPackageName
, reference_time
));