OLD | NEW |
| (Empty) |
1 // Copyright 2014 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. | |
4 | |
5 #include "chrome/browser/notifications/extension_welcome_notification.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "base/memory/scoped_ptr.h" | |
10 #include "base/message_loop/message_loop.h" | |
11 #include "base/prefs/pref_service.h" | |
12 #include "base/strings/utf_string_conversions.h" | |
13 #include "base/test/test_simple_task_runner.h" | |
14 #include "base/thread_task_runner_handle.h" | |
15 #include "chrome/browser/notifications/notification.h" | |
16 #include "chrome/common/pref_names.h" | |
17 #include "chrome/test/base/testing_pref_service_syncable.h" | |
18 #include "chrome/test/base/testing_profile.h" | |
19 #include "components/pref_registry/pref_registry_syncable.h" | |
20 #include "sync/api/fake_sync_change_processor.h" | |
21 #include "sync/api/sync_error_factory_mock.h" | |
22 #include "testing/gtest/include/gtest/gtest.h" | |
23 #include "ui/message_center/fake_message_center.h" | |
24 #include "ui/message_center/notification.h" | |
25 | |
26 const char kChromeNowExtensionID[] = "pafkbggdmjlpgkdkcbjmhmfcdpncadgh"; | |
27 | |
28 class MockMessageCenter : public message_center::FakeMessageCenter { | |
29 public: | |
30 MockMessageCenter() | |
31 : add_notification_calls_(0), | |
32 remove_notification_calls_(0), | |
33 notifications_with_shown_as_popup_(0) { | |
34 } | |
35 | |
36 int add_notification_calls() { return add_notification_calls_; } | |
37 int remove_notification_calls() { return remove_notification_calls_; } | |
38 int notifications_with_shown_as_popup() { | |
39 return notifications_with_shown_as_popup_; | |
40 } | |
41 | |
42 // message_center::FakeMessageCenter Overrides | |
43 virtual message_center::Notification* FindVisibleNotificationById( | |
44 const std::string& id) OVERRIDE { | |
45 if (last_notification.get() && last_notification->id() == id) | |
46 return last_notification.get(); | |
47 return NULL; | |
48 } | |
49 | |
50 virtual void AddNotification( | |
51 scoped_ptr<message_center::Notification> notification) OVERRIDE { | |
52 EXPECT_FALSE(last_notification.get()); | |
53 last_notification.swap(notification); | |
54 add_notification_calls_++; | |
55 if (last_notification->shown_as_popup()) | |
56 notifications_with_shown_as_popup_++; | |
57 } | |
58 | |
59 virtual void RemoveNotification(const std::string& id, | |
60 bool by_user) OVERRIDE { | |
61 EXPECT_TRUE(last_notification.get()); | |
62 last_notification.reset(); | |
63 remove_notification_calls_++; | |
64 } | |
65 | |
66 void CloseCurrentNotification() { | |
67 EXPECT_TRUE(last_notification.get()); | |
68 last_notification->delegate()->Close(true); | |
69 RemoveNotification(last_notification->id(), true); | |
70 } | |
71 | |
72 private: | |
73 scoped_ptr<message_center::Notification> last_notification; | |
74 int add_notification_calls_; | |
75 int remove_notification_calls_; | |
76 int notifications_with_shown_as_popup_; | |
77 | |
78 DISALLOW_COPY_AND_ASSIGN(MockMessageCenter); | |
79 }; | |
80 | |
81 class WelcomeNotificationDelegate | |
82 : public ExtensionWelcomeNotification::Delegate { | |
83 public: | |
84 WelcomeNotificationDelegate() | |
85 : start_time_(base::Time::Now()), | |
86 message_center_(new MockMessageCenter()) { | |
87 } | |
88 | |
89 // ExtensionWelcomeNotification::Delegate | |
90 virtual message_center::MessageCenter* GetMessageCenter() OVERRIDE { | |
91 return message_center_.get(); | |
92 } | |
93 | |
94 virtual base::Time GetCurrentTime() OVERRIDE { | |
95 return start_time_ + elapsed_time_; | |
96 } | |
97 | |
98 virtual void PostTask( | |
99 const tracked_objects::Location& from_here, | |
100 const base::Closure& task) OVERRIDE { | |
101 EXPECT_TRUE(pending_task_.is_null()); | |
102 pending_task_ = task; | |
103 } | |
104 | |
105 // WelcomeNotificationDelegate | |
106 MockMessageCenter* message_center() const { return message_center_.get(); } | |
107 | |
108 base::Time GetStartTime() const { return start_time_; } | |
109 | |
110 void SetElapsedTime(base::TimeDelta elapsed_time) { | |
111 elapsed_time_ = elapsed_time; | |
112 } | |
113 | |
114 void RunPendingTask() { | |
115 base::Closure task_to_run = pending_task_; | |
116 pending_task_.Reset(); | |
117 task_to_run.Run(); | |
118 } | |
119 | |
120 private: | |
121 const base::Time start_time_; | |
122 base::TimeDelta elapsed_time_; | |
123 scoped_ptr<MockMessageCenter> message_center_; | |
124 base::Closure pending_task_; | |
125 | |
126 DISALLOW_COPY_AND_ASSIGN(WelcomeNotificationDelegate); | |
127 }; | |
128 | |
129 class ExtensionWelcomeNotificationTest : public testing::Test { | |
130 protected: | |
131 ExtensionWelcomeNotificationTest() { | |
132 scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry( | |
133 new user_prefs::PrefRegistrySyncable()); | |
134 ExtensionWelcomeNotification::RegisterProfilePrefs(pref_registry.get()); | |
135 } | |
136 | |
137 virtual void SetUp() { | |
138 task_runner_ = new base::TestSimpleTaskRunner(); | |
139 thread_task_runner_handle_.reset( | |
140 new base::ThreadTaskRunnerHandle(task_runner_)); | |
141 profile_.reset(new TestingProfile()); | |
142 delegate_ = new WelcomeNotificationDelegate(); | |
143 welcome_notification_ = ExtensionWelcomeNotification::Create( | |
144 kChromeNowExtensionID, profile_.get(), delegate_); | |
145 } | |
146 | |
147 virtual void TearDown() { | |
148 delegate_ = NULL; | |
149 welcome_notification_.reset(); | |
150 profile_.reset(); | |
151 thread_task_runner_handle_.reset(); | |
152 task_runner_ = NULL; | |
153 } | |
154 | |
155 void StartPreferenceSyncing() const { | |
156 PrefServiceSyncable::FromProfile(profile_.get()) | |
157 ->GetSyncableService(syncer::PREFERENCES) | |
158 ->MergeDataAndStartSyncing(syncer::PREFERENCES, | |
159 syncer::SyncDataList(), | |
160 scoped_ptr<syncer::SyncChangeProcessor>( | |
161 new syncer::FakeSyncChangeProcessor), | |
162 scoped_ptr<syncer::SyncErrorFactory>( | |
163 new syncer::SyncErrorFactoryMock())); | |
164 } | |
165 | |
166 void ShowChromeNowNotification() const { | |
167 ShowNotification( | |
168 "ChromeNowNotification", | |
169 message_center::NotifierId(message_center::NotifierId::APPLICATION, | |
170 kChromeNowExtensionID)); | |
171 } | |
172 | |
173 void ShowRegularNotification() const { | |
174 ShowNotification( | |
175 "RegularNotification", | |
176 message_center::NotifierId(message_center::NotifierId::APPLICATION, | |
177 "aaaabbbbccccddddeeeeffffggghhhhi")); | |
178 } | |
179 | |
180 void FlushMessageLoop() { delegate_->RunPendingTask(); } | |
181 | |
182 MockMessageCenter* message_center() const { | |
183 return delegate_->message_center(); | |
184 } | |
185 base::TestSimpleTaskRunner* task_runner() const { | |
186 return task_runner_.get(); | |
187 } | |
188 base::Time GetStartTime() const { | |
189 return delegate_->GetStartTime(); | |
190 } | |
191 void SetElapsedTime(base::TimeDelta elapsed_time) const { | |
192 delegate_->SetElapsedTime(elapsed_time); | |
193 } | |
194 bool GetBooleanPref(const char* path) const { | |
195 return profile_->GetPrefs()->GetBoolean(path); | |
196 } | |
197 void SetBooleanPref(const char* path, bool value) const { | |
198 profile_->GetPrefs()->SetBoolean(path, value); | |
199 } | |
200 int64 GetInt64Pref(const char* path) const { | |
201 return profile_->GetPrefs()->GetInt64(path); | |
202 } | |
203 void SetInt64Pref(const char* path, int64 value) const { | |
204 profile_->GetPrefs()->SetInt64(path, value); | |
205 } | |
206 | |
207 private: | |
208 class TestNotificationDelegate : public NotificationDelegate { | |
209 public: | |
210 explicit TestNotificationDelegate(const std::string& id) : id_(id) {} | |
211 | |
212 // Overridden from NotificationDelegate: | |
213 virtual void Display() OVERRIDE {} | |
214 virtual void Error() OVERRIDE {} | |
215 virtual void Close(bool by_user) OVERRIDE {} | |
216 virtual void Click() OVERRIDE {} | |
217 virtual void ButtonClick(int index) OVERRIDE {} | |
218 | |
219 virtual std::string id() const OVERRIDE { return id_; } | |
220 | |
221 virtual content::WebContents* GetWebContents() const OVERRIDE { | |
222 return NULL; | |
223 } | |
224 | |
225 private: | |
226 virtual ~TestNotificationDelegate() {} | |
227 | |
228 const std::string id_; | |
229 | |
230 DISALLOW_COPY_AND_ASSIGN(TestNotificationDelegate); | |
231 }; | |
232 | |
233 void ShowNotification(std::string notification_id, | |
234 const message_center::NotifierId& notifier_id) const { | |
235 message_center::RichNotificationData rich_notification_data; | |
236 rich_notification_data.priority = 0; | |
237 Notification notification(message_center::NOTIFICATION_TYPE_BASE_FORMAT, | |
238 GURL("http://tests.url"), | |
239 base::UTF8ToUTF16("Title"), | |
240 base::UTF8ToUTF16("Body"), | |
241 gfx::Image(), | |
242 blink::WebTextDirectionDefault, | |
243 notifier_id, | |
244 base::UTF8ToUTF16("Source"), | |
245 base::UTF8ToUTF16(notification_id), | |
246 rich_notification_data, | |
247 new TestNotificationDelegate("TestNotification")); | |
248 welcome_notification_->ShowWelcomeNotificationIfNecessary(notification); | |
249 } | |
250 | |
251 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
252 scoped_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; | |
253 scoped_ptr<TestingProfile> profile_; | |
254 // Weak Ref owned by welcome_notification_ | |
255 WelcomeNotificationDelegate* delegate_; | |
256 scoped_ptr<ExtensionWelcomeNotification> welcome_notification_; | |
257 | |
258 DISALLOW_COPY_AND_ASSIGN(ExtensionWelcomeNotificationTest); | |
259 }; | |
260 | |
261 // Show a regular notification. Expect that WelcomeNotification will | |
262 // not show a welcome notification. | |
263 TEST_F(ExtensionWelcomeNotificationTest, FirstRunShowRegularNotification) { | |
264 StartPreferenceSyncing(); | |
265 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
266 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
267 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
268 | |
269 ShowRegularNotification(); | |
270 | |
271 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
272 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
273 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
274 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
275 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
276 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
277 } | |
278 | |
279 // Show a Chrome Now notification. Expect that WelcomeNotification will | |
280 // show a welcome notification. | |
281 TEST_F(ExtensionWelcomeNotificationTest, FirstRunChromeNowNotification) { | |
282 StartPreferenceSyncing(); | |
283 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
284 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
285 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
286 | |
287 ShowChromeNowNotification(); | |
288 | |
289 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
290 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
291 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
292 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
293 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
294 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
295 } | |
296 | |
297 // Show a Chrome Now notification that was already shown before. | |
298 TEST_F(ExtensionWelcomeNotificationTest, ShowWelcomeNotificationAgain) { | |
299 StartPreferenceSyncing(); | |
300 SetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp, true); | |
301 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
302 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
303 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
304 | |
305 ShowChromeNowNotification(); | |
306 | |
307 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
308 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
309 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 1); | |
310 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
311 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
312 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
313 } | |
314 | |
315 // Don't show a welcome notification if it was previously dismissed on another | |
316 // machine that wrote the synced flag. | |
317 TEST_F(ExtensionWelcomeNotificationTest, | |
318 WelcomeNotificationPreviouslyDismissed) { | |
319 StartPreferenceSyncing(); | |
320 SetBooleanPref(prefs::kWelcomeNotificationDismissed, true); | |
321 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
322 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
323 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
324 | |
325 ShowChromeNowNotification(); | |
326 | |
327 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
328 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
329 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
330 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
331 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
332 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
333 } | |
334 | |
335 // Don't show a welcome notification if it was previously dismissed on this | |
336 // machine. | |
337 TEST_F(ExtensionWelcomeNotificationTest, | |
338 WelcomeNotificationPreviouslyDismissedLocal) { | |
339 StartPreferenceSyncing(); | |
340 SetBooleanPref(prefs::kWelcomeNotificationDismissedLocal, true); | |
341 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
342 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
343 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
344 | |
345 ShowChromeNowNotification(); | |
346 | |
347 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
348 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
349 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
350 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
351 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
352 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
353 } | |
354 | |
355 // Don't show a welcome notification if it was previously dismissed with the | |
356 // local flag and synced flag. This case is possible but rare. | |
357 TEST_F(ExtensionWelcomeNotificationTest, | |
358 WelcomeNotificationPreviouslyDismissedSyncedAndLocal) { | |
359 StartPreferenceSyncing(); | |
360 SetBooleanPref(prefs::kWelcomeNotificationDismissed, true); | |
361 SetBooleanPref(prefs::kWelcomeNotificationDismissedLocal, true); | |
362 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
363 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
364 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
365 | |
366 ShowChromeNowNotification(); | |
367 | |
368 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
369 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
370 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
371 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
372 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
373 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
374 } | |
375 | |
376 // Show a Chrome Now notification and dismiss it. | |
377 // Expect welcome toast dismissed to be true. | |
378 TEST_F(ExtensionWelcomeNotificationTest, DismissWelcomeNotification) { | |
379 StartPreferenceSyncing(); | |
380 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
381 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
382 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
383 | |
384 ShowChromeNowNotification(); | |
385 message_center()->CloseCurrentNotification(); | |
386 FlushMessageLoop(); | |
387 | |
388 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
389 EXPECT_EQ(message_center()->remove_notification_calls(), 1); | |
390 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
391 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
392 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
393 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
394 } | |
395 | |
396 // Show a Chrome Now notification and dismiss it via a synced preference change. | |
397 // Expect welcome toast dismissed to be true. | |
398 TEST_F(ExtensionWelcomeNotificationTest, SyncedDismissalWelcomeNotification) { | |
399 StartPreferenceSyncing(); | |
400 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
401 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
402 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
403 | |
404 ShowChromeNowNotification(); | |
405 SetBooleanPref(prefs::kWelcomeNotificationDismissed, true); | |
406 | |
407 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
408 EXPECT_EQ(message_center()->remove_notification_calls(), 1); | |
409 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
410 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
411 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
412 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
413 } | |
414 | |
415 // Simulate a delayed preference sync when the welcome notification was | |
416 // previously dismissed. | |
417 TEST_F(ExtensionWelcomeNotificationTest, | |
418 DelayedPreferenceSyncPreviouslyDismissed) { | |
419 // Show a notification while the preference system is not syncing. | |
420 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
421 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
422 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
423 | |
424 ShowChromeNowNotification(); | |
425 | |
426 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
427 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
428 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
429 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
430 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
431 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
432 | |
433 // Now start the preference syncing with a previously dismissed welcome. | |
434 SetBooleanPref(prefs::kWelcomeNotificationDismissed, true); | |
435 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
436 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
437 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
438 | |
439 StartPreferenceSyncing(); | |
440 | |
441 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
442 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
443 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
444 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
445 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
446 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
447 } | |
448 | |
449 // Simulate a delayed preference sync when the welcome notification was | |
450 // never shown. | |
451 TEST_F(ExtensionWelcomeNotificationTest, DelayedPreferenceSyncNeverShown) { | |
452 // Show a notification while the preference system is not syncing. | |
453 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
454 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
455 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
456 | |
457 ShowChromeNowNotification(); | |
458 | |
459 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
460 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
461 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
462 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
463 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
464 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
465 | |
466 // Now start the preference syncing with the default preference values. | |
467 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
468 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
469 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
470 | |
471 StartPreferenceSyncing(); | |
472 | |
473 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
474 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
475 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
476 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
477 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
478 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
479 } | |
480 | |
481 // Simulate the passage of time when the welcome notification | |
482 // automatically dismisses. | |
483 TEST_F(ExtensionWelcomeNotificationTest, TimeExpiredNotification) { | |
484 StartPreferenceSyncing(); | |
485 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
486 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
487 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
488 EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 0); | |
489 EXPECT_TRUE(task_runner()->GetPendingTasks().empty()); | |
490 | |
491 ShowChromeNowNotification(); | |
492 | |
493 base::TimeDelta requested_show_time = | |
494 base::TimeDelta::FromDays( | |
495 ExtensionWelcomeNotification::kRequestedShowTimeDays); | |
496 | |
497 EXPECT_EQ(task_runner()->GetPendingTasks().size(), 1U); | |
498 EXPECT_EQ(task_runner()->NextPendingTaskDelay(), requested_show_time); | |
499 | |
500 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
501 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
502 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
503 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
504 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
505 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
506 EXPECT_EQ( | |
507 GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), | |
508 (GetStartTime() + requested_show_time).ToInternalValue()); | |
509 | |
510 SetElapsedTime(requested_show_time); | |
511 task_runner()->RunPendingTasks(); | |
512 | |
513 EXPECT_TRUE(task_runner()->GetPendingTasks().empty()); | |
514 EXPECT_EQ(message_center()->add_notification_calls(), 1); | |
515 EXPECT_EQ(message_center()->remove_notification_calls(), 1); | |
516 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
517 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
518 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
519 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
520 EXPECT_EQ( | |
521 GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), | |
522 (GetStartTime() + requested_show_time).ToInternalValue()); | |
523 } | |
524 | |
525 // Simulate the passage of time after Chrome is closed and the welcome | |
526 // notification expiration elapses. | |
527 TEST_F(ExtensionWelcomeNotificationTest, NotificationPreviouslyExpired) { | |
528 StartPreferenceSyncing(); | |
529 SetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp, true); | |
530 SetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp, 1); | |
531 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
532 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
533 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
534 EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 1); | |
535 EXPECT_TRUE(task_runner()->GetPendingTasks().empty()); | |
536 | |
537 const base::TimeDelta requested_show_time = | |
538 base::TimeDelta::FromDays( | |
539 ExtensionWelcomeNotification::kRequestedShowTimeDays); | |
540 SetElapsedTime(requested_show_time); | |
541 ShowChromeNowNotification(); | |
542 | |
543 EXPECT_TRUE(task_runner()->GetPendingTasks().empty()); | |
544 EXPECT_EQ(message_center()->add_notification_calls(), 0); | |
545 EXPECT_EQ(message_center()->remove_notification_calls(), 0); | |
546 EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0); | |
547 EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed)); | |
548 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal)); | |
549 EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp)); | |
550 EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 1); | |
551 } | |
OLD | NEW |