Aura: Rewrite FileBrowserNotificationsTest

Aura uses the views BalloonCollectionImpl, so this rewrites the test to use the generic BalloonCollection interface.

The test still fails, but will work when chromeos::SystemNotification is implemented on Aura.

BUG=104471
TEST=browser_tests

Review URL: http://codereview.chromium.org/8576010

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110441 0039d316-1c4b-4281-b951-d872f2087c98
parent 9cab7d3b
...@@ -2,42 +2,22 @@ ...@@ -2,42 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include <gmock/gmock.h> #include "chrome/browser/chromeos/extensions/file_browser_notifications.h"
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <string> #include <string>
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/browser.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.h"
#include "chrome/browser/notifications/balloon_collection.h"
#include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification.h"
#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/notifications/notification_ui_manager.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
using ::testing::_;
using ::testing::InSequence;
using ::testing::Return;
using ::testing::StrEq;
namespace chromeos { 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 { class MockFileBrowserNotifications : public FileBrowserNotifications {
public: public:
explicit MockFileBrowserNotifications(Profile* profile) explicit MockFileBrowserNotifications(Profile* profile)
...@@ -45,19 +25,21 @@ class MockFileBrowserNotifications : public FileBrowserNotifications { ...@@ -45,19 +25,21 @@ class MockFileBrowserNotifications : public FileBrowserNotifications {
} }
virtual ~MockFileBrowserNotifications() {} virtual ~MockFileBrowserNotifications() {}
// Records the notification so we can force it to show later.
virtual void PostDelayedShowNotificationTask( virtual void PostDelayedShowNotificationTask(
const std::string& notification_id, const std::string& notification_id,
NotificationType type, NotificationType type,
const string16& message, const string16& message,
size_t delay_ms) { size_t delay_ms) OVERRIDE {
show_callback_data_.id = notification_id; show_callback_data_.id = notification_id;
show_callback_data_.type = type; show_callback_data_.type = type;
show_callback_data_.message = message; show_callback_data_.message = message;
} }
// Records the notification so we can force it to hide later.
virtual void PostDelayedHideNotificationTask(NotificationType type, virtual void PostDelayedHideNotificationTask(NotificationType type,
const std::string path, const std::string path,
size_t delay_ms) { size_t delay_ms) OVERRIDE {
hide_callback_data_.type = type; hide_callback_data_.type = type;
hide_callback_data_.path = path; hide_callback_data_.path = path;
} }
...@@ -92,19 +74,15 @@ class MockFileBrowserNotifications : public FileBrowserNotifications { ...@@ -92,19 +74,15 @@ class MockFileBrowserNotifications : public FileBrowserNotifications {
class FileBrowserNotificationsTest : public InProcessBrowserTest { class FileBrowserNotificationsTest : public InProcessBrowserTest {
public: public:
FileBrowserNotificationsTest() {} FileBrowserNotificationsTest() : collection_(NULL) {}
protected: protected:
void ChangeNotificationUIMock() { // This must be initialized late in test startup.
// collection will take ownership of the mock. void InitNotifications() {
mock_notification_ui_ = new MockNotificationUI(); Profile* profile = browser()->profile();
collection_->set_notification_ui(mock_notification_ui_); notifications_.reset(new MockFileBrowserNotifications(profile));
} collection_ =
g_browser_process->notification_ui_manager()->balloon_collection();
void InitNotificationUIMock() {
collection_ = static_cast<BalloonCollectionImpl*>(
g_browser_process->notification_ui_manager()->balloon_collection());
ChangeNotificationUIMock();
} }
bool FindNotification(const std::string& id) { bool FindNotification(const std::string& id) {
...@@ -112,138 +90,176 @@ class FileBrowserNotificationsTest : public InProcessBrowserTest { ...@@ -112,138 +90,176 @@ class FileBrowserNotificationsTest : public InProcessBrowserTest {
notifications_->notifications().end(); notifications_->notifications().end();
} }
BalloonCollectionImpl* collection_; bool FindBalloon(const std::string& id) {
MockNotificationUI* mock_notification_ui_; const std::deque<Balloon*>& balloons = collection_->GetActiveBalloons();
scoped_ptr<FileBrowserNotifications> notifications_; for (std::deque<Balloon*>::const_iterator it = balloons.begin();
}; it != balloons.end();
++it) {
MATCHER_P(BalloonNotificationMatcher, expected_id, "") { Balloon* balloon = *it;
return arg->notification().notification_id() == expected_id; if (balloon->notification().notification_id() == id)
} return true;
}
return false;
}
IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, TestBasic) { BalloonCollection* collection_;
InitNotificationUIMock(); scoped_ptr<MockFileBrowserNotifications> notifications_;
notifications_.reset(new MockFileBrowserNotifications(browser()->profile())); };
EXPECT_CALL(*mock_notification_ui_, #if defined(USE_AURA)
Add(BalloonNotificationMatcher("Dpath"))); // 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"); 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_, // Updating the same notification maintains the same balloon.
Update(BalloonNotificationMatcher("Dpath")))
.WillOnce(Return(true));
notifications_->ShowNotification(FileBrowserNotifications::DEVICE, "path"); notifications_->ShowNotification(FileBrowserNotifications::DEVICE, "path");
EXPECT_EQ(1u, notifications_->notifications().size()); EXPECT_EQ(1u, notifications_->notifications().size());
EXPECT_TRUE(FindNotification("Dpath")); EXPECT_TRUE(FindNotification("Dpath"));
EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
EXPECT_TRUE(FindBalloon("Dpath"));
EXPECT_CALL(*mock_notification_ui_, // A new notification adds a new balloon.
Add(BalloonNotificationMatcher("DFpath")));
notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL, notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
"path"); "path");
EXPECT_EQ(2u, notifications_->notifications().size()); EXPECT_EQ(2u, notifications_->notifications().size());
EXPECT_TRUE(FindNotification("DFpath")); 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_, // Hiding a notification removes it from our data.
Remove(BalloonNotificationMatcher("DFpath")));
notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL, notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL,
"path"); "path");
EXPECT_EQ(1u, notifications_->notifications().size()); EXPECT_EQ(1u, notifications_->notifications().size());
EXPECT_FALSE(FindNotification("DFpath")); EXPECT_FALSE(FindNotification("DFpath"));
EXPECT_TRUE(FindNotification("Dpath"));
ui_test_utils::RunAllPendingInMessageLoop(); // Balloons don't go away until we run the message loop.
EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
ChangeNotificationUIMock(); EXPECT_TRUE(FindBalloon("DFpath"));
EXPECT_TRUE(FindBalloon("Dpath"));
EXPECT_CALL(*mock_notification_ui_, Remove(_)) // Running the message loop allows the balloon to disappear.
.Times(1); 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) { #if defined(USE_AURA)
InitNotificationUIMock(); // TODO(jamescook): Fails on linux_chromeos_aura because we haven't implemented
MockFileBrowserNotifications* mocked_notifications = // chromeos::SystemNotification yet. http://crbug.com/104471
new MockFileBrowserNotifications(browser()->profile()); #define MAYBE_ShowDelayedTest FAILS_ShowDelayedTest
notifications_.reset(mocked_notifications); #else
// TODO(jamescook): This test is flaky on linux_chromeos, occasionally causing
EXPECT_CALL(*mock_notification_ui_, // this assertion failure inside Gtk:
Add(BalloonNotificationMatcher("Dpath"))); // "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, notifications_->ShowNotificationDelayed(FileBrowserNotifications::DEVICE,
"path", 3000); "path", 3000);
mocked_notifications->ExecuteShow(); EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
EXPECT_CALL(*mock_notification_ui_, // Forcing the show to happen makes the balloon appear.
Add(BalloonNotificationMatcher("DFpath"))); 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, notifications_->ShowNotificationDelayed(FileBrowserNotifications::DEVICE_FAIL,
"path", 3000); "path", 3000);
notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL, notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
"path"); "path");
EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
EXPECT_TRUE(FindBalloon("Dpath"));
EXPECT_TRUE(FindBalloon("DFpath"));
ChangeNotificationUIMock(); // When the delayed notification arrives, it's an update, so we still only
EXPECT_CALL(*mock_notification_ui_, // have two balloons.
Update(BalloonNotificationMatcher("DFpath"))); notifications_->ExecuteShow();
mocked_notifications->ExecuteShow(); ui_test_utils::RunAllPendingInMessageLoop();
EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
EXPECT_CALL(*mock_notification_ui_, EXPECT_TRUE(FindBalloon("Dpath"));
Remove(BalloonNotificationMatcher("Fpath"))) EXPECT_TRUE(FindBalloon("DFpath"));
.Times(0);
EXPECT_CALL(*mock_notification_ui_, // If we schedule a show for later, then hide before it becomes visible,
Add(BalloonNotificationMatcher("Fpath"))) // the balloon should not be added.
.Times(0);
notifications_->ShowNotificationDelayed( notifications_->ShowNotificationDelayed(
FileBrowserNotifications::FORMAT_FAIL, "path", 3000); FileBrowserNotifications::FORMAT_FAIL, "path", 3000);
notifications_->HideNotification(FileBrowserNotifications::FORMAT_FAIL, notifications_->HideNotification(FileBrowserNotifications::FORMAT_FAIL,
"path"); "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(); ui_test_utils::RunAllPendingInMessageLoop();
EXPECT_EQ(2u, collection_->GetActiveBalloons().size());
mocked_notifications->ExecuteShow(); EXPECT_TRUE(FindBalloon("Dpath"));
EXPECT_TRUE(FindBalloon("DFpath"));
ChangeNotificationUIMock(); EXPECT_FALSE(FindBalloon("Fpath"));
EXPECT_CALL(*mock_notification_ui_, Remove(_))
.Times(2);
ui_test_utils::RunAllPendingInMessageLoop();
} }
IN_PROC_BROWSER_TEST_F(FileBrowserNotificationsTest, HideDelayedTest) { #if defined(USE_AURA)
InitNotificationUIMock(); // TODO(jamescook): Fails on linux_chromeos_aura because we haven't implemented
MockFileBrowserNotifications* mocked_notifications = // chromeos::SystemNotification yet. http://crbug.com/104471
new MockFileBrowserNotifications(browser()->profile()); #define MAYBE_HideDelayedTest FAILS_HideDelayedTest
notifications_.reset(mocked_notifications); #else
#define MAYBE_HideDelayedTest HideDelayedTest
EXPECT_CALL(*mock_notification_ui_, #endif
Add(BalloonNotificationMatcher("Dpath"))); 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_->ShowNotification(FileBrowserNotifications::DEVICE, "path");
notifications_->HideNotificationDelayed(FileBrowserNotifications::DEVICE, notifications_->HideNotificationDelayed(FileBrowserNotifications::DEVICE,
"path", 3000); "path", 3000);
ChangeNotificationUIMock(); EXPECT_EQ(1u, collection_->GetActiveBalloons().size());
EXPECT_CALL(*mock_notification_ui_, EXPECT_TRUE(FindBalloon("Dpath"));
Remove(BalloonNotificationMatcher("Dpath")));
mocked_notifications->ExecuteHide();
// Forcing the hide removes the balloon.
notifications_->ExecuteHide();
ui_test_utils::RunAllPendingInMessageLoop(); ui_test_utils::RunAllPendingInMessageLoop();
EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
EXPECT_CALL(*mock_notification_ui_, // Immediate show then hide results in no balloons.
Add(BalloonNotificationMatcher("DFpath")));
EXPECT_CALL(*mock_notification_ui_,
Remove(BalloonNotificationMatcher("DFpath")));
notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL, notifications_->ShowNotification(FileBrowserNotifications::DEVICE_FAIL,
"path"); "path");
notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL, notifications_->HideNotification(FileBrowserNotifications::DEVICE_FAIL,
"path"); "path");
ui_test_utils::RunAllPendingInMessageLoop(); 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, notifications_->HideNotificationDelayed(FileBrowserNotifications::DEVICE_FAIL,
"path", 3000); "path", 3000);
ChangeNotificationUIMock(); notifications_->ExecuteHide();
EXPECT_CALL(*mock_notification_ui_,
Remove(BalloonNotificationMatcher("DFpath")))
.Times(0);
mocked_notifications->ExecuteHide();
ui_test_utils::RunAllPendingInMessageLoop(); ui_test_utils::RunAllPendingInMessageLoop();
EXPECT_EQ(0u, collection_->GetActiveBalloons().size());
} }
} // namespace chromeos. } // namespace chromeos.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment