blob: 35d0f45194e70846233cbc0335806bb1828ccb7a [file] [log] [blame]
// Copyright 2013 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/chromeos/extensions/file_manager/desktop_notifications.h"
#include <gtest/gtest.h>
#include <string>
#include "chrome/browser/browser_process.h"
#include "chrome/browser/notifications/notification.h"
#include "chrome/browser/notifications/notification_ui_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace file_manager {
// Add "FileManager" prefix to the class to avoid name conflicts.
class FileManagerDesktopNotificationsBrowserTest : public InProcessBrowserTest {
public:
FileManagerDesktopNotificationsBrowserTest() {}
virtual void CleanUpOnMainThread() OVERRIDE {
notifications_.reset();
}
protected:
// This must be initialized late in test startup.
void InitNotifications() {
Profile* profile = browser()->profile();
notifications_.reset(new DesktopNotifications(profile));
}
bool FindNotification(const std::string& id) {
return notifications_->HasNotificationForTest(id);
}
scoped_ptr<DesktopNotifications> notifications_;
};
IN_PROC_BROWSER_TEST_F(FileManagerDesktopNotificationsBrowserTest, TestBasic) {
InitNotifications();
// Showing a notification adds a new notification.
notifications_->ShowNotification(DesktopNotifications::DEVICE, "path");
EXPECT_EQ(1u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
// Updating the same notification maintains the same count.
notifications_->ShowNotification(DesktopNotifications::DEVICE, "path");
EXPECT_EQ(1u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
// A new notification increases the count.
notifications_->ShowNotification(DesktopNotifications::DEVICE_FAIL,
"path");
EXPECT_EQ(2u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("DeviceFail_path"));
EXPECT_TRUE(FindNotification("Device_path"));
// Hiding a notification removes it from our data.
notifications_->HideNotification(DesktopNotifications::DEVICE_FAIL,
"path");
EXPECT_EQ(1u, notifications_->GetNotificationCountForTest());
EXPECT_FALSE(FindNotification("DeviceFail_path"));
EXPECT_TRUE(FindNotification("Device_path"));
};
// Note: Delayed tests use a delay time of 0 so that tasks wille execute
// when RunAllPendingInMessageLoop() is called.
IN_PROC_BROWSER_TEST_F(FileManagerDesktopNotificationsBrowserTest,
ShowDelayedTest) {
InitNotifications();
// Adding a delayed notification does not create a notification.
notifications_->ShowNotificationDelayed(DesktopNotifications::DEVICE,
"path",
base::TimeDelta::FromSeconds(0));
EXPECT_EQ(0u, notifications_->GetNotificationCountForTest());
EXPECT_FALSE(FindNotification("Device_path"));
// Running the message loop should create the notification.
content::RunAllPendingInMessageLoop();
EXPECT_EQ(1u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
// Showing a notification both immediately and delayed results in one
// additional notification.
notifications_->ShowNotificationDelayed(DesktopNotifications::DEVICE_FAIL,
"path",
base::TimeDelta::FromSeconds(0));
notifications_->ShowNotification(DesktopNotifications::DEVICE_FAIL,
"path");
EXPECT_EQ(2u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("DeviceFail_path"));
// When the delayed notification is processed, it's an update, so we still
// only have two notifications.
content::RunAllPendingInMessageLoop();
EXPECT_EQ(2u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("DeviceFail_path"));
// If we schedule a show for later, then hide before it becomes visible,
// the notification should not be added.
notifications_->ShowNotificationDelayed(DesktopNotifications::FORMAT_FAIL,
"path",
base::TimeDelta::FromSeconds(0));
notifications_->HideNotification(DesktopNotifications::FORMAT_FAIL,
"path");
EXPECT_EQ(2u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
EXPECT_TRUE(FindNotification("DeviceFail_path"));
EXPECT_FALSE(FindNotification("Format_path"));
// Even after processing messages, no new notification should be added.
content::RunAllPendingInMessageLoop();
EXPECT_EQ(2u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
EXPECT_TRUE(FindNotification("DeviceFail_path"));
EXPECT_FALSE(FindNotification("Format_path"));
}
IN_PROC_BROWSER_TEST_F(FileManagerDesktopNotificationsBrowserTest,
HideDelayedTest) {
InitNotifications();
// Showing now, and scheduling a hide for later, results in one notification.
notifications_->ShowNotification(DesktopNotifications::DEVICE, "path");
notifications_->HideNotificationDelayed(DesktopNotifications::DEVICE,
"path",
base::TimeDelta::FromSeconds(0));
EXPECT_EQ(1u, notifications_->GetNotificationCountForTest());
EXPECT_TRUE(FindNotification("Device_path"));
// Running pending messges should remove the notification.
content::RunAllPendingInMessageLoop();
EXPECT_EQ(0u, notifications_->GetNotificationCountForTest());
// Immediate show then hide results in no notification.
notifications_->ShowNotification(DesktopNotifications::DEVICE_FAIL,
"path");
notifications_->HideNotification(DesktopNotifications::DEVICE_FAIL,
"path");
content::RunAllPendingInMessageLoop();
EXPECT_EQ(0u, notifications_->GetNotificationCountForTest());
// Delayed hide for a notification that doesn't exist does nothing.
notifications_->HideNotificationDelayed(DesktopNotifications::DEVICE_FAIL,
"path",
base::TimeDelta::FromSeconds(0));
content::RunAllPendingInMessageLoop();
EXPECT_EQ(0u, notifications_->GetNotificationCountForTest());
}
// Tests that showing two notifications with the same notification ids and
// different messages results in showing the second notification's message.
// This situation can be encountered while showing notifications for
// MountCompletedEvent.
IN_PROC_BROWSER_TEST_F(FileManagerDesktopNotificationsBrowserTest,
IdenticalNotificationIds) {
InitNotifications();
notifications_->RegisterDevice("path");
notifications_->ManageNotificationsOnMountCompleted("path", "", false, false,
false);
content::RunAllPendingInMessageLoop();
EXPECT_EQ(
l10n_util::GetStringUTF16(IDS_DEVICE_UNKNOWN_DEFAULT_MESSAGE),
notifications_->GetNotificationMessageForTest("DeviceFail_path"));
notifications_->ManageNotificationsOnMountCompleted("path", "", false, false,
false);
content::RunAllPendingInMessageLoop();
EXPECT_EQ(
l10n_util::GetStringUTF16(IDS_MULTIPART_DEVICE_UNSUPPORTED_DEFAULT_MESSAGE),
notifications_->GetNotificationMessageForTest("DeviceFail_path"));
notifications_->UnregisterDevice("path");
}
} // namespace file_manager.