summaryrefslogtreecommitdiff
path: root/chromium/ash/system/user/tray_user_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/system/user/tray_user_unittest.cc')
-rw-r--r--chromium/ash/system/user/tray_user_unittest.cc320
1 files changed, 320 insertions, 0 deletions
diff --git a/chromium/ash/system/user/tray_user_unittest.cc b/chromium/ash/system/user/tray_user_unittest.cc
new file mode 100644
index 00000000000..ad6966104f8
--- /dev/null
+++ b/chromium/ash/system/user/tray_user_unittest.cc
@@ -0,0 +1,320 @@
+// 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 <vector>
+
+#include "ash/ash_switches.h"
+#include "ash/root_window_controller.h"
+#include "ash/shelf/shelf_layout_manager.h"
+#include "ash/shell.h"
+#include "ash/shell_delegate.h"
+#include "ash/system/tray/system_tray.h"
+#include "ash/system/user/tray_user.h"
+#include "ash/system/user/tray_user_separator.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/test/test_session_state_delegate.h"
+#include "ash/test/test_shell_delegate.h"
+#include "base/command_line.h"
+#include "ui/aura/test/event_generator.h"
+#include "ui/gfx/animation/animation_container_element.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+#if defined(OS_CHROMEOS)
+#include "ash/system/tray/system_tray_notifier.h"
+#endif
+
+namespace ash {
+namespace internal {
+
+class TrayUserTest : public ash::test::AshTestBase {
+ public:
+ TrayUserTest();
+
+ // testing::Test:
+ virtual void SetUp() OVERRIDE;
+
+ // This has to be called prior to first use with the proper configuration.
+ void InitializeParameters(int users_logged_in, bool multiprofile);
+
+ // Show the system tray menu using the provided event generator.
+ void ShowTrayMenu(aura::test::EventGenerator* generator);
+
+ // Move the mouse over the user item.
+ void MoveOverUserItem(aura::test::EventGenerator* generator, int index);
+
+ // Click on the user item. Note that the tray menu needs to be shown.
+ void ClickUserItem(aura::test::EventGenerator* generator, int index);
+
+ // Accessors to various system components.
+ ShelfLayoutManager* shelf() { return shelf_; }
+ SystemTray* tray() { return tray_; }
+ ash::test::TestSessionStateDelegate* delegate() { return delegate_; }
+ ash::internal::TrayUser* tray_user(int index) { return tray_user_[index]; }
+ ash::internal::TrayUserSeparator* tray_user_separator() {
+ return tray_user_separator_;
+ }
+
+ private:
+ ShelfLayoutManager* shelf_;
+ SystemTray* tray_;
+ ash::test::TestSessionStateDelegate* delegate_;
+
+ // Note that the ownership of these items is on the shelf.
+ std::vector<ash::internal::TrayUser*> tray_user_;
+
+ // The separator between the tray users and the rest of the menu.
+ // Note: The item will get owned by the shelf.
+ TrayUserSeparator* tray_user_separator_;
+
+ DISALLOW_COPY_AND_ASSIGN(TrayUserTest);
+};
+
+#if defined(OS_CHROMEOS)
+// The tray user test which tests functionality where multiple tray items are
+// visible in the system tray.
+class MultiTrayUserTest : public TrayUserTest {
+ public:
+ MultiTrayUserTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ CommandLine* command_line = CommandLine::ForCurrentProcess();
+ command_line->AppendSwitch(ash::switches::kAshEnableMultiUserTray);
+ TrayUserTest::SetUp();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MultiTrayUserTest);
+};
+#endif
+
+TrayUserTest::TrayUserTest()
+ : shelf_(NULL),
+ tray_(NULL),
+ delegate_(NULL),
+ tray_user_separator_(NULL) {
+}
+
+void TrayUserTest::SetUp() {
+ ash::test::AshTestBase::SetUp();
+ shelf_ = Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
+ tray_ = Shell::GetPrimaryRootWindowController()->GetSystemTray();
+ delegate_ = static_cast<ash::test::TestSessionStateDelegate*>(
+ ash::Shell::GetInstance()->session_state_delegate());
+}
+
+void TrayUserTest::InitializeParameters(int users_logged_in,
+ bool multiprofile) {
+ // Show the shelf.
+ shelf()->LayoutShelf();
+ shelf()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
+
+ // Set our default assumptions. Note that it is sufficient to set these
+ // after everything was created.
+ delegate_->set_logged_in_users(users_logged_in);
+ ash::test::TestShellDelegate* shell_delegate =
+ static_cast<ash::test::TestShellDelegate*>(
+ ash::Shell::GetInstance()->delegate());
+ shell_delegate->set_multi_profiles_enabled(multiprofile);
+
+ // Instead of using the existing tray panels we create new ones which makes
+ // the access easier.
+ for (int i = 0; i < delegate_->GetMaximumNumberOfLoggedInUsers(); i++) {
+ tray_user_.push_back(new ash::internal::TrayUser(tray_, i));
+ tray_->AddTrayItem(tray_user_[i]);
+ }
+ // We then add also the separator.
+ tray_user_separator_ = new ash::internal::TrayUserSeparator(tray_);
+ tray_->AddTrayItem(tray_user_separator_);
+}
+
+void TrayUserTest::ShowTrayMenu(aura::test::EventGenerator* generator) {
+ gfx::Point center = tray()->GetBoundsInScreen().CenterPoint();
+
+ generator->MoveMouseTo(center.x(), center.y());
+ EXPECT_FALSE(tray()->IsAnyBubbleVisible());
+ generator->ClickLeftButton();
+}
+
+void TrayUserTest::MoveOverUserItem(aura::test::EventGenerator* generator,
+ int index) {
+ gfx::Point center =
+ tray_user(index)->GetUserPanelBoundsInScreenForTest().CenterPoint();
+
+ generator->MoveMouseTo(center.x(), center.y());
+}
+
+void TrayUserTest::ClickUserItem(aura::test::EventGenerator* generator,
+ int index) {
+ MoveOverUserItem(generator, index);
+ generator->ClickLeftButton();
+}
+
+// Make sure that in single user mode the user panel cannot be activated and no
+// separators are being created.
+TEST_F(TrayUserTest, SingleUserModeDoesNotAllowAddingUser) {
+ InitializeParameters(1, false);
+
+ // Move the mouse over the status area and click to open the status menu.
+ aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+
+ EXPECT_FALSE(tray()->IsAnyBubbleVisible());
+
+ for (int i = 0; i < delegate()->GetMaximumNumberOfLoggedInUsers(); i++)
+ EXPECT_EQ(ash::internal::TrayUser::HIDDEN,
+ tray_user(i)->GetStateForTest());
+ EXPECT_FALSE(tray_user_separator()->separator_shown());
+
+ ShowTrayMenu(&generator);
+
+ EXPECT_TRUE(tray()->HasSystemBubble());
+ EXPECT_TRUE(tray()->IsAnyBubbleVisible());
+
+ for (int i = 0; i < delegate()->GetMaximumNumberOfLoggedInUsers(); i++)
+ EXPECT_EQ(i == 0 ? ash::internal::TrayUser::SHOWN :
+ ash::internal::TrayUser::HIDDEN,
+ tray_user(i)->GetStateForTest());
+ EXPECT_FALSE(tray_user_separator()->separator_shown());
+ tray()->CloseSystemBubble();
+}
+
+#if defined(OS_CHROMEOS)
+// Make sure that in multi user mode the user panel can be activated and there
+// will be one panel for each user plus one additional separator at the end.
+// Note: the mouse watcher (for automatic closing upon leave) cannot be tested
+// here since it does not work with the event system in unit tests.
+TEST_F(TrayUserTest, MutiUserModeDoesNotAllowToAddUser) {
+ InitializeParameters(1, true);
+
+ // Move the mouse over the status area and click to open the status menu.
+ aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+ generator.set_async(false);
+
+ int max_users = delegate()->GetMaximumNumberOfLoggedInUsers();
+ // Checking now for each amount of users that the correct is done.
+ for (int j = 1; j < max_users; j++) {
+ // Set the number of logged in users.
+ delegate()->set_logged_in_users(j);
+
+ // Verify that nothing is shown.
+ EXPECT_FALSE(tray()->IsAnyBubbleVisible());
+ for (int i = 0; i < max_users; i++)
+ EXPECT_FALSE(tray_user(i)->GetStateForTest());
+ EXPECT_FALSE(tray_user_separator()->separator_shown());
+ // After clicking on the tray the menu should get shown and for each logged
+ // in user we should get a visible item. In addition, the separator should
+ // show up when we reach more then one user.
+ ShowTrayMenu(&generator);
+
+ EXPECT_TRUE(tray()->HasSystemBubble());
+ EXPECT_TRUE(tray()->IsAnyBubbleVisible());
+ for (int i = 0; i < max_users; i++) {
+ EXPECT_EQ(i < j ? ash::internal::TrayUser::SHOWN :
+ ash::internal::TrayUser::HIDDEN,
+ tray_user(i)->GetStateForTest());
+ }
+
+ // Check the visibility of the separator.
+ EXPECT_EQ(j > 1 ? true : false, tray_user_separator()->separator_shown());
+
+ // Move the mouse over the user item and it should hover.
+ MoveOverUserItem(&generator, 0);
+ EXPECT_EQ(ash::internal::TrayUser::HOVERED,
+ tray_user(0)->GetStateForTest());
+ for (int i = 1; i < max_users; i++) {
+ EXPECT_EQ(i < j ? ash::internal::TrayUser::SHOWN :
+ ash::internal::TrayUser::HIDDEN,
+ tray_user(i)->GetStateForTest());
+ }
+
+ // Check that clicking the button allows to add item if we have still room
+ // for one more user.
+ ClickUserItem(&generator, 0);
+ EXPECT_EQ(j == max_users ?
+ ash::internal::TrayUser::ACTIVE_BUT_DISABLED :
+ ash::internal::TrayUser::ACTIVE,
+ tray_user(0)->GetStateForTest());
+
+ // Click the button again to see that the menu goes away.
+ ClickUserItem(&generator, 0);
+ EXPECT_EQ(ash::internal::TrayUser::HOVERED,
+ tray_user(0)->GetStateForTest());
+
+ // Close and check that everything is deleted.
+ tray()->CloseSystemBubble();
+ EXPECT_FALSE(tray()->IsAnyBubbleVisible());
+ for (int i = 0; i < delegate()->GetMaximumNumberOfLoggedInUsers(); i++)
+ EXPECT_EQ(ash::internal::TrayUser::HIDDEN,
+ tray_user(i)->GetStateForTest());
+ }
+}
+
+// Make sure that user changing gets properly executed.
+TEST_F(TrayUserTest, MutiUserModeButtonClicks) {
+ // Have two users.
+ InitializeParameters(2, true);
+ aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+ ShowTrayMenu(&generator);
+
+ // Switch to a new user - which has a capitalized name.
+ ClickUserItem(&generator, 1);
+ EXPECT_EQ(delegate()->get_activated_user(), delegate()->GetUserID(1));
+ // Since the name is capitalized, the email should be different then the
+ // user_id.
+ EXPECT_NE(delegate()->get_activated_user(), delegate()->GetUserEmail(1));
+ tray()->CloseSystemBubble();
+}
+
+// Make sure that we show items for all users in the tray accordingly.
+TEST_F(MultiTrayUserTest, CheckTrayUserItems) {
+ InitializeParameters(1, true);
+
+ int max_users = delegate()->GetMaximumNumberOfLoggedInUsers();
+ // Checking now for each amount of users that the proper items are visible in
+ // the tray. The proper item is hereby:
+ // 2 -> User #1
+ // 1 -> User #2
+ // 0 -> User #3
+ // Note: Tray items are required to populate system tray items as well as the
+ // system tray menu. The system tray menu changes it's appearance with the
+ // addition of more users, but the system tray does not create new items after
+ // it got created.
+ for (int present_users = 1; present_users <= max_users; ++present_users) {
+ // We simulate the user addition by telling the delegate the new number of
+ // users, then change all user tray items and finally tell the tray to
+ // re-layout itself.
+ delegate()->set_logged_in_users(present_users);
+ Shell::GetInstance()->system_tray_notifier()->NotifyUserAddedToSession();
+ tray()->Layout();
+
+ // Check that the tray items are being shown in the reverse order.
+ for (int i = 0; i < max_users; i++) {
+ gfx::Rect rect =
+ tray()->GetTrayItemViewForTest(tray_user(i))->GetBoundsInScreen();
+ if (max_users - 1 - i < present_users)
+ EXPECT_FALSE(rect.IsEmpty());
+ else
+ EXPECT_TRUE(rect.IsEmpty());
+ }
+ }
+
+ // Click on the last item to see that the user changes.
+ aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+ generator.set_async(false);
+
+ // Switch to a new user - again, note that we have to click on the reverse
+ // item in the list. Since the first clickable item is 1, we get user #2.
+ gfx::Point point =
+ tray()->GetTrayItemViewForTest(tray_user(1))->
+ GetBoundsInScreen().CenterPoint();
+
+ generator.MoveMouseTo(point.x(), point.y());
+ generator.ClickLeftButton();
+ EXPECT_EQ(delegate()->get_activated_user(), delegate()->GetUserID(1));
+}
+
+#endif
+
+} // namespace internal
+} // namespace ash