blob: 6e037ad5b94118c6cf6d09e727513718fdc75232 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/notifications/extension_welcome_notification.h"
#include <string>
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/test_simple_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "chrome/browser/notifications/notification.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_pref_service_syncable.h"
#include "chrome/test/base/testing_profile.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "sync/api/fake_sync_change_processor.h"
#include "sync/api/sync_error_factory_mock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/message_center/fake_message_center.h"
#include "ui/message_center/notification.h"
const char kChromeNowExtensionID[] = "pafkbggdmjlpgkdkcbjmhmfcdpncadgh";
class MockMessageCenter : public message_center::FakeMessageCenter {
public:
MockMessageCenter()
: add_notification_calls_(0),
remove_notification_calls_(0),
notifications_with_shown_as_popup_(0) {
}
int add_notification_calls() { return add_notification_calls_; }
int remove_notification_calls() { return remove_notification_calls_; }
int notifications_with_shown_as_popup() {
return notifications_with_shown_as_popup_;
}
// message_center::FakeMessageCenter Overrides
virtual message_center::Notification* FindVisibleNotificationById(
const std::string& id) OVERRIDE {
if (last_notification.get() && last_notification->id() == id)
return last_notification.get();
return NULL;
}
virtual void AddNotification(
scoped_ptr<message_center::Notification> notification) OVERRIDE {
EXPECT_FALSE(last_notification.get());
last_notification.swap(notification);
add_notification_calls_++;
if (last_notification->shown_as_popup())
notifications_with_shown_as_popup_++;
}
virtual void RemoveNotification(const std::string& id,
bool by_user) OVERRIDE {
EXPECT_TRUE(last_notification.get());
last_notification.reset();
remove_notification_calls_++;
}
void CloseCurrentNotification() {
EXPECT_TRUE(last_notification.get());
last_notification->delegate()->Close(true);
RemoveNotification(last_notification->id(), true);
}
private:
scoped_ptr<message_center::Notification> last_notification;
int add_notification_calls_;
int remove_notification_calls_;
int notifications_with_shown_as_popup_;
DISALLOW_COPY_AND_ASSIGN(MockMessageCenter);
};
class WelcomeNotificationDelegate
: public ExtensionWelcomeNotification::Delegate {
public:
WelcomeNotificationDelegate()
: start_time_(base::Time::Now()),
message_center_(new MockMessageCenter()) {
}
// ExtensionWelcomeNotification::Delegate
virtual message_center::MessageCenter* GetMessageCenter() OVERRIDE {
return message_center_.get();
}
virtual base::Time GetCurrentTime() OVERRIDE {
return start_time_ + elapsed_time_;
}
virtual void PostTask(
const tracked_objects::Location& from_here,
const base::Closure& task) OVERRIDE {
EXPECT_TRUE(pending_task_.is_null());
pending_task_ = task;
}
// WelcomeNotificationDelegate
MockMessageCenter* message_center() const { return message_center_.get(); }
base::Time GetStartTime() const { return start_time_; }
void SetElapsedTime(base::TimeDelta elapsed_time) {
elapsed_time_ = elapsed_time;
}
void RunPendingTask() {
base::Closure task_to_run = pending_task_;
pending_task_.Reset();
task_to_run.Run();
}
private:
const base::Time start_time_;
base::TimeDelta elapsed_time_;
scoped_ptr<MockMessageCenter> message_center_;
base::Closure pending_task_;
DISALLOW_COPY_AND_ASSIGN(WelcomeNotificationDelegate);
};
class ExtensionWelcomeNotificationTest : public testing::Test {
protected:
ExtensionWelcomeNotificationTest() {
scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry(
new user_prefs::PrefRegistrySyncable());
ExtensionWelcomeNotification::RegisterProfilePrefs(pref_registry.get());
}
virtual void SetUp() {
task_runner_ = new base::TestSimpleTaskRunner();
thread_task_runner_handle_.reset(
new base::ThreadTaskRunnerHandle(task_runner_));
profile_.reset(new TestingProfile());
delegate_ = new WelcomeNotificationDelegate();
welcome_notification_ = ExtensionWelcomeNotification::Create(
kChromeNowExtensionID, profile_.get(), delegate_);
}
virtual void TearDown() {
delegate_ = NULL;
welcome_notification_.reset();
profile_.reset();
thread_task_runner_handle_.reset();
task_runner_ = NULL;
}
void StartPreferenceSyncing() const {
PrefServiceSyncable::FromProfile(profile_.get())
->GetSyncableService(syncer::PREFERENCES)
->MergeDataAndStartSyncing(syncer::PREFERENCES,
syncer::SyncDataList(),
scoped_ptr<syncer::SyncChangeProcessor>(
new syncer::FakeSyncChangeProcessor),
scoped_ptr<syncer::SyncErrorFactory>(
new syncer::SyncErrorFactoryMock()));
}
void ShowChromeNowNotification() const {
ShowNotification(
"ChromeNowNotification",
message_center::NotifierId(message_center::NotifierId::APPLICATION,
kChromeNowExtensionID));
}
void ShowRegularNotification() const {
ShowNotification(
"RegularNotification",
message_center::NotifierId(message_center::NotifierId::APPLICATION,
"aaaabbbbccccddddeeeeffffggghhhhi"));
}
void FlushMessageLoop() { delegate_->RunPendingTask(); }
MockMessageCenter* message_center() const {
return delegate_->message_center();
}
base::TestSimpleTaskRunner* task_runner() const {
return task_runner_.get();
}
base::Time GetStartTime() const {
return delegate_->GetStartTime();
}
void SetElapsedTime(base::TimeDelta elapsed_time) const {
delegate_->SetElapsedTime(elapsed_time);
}
bool GetBooleanPref(const char* path) const {
return profile_->GetPrefs()->GetBoolean(path);
}
void SetBooleanPref(const char* path, bool value) const {
profile_->GetPrefs()->SetBoolean(path, value);
}
int64 GetInt64Pref(const char* path) const {
return profile_->GetPrefs()->GetInt64(path);
}
void SetInt64Pref(const char* path, int64 value) const {
profile_->GetPrefs()->SetInt64(path, value);
}
private:
class TestNotificationDelegate : public NotificationDelegate {
public:
explicit TestNotificationDelegate(const std::string& id) : id_(id) {}
// Overridden from NotificationDelegate:
virtual void Display() OVERRIDE {}
virtual void Error() OVERRIDE {}
virtual void Close(bool by_user) OVERRIDE {}
virtual void Click() OVERRIDE {}
virtual void ButtonClick(int index) OVERRIDE {}
virtual std::string id() const OVERRIDE { return id_; }
virtual content::WebContents* GetWebContents() const OVERRIDE {
return NULL;
}
private:
virtual ~TestNotificationDelegate() {}
const std::string id_;
DISALLOW_COPY_AND_ASSIGN(TestNotificationDelegate);
};
void ShowNotification(std::string notification_id,
const message_center::NotifierId& notifier_id) const {
message_center::RichNotificationData rich_notification_data;
rich_notification_data.priority = 0;
Notification notification(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
GURL("http://tests.url"),
base::UTF8ToUTF16("Title"),
base::UTF8ToUTF16("Body"),
gfx::Image(),
blink::WebTextDirectionDefault,
notifier_id,
base::UTF8ToUTF16("Source"),
base::UTF8ToUTF16(notification_id),
rich_notification_data,
new TestNotificationDelegate("TestNotification"));
welcome_notification_->ShowWelcomeNotificationIfNecessary(notification);
}
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
scoped_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_;
scoped_ptr<TestingProfile> profile_;
// Weak Ref owned by welcome_notification_
WelcomeNotificationDelegate* delegate_;
scoped_ptr<ExtensionWelcomeNotification> welcome_notification_;
DISALLOW_COPY_AND_ASSIGN(ExtensionWelcomeNotificationTest);
};
// Show a regular notification. Expect that WelcomeNotification will
// not show a welcome notification.
TEST_F(ExtensionWelcomeNotificationTest, FirstRunShowRegularNotification) {
StartPreferenceSyncing();
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowRegularNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Show a Chrome Now notification. Expect that WelcomeNotification will
// show a welcome notification.
TEST_F(ExtensionWelcomeNotificationTest, FirstRunChromeNowNotification) {
StartPreferenceSyncing();
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Show a Chrome Now notification that was already shown before.
TEST_F(ExtensionWelcomeNotificationTest, ShowWelcomeNotificationAgain) {
StartPreferenceSyncing();
SetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp, true);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 1);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Don't show a welcome notification if it was previously dismissed on another
// machine that wrote the synced flag.
TEST_F(ExtensionWelcomeNotificationTest,
WelcomeNotificationPreviouslyDismissed) {
StartPreferenceSyncing();
SetBooleanPref(prefs::kWelcomeNotificationDismissed, true);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Don't show a welcome notification if it was previously dismissed on this
// machine.
TEST_F(ExtensionWelcomeNotificationTest,
WelcomeNotificationPreviouslyDismissedLocal) {
StartPreferenceSyncing();
SetBooleanPref(prefs::kWelcomeNotificationDismissedLocal, true);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Don't show a welcome notification if it was previously dismissed with the
// local flag and synced flag. This case is possible but rare.
TEST_F(ExtensionWelcomeNotificationTest,
WelcomeNotificationPreviouslyDismissedSyncedAndLocal) {
StartPreferenceSyncing();
SetBooleanPref(prefs::kWelcomeNotificationDismissed, true);
SetBooleanPref(prefs::kWelcomeNotificationDismissedLocal, true);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Show a Chrome Now notification and dismiss it.
// Expect welcome toast dismissed to be true.
TEST_F(ExtensionWelcomeNotificationTest, DismissWelcomeNotification) {
StartPreferenceSyncing();
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
message_center()->CloseCurrentNotification();
FlushMessageLoop();
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 1);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Show a Chrome Now notification and dismiss it via a synced preference change.
// Expect welcome toast dismissed to be true.
TEST_F(ExtensionWelcomeNotificationTest, SyncedDismissalWelcomeNotification) {
StartPreferenceSyncing();
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
SetBooleanPref(prefs::kWelcomeNotificationDismissed, true);
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 1);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Simulate a delayed preference sync when the welcome notification was
// previously dismissed.
TEST_F(ExtensionWelcomeNotificationTest,
DelayedPreferenceSyncPreviouslyDismissed) {
// Show a notification while the preference system is not syncing.
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
// Now start the preference syncing with a previously dismissed welcome.
SetBooleanPref(prefs::kWelcomeNotificationDismissed, true);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
StartPreferenceSyncing();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Simulate a delayed preference sync when the welcome notification was
// never shown.
TEST_F(ExtensionWelcomeNotificationTest, DelayedPreferenceSyncNeverShown) {
// Show a notification while the preference system is not syncing.
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
ShowChromeNowNotification();
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
// Now start the preference syncing with the default preference values.
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
StartPreferenceSyncing();
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
}
// Simulate the passage of time when the welcome notification
// automatically dismisses.
TEST_F(ExtensionWelcomeNotificationTest, TimeExpiredNotification) {
StartPreferenceSyncing();
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 0);
EXPECT_TRUE(task_runner()->GetPendingTasks().empty());
ShowChromeNowNotification();
base::TimeDelta requested_show_time =
base::TimeDelta::FromDays(
ExtensionWelcomeNotification::kRequestedShowTimeDays);
EXPECT_EQ(task_runner()->GetPendingTasks().size(), 1U);
EXPECT_EQ(task_runner()->NextPendingTaskDelay(), requested_show_time);
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
EXPECT_EQ(
GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp),
(GetStartTime() + requested_show_time).ToInternalValue());
SetElapsedTime(requested_show_time);
task_runner()->RunPendingTasks();
EXPECT_TRUE(task_runner()->GetPendingTasks().empty());
EXPECT_EQ(message_center()->add_notification_calls(), 1);
EXPECT_EQ(message_center()->remove_notification_calls(), 1);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
EXPECT_EQ(
GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp),
(GetStartTime() + requested_show_time).ToInternalValue());
}
// Simulate the passage of time after Chrome is closed and the welcome
// notification expiration elapses.
TEST_F(ExtensionWelcomeNotificationTest, NotificationPreviouslyExpired) {
StartPreferenceSyncing();
SetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp, true);
SetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp, 1);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 1);
EXPECT_TRUE(task_runner()->GetPendingTasks().empty());
const base::TimeDelta requested_show_time =
base::TimeDelta::FromDays(
ExtensionWelcomeNotification::kRequestedShowTimeDays);
SetElapsedTime(requested_show_time);
ShowChromeNowNotification();
EXPECT_TRUE(task_runner()->GetPendingTasks().empty());
EXPECT_EQ(message_center()->add_notification_calls(), 0);
EXPECT_EQ(message_center()->remove_notification_calls(), 0);
EXPECT_EQ(message_center()->notifications_with_shown_as_popup(), 0);
EXPECT_FALSE(GetBooleanPref(prefs::kWelcomeNotificationDismissed));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationDismissedLocal));
EXPECT_TRUE(GetBooleanPref(prefs::kWelcomeNotificationPreviouslyPoppedUp));
EXPECT_EQ(GetInt64Pref(prefs::kWelcomeNotificationExpirationTimestamp), 1);
}