| Index: chrome/browser/chromeos/extensions/file_browser_notifications_browsertest.cc
|
| diff --git a/chrome/browser/chromeos/extensions/file_browser_notifications_browsertest.cc b/chrome/browser/chromeos/extensions/file_browser_notifications_browsertest.cc
|
| index 89db373516de53ee7c76eae43d34db7025764ed2..52e7759d0c58b751e9e32cc0443fc7f96e927836 100644
|
| --- a/chrome/browser/chromeos/extensions/file_browser_notifications_browsertest.cc
|
| +++ b/chrome/browser/chromeos/extensions/file_browser_notifications_browsertest.cc
|
| @@ -2,42 +2,22 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include <gmock/gmock.h>
|
| +#include "chrome/browser/chromeos/extensions/file_browser_notifications.h"
|
| +
|
| #include <gtest/gtest.h>
|
| #include <string>
|
|
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/chromeos/extensions/file_browser_notifications.h"
|
| -#include "chrome/browser/chromeos/notifications/balloon_collection_impl.h"
|
| #include "chrome/browser/notifications/balloon.h"
|
| +#include "chrome/browser/notifications/balloon_collection.h"
|
| #include "chrome/browser/notifications/notification.h"
|
| #include "chrome/browser/notifications/notification_ui_manager.h"
|
| #include "chrome/test/base/in_process_browser_test.h"
|
| #include "chrome/test/base/ui_test_utils.h"
|
|
|
| -using ::testing::_;
|
| -using ::testing::InSequence;
|
| -using ::testing::Return;
|
| -using ::testing::StrEq;
|
| -
|
| namespace chromeos {
|
|
|
| -class MockNotificationUI : public BalloonCollectionImpl::NotificationUI {
|
| - public:
|
| - virtual ~MockNotificationUI() {}
|
| -
|
| - MOCK_METHOD1(Add, void(Balloon* balloon));
|
| - MOCK_METHOD1(Update, bool(Balloon* balloon));
|
| - MOCK_METHOD1(Remove, void(Balloon* balloon));
|
| - MOCK_METHOD1(Show, void(Balloon* balloon));
|
| -
|
| - virtual void ResizeNotification(Balloon* balloon, const gfx::Size& size)
|
| - OVERRIDE {
|
| - }
|
| - virtual void SetActiveView(BalloonViewImpl* view) OVERRIDE {}
|
| -};
|
| -
|
| class MockFileBrowserNotifications : public FileBrowserNotifications {
|
| public:
|
| explicit MockFileBrowserNotifications(Profile* profile)
|
| @@ -45,19 +25,21 @@ class MockFileBrowserNotifications : public FileBrowserNotifications {
|
| }
|
| virtual ~MockFileBrowserNotifications() {}
|
|
|
| + // Records the notification so we can force it to show later.
|
| virtual void PostDelayedShowNotificationTask(
|
| const std::string& notification_id,
|
| NotificationType type,
|
| const string16& message,
|
| - size_t delay_ms) {
|
| + size_t delay_ms) OVERRIDE {
|
| show_callback_data_.id = notification_id;
|
| show_callback_data_.type = type;
|
| show_callback_data_.message = message;
|
| }
|
|
|
| + // Records the notification so we can force it to hide later.
|
| virtual void PostDelayedHideNotificationTask(NotificationType type,
|
| const std::string path,
|
| - size_t delay_ms) {
|
| + size_t delay_ms) OVERRIDE {
|
| hide_callback_data_.type = type;
|
| hide_callback_data_.path = path;
|
| }
|
| @@ -92,19 +74,15 @@ class MockFileBrowserNotifications : public FileBrowserNotifications {
|
|
|
| class FileBrowserNotificationsTest : public InProcessBrowserTest {
|
| public:
|
| - FileBrowserNotificationsTest() {}
|
| + FileBrowserNotificationsTest() : collection_(NULL) {}
|
|
|
| protected:
|
| - void ChangeNotificationUIMock() {
|
| - // collection will take ownership of the mock.
|
| - mock_notification_ui_ = new MockNotificationUI();
|
| - collection_->set_notification_ui(mock_notification_ui_);
|
| - }
|
| -
|
| - void InitNotificationUIMock() {
|
| - collection_ = static_cast<BalloonCollectionImpl*>(
|
| - g_browser_process->notification_ui_manager()->balloon_collection());
|
| - ChangeNotificationUIMock();
|
| + // This must be initialized late in test startup.
|
| + void InitNotifications() {
|
| + Profile* profile = browser()->profile();
|
| + notifications_.reset(new MockFileBrowserNotifications(profile));
|
| + collection_ =
|
| + g_browser_process->notification_ui_manager()->balloon_collection();
|
| }
|
|
|
| bool FindNotification(const std::string& id) {
|
| @@ -112,138 +90,176 @@ class FileBrowserNotificationsTest : public InProcessBrowserTest {
|
| notifications_->notifications().end();
|
| }
|
|
|
| - BalloonCollectionImpl* collection_;
|
| - MockNotificationUI* mock_notification_ui_;
|
| - scoped_ptr<FileBrowserNotifications> notifications_;
|
| -};
|
| -
|
| -MATCHER_P(BalloonNotificationMatcher, expected_id, "") {
|
| - return arg->notification().notification_id() == expected_id;
|
| -}
|
| + bool FindBalloon(const std::string& id) {
|
| + const std::deque<Balloon*>& balloons = collection_->GetActiveBalloons();
|
| + for (std::deque<Balloon*>::const_iterator it = balloons.begin();
|
| + it != balloons.end();
|
| + ++it) {
|
| + Balloon* balloon = *it;
|
| + if (balloon->notification().notification_id() == id)
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
|
|
| -IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, TestBasic) {
|
| - InitNotificationUIMock();
|
| - notifications_.reset(new MockFileBrowserNotifications(browser()->profile()));
|
| + BalloonCollection* collection_;
|
| + scoped_ptr<MockFileBrowserNotifications> notifications_;
|
| +};
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("Dpath")));
|
| +#if defined(USE_AURA)
|
| +// TODO(jamescook): Fails on linux_chromeos_aura because we haven't implemented
|
| +// chromeos::SystemNotification yet. http://crbug.com/104471
|
| +#define MAYBE_TestBasic FAILS_TestBasic
|
| +#else
|
| +#define MAYBE_TestBasic TestBasic
|
| +#endif
|
| +IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, MAYBE_TestBasic) {
|
| + InitNotifications();
|
| + // We start with no balloons.
|
| + EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
|
| +
|
| + // Showing a notification both updates our data and shows a balloon.
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE, "path");
|
| + EXPECT_EQ(1u, notifications_->notifications().size());
|
| + EXPECT_TRUE(FindNotification("Dpath"));
|
| + EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Update(BalloonNotificationMatcher("Dpath")))
|
| - .WillOnce(Return(true));
|
| + // Updating the same notification maintains the same balloon.
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE, "path");
|
| -
|
| EXPECT_EQ(1u, notifications_->notifications().size());
|
| EXPECT_TRUE(FindNotification("Dpath"));
|
| + EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("DFpath")));
|
| + // A new notification adds a new balloon.
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
|
| "path");
|
| EXPECT_EQ(2u, notifications_->notifications().size());
|
| EXPECT_TRUE(FindNotification("DFpath"));
|
| + EXPECT_TRUE(FindNotification("Dpath"));
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Remove(BalloonNotificationMatcher("DFpath")));
|
| + // Hiding a notification removes it from our data.
|
| notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL,
|
| "path");
|
| -
|
| EXPECT_EQ(1u, notifications_->notifications().size());
|
| EXPECT_FALSE(FindNotification("DFpath"));
|
| + EXPECT_TRUE(FindNotification("Dpath"));
|
|
|
| - ui_test_utils::RunAllPendingInMessageLoop();
|
| -
|
| - ChangeNotificationUIMock();
|
| + // Balloons don't go away until we run the message loop.
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
|
|
| - EXPECT_CALL(*mock_notification_ui_, Remove(_))
|
| - .Times(1);
|
| + // Running the message loop allows the balloon to disappear.
|
| + ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
|
| + EXPECT_FALSE(FindBalloon("DFpath"));
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| };
|
|
|
| -IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, ShowDelayedTest) {
|
| - InitNotificationUIMock();
|
| - MockFileBrowserNotifications* mocked_notifications =
|
| - new MockFileBrowserNotifications(browser()->profile());
|
| - notifications_.reset(mocked_notifications);
|
| -
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("Dpath")));
|
| +#if defined(USE_AURA)
|
| +// TODO(jamescook): Fails on linux_chromeos_aura because we haven't implemented
|
| +// chromeos::SystemNotification yet. http://crbug.com/104471
|
| +#define MAYBE_ShowDelayedTest FAILS_ShowDelayedTest
|
| +#else
|
| +// TODO(jamescook): This test is flaky on linux_chromeos, occasionally causing
|
| +// this assertion failure inside Gtk:
|
| +// "murrine_style_draw_box: assertion `height >= -1' failed"
|
| +// There may be an underlying bug in the ChromeOS notification code.
|
| +// I'm not marking it as FLAKY because this doesn't happen on the bots.
|
| +#define MAYBE_ShowDelayedTest ShowDelayedTest
|
| +#endif
|
| +IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, MAYBE_ShowDelayedTest) {
|
| + InitNotifications();
|
| + // Adding a delayed notification does not show a balloon.
|
| notifications_->ShowNotificationDelayed(FileBrowserNotifications::DEVICE,
|
| "path", 3000);
|
| - mocked_notifications->ExecuteShow();
|
| + EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("DFpath")));
|
| + // Forcing the show to happen makes the balloon appear.
|
| + notifications_->ExecuteShow();
|
| + ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| +
|
| + // Showing a notification both immediately and delayed results in one
|
| + // additional balloon.
|
| notifications_->ShowNotificationDelayed(FileBrowserNotifications::DEVICE_FAIL,
|
| "path", 3000);
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
|
| "path");
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
|
|
| - ChangeNotificationUIMock();
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Update(BalloonNotificationMatcher("DFpath")));
|
| - mocked_notifications->ExecuteShow();
|
| -
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Remove(BalloonNotificationMatcher("Fpath")))
|
| - .Times(0);
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("Fpath")))
|
| - .Times(0);
|
| + // When the delayed notification arrives, it's an update, so we still only
|
| + // have two balloons.
|
| + notifications_->ExecuteShow();
|
| + ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
| +
|
| + // If we schedule a show for later, then hide before it becomes visible,
|
| + // the balloon should not be added.
|
| notifications_->ShowNotificationDelayed(
|
| FileBrowserNotifications::FORMAT_FAIL, "path", 3000);
|
| notifications_->HideNotification(FileBrowserNotifications::FORMAT_FAIL,
|
| "path");
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
| + EXPECT_FALSE(FindBalloon("Fpath"));
|
| +
|
| + // Even when we try to force the show, nothing appears, because the balloon
|
| + // was explicitly hidden.
|
| + notifications_->ExecuteShow();
|
| ui_test_utils::RunAllPendingInMessageLoop();
|
| -
|
| - mocked_notifications->ExecuteShow();
|
| -
|
| - ChangeNotificationUIMock();
|
| - EXPECT_CALL(*mock_notification_ui_, Remove(_))
|
| - .Times(2);
|
| -
|
| - ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
| + EXPECT_TRUE(FindBalloon("DFpath"));
|
| + EXPECT_FALSE(FindBalloon("Fpath"));
|
| }
|
|
|
| -IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, HideDelayedTest) {
|
| - InitNotificationUIMock();
|
| - MockFileBrowserNotifications* mocked_notifications =
|
| - new MockFileBrowserNotifications(browser()->profile());
|
| - notifications_.reset(mocked_notifications);
|
| -
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("Dpath")));
|
| +#if defined(USE_AURA)
|
| +// TODO(jamescook): Fails on linux_chromeos_aura because we haven't implemented
|
| +// chromeos::SystemNotification yet. http://crbug.com/104471
|
| +#define MAYBE_HideDelayedTest FAILS_HideDelayedTest
|
| +#else
|
| +#define MAYBE_HideDelayedTest HideDelayedTest
|
| +#endif
|
| +IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, MAYBE_HideDelayedTest) {
|
| + InitNotifications();
|
| + // Showing now, and scheduling a hide for later, results in one balloon.
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE, "path");
|
| -
|
| notifications_->HideNotificationDelayed(FileBrowserNotifications::DEVICE,
|
| "path", 3000);
|
| - ChangeNotificationUIMock();
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Remove(BalloonNotificationMatcher("Dpath")));
|
| - mocked_notifications->ExecuteHide();
|
| + EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
|
| + EXPECT_TRUE(FindBalloon("Dpath"));
|
|
|
| + // Forcing the hide removes the balloon.
|
| + notifications_->ExecuteHide();
|
| ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
|
|
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Add(BalloonNotificationMatcher("DFpath")));
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Remove(BalloonNotificationMatcher("DFpath")));
|
| + // Immediate show then hide results in no balloons.
|
| notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
|
| "path");
|
| notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL,
|
| "path");
|
| ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
|
|
|
| + // Delayed hide for a notification that doesn't exist does nothing.
|
| notifications_->HideNotificationDelayed(FileBrowserNotifications::DEVICE_FAIL,
|
| "path", 3000);
|
| - ChangeNotificationUIMock();
|
| - EXPECT_CALL(*mock_notification_ui_,
|
| - Remove(BalloonNotificationMatcher("DFpath")))
|
| - .Times(0);
|
| - mocked_notifications->ExecuteHide();
|
| -
|
| + notifications_->ExecuteHide();
|
| ui_test_utils::RunAllPendingInMessageLoop();
|
| + EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
|
| }
|
|
|
| } // namespace chromeos.
|
| -
|
|
|