logout_button_tray_unittest.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/session/logout_button_tray.h"
  5. #include "ash/constants/ash_pref_names.h"
  6. #include "ash/root_window_controller.h"
  7. #include "ash/session/session_controller_impl.h"
  8. #include "ash/session/test_session_controller_client.h"
  9. #include "ash/shell.h"
  10. #include "ash/system/session/logout_confirmation_controller.h"
  11. #include "ash/system/status_area_widget.h"
  12. #include "ash/test/ash_test_base.h"
  13. #include "ash/test/ash_test_helper.h"
  14. #include "ash/test_shell_delegate.h"
  15. #include "base/test/metrics/user_action_tester.h"
  16. #include "components/prefs/pref_service.h"
  17. #include "ui/events/base_event_utils.h"
  18. #include "ui/views/controls/button/md_text_button.h"
  19. #include "ui/views/test/button_test_api.h"
  20. namespace ash {
  21. namespace {
  22. constexpr char kUserEmail[] = "user1@test.com";
  23. class LogoutButtonTrayTest : public NoSessionAshTestBase {
  24. public:
  25. LogoutButtonTrayTest() = default;
  26. LogoutButtonTrayTest(const LogoutButtonTrayTest&) = delete;
  27. LogoutButtonTrayTest& operator=(const LogoutButtonTrayTest&) = delete;
  28. ~LogoutButtonTrayTest() override = default;
  29. // NoSessionAshTestBase:
  30. void SetUp() override {
  31. NoSessionAshTestBase::SetUp();
  32. SimulateUserLogin(kUserEmail);
  33. }
  34. PrefService* pref_service() {
  35. return Shell::Get()->session_controller()->GetUserPrefServiceForUser(
  36. AccountId::FromUserEmail(kUserEmail));
  37. }
  38. };
  39. TEST_F(LogoutButtonTrayTest, Visibility) {
  40. // Button is not visible before login.
  41. LogoutButtonTray* button = Shell::GetPrimaryRootWindowController()
  42. ->GetStatusAreaWidget()
  43. ->logout_button_tray_for_testing();
  44. ASSERT_TRUE(button);
  45. EXPECT_FALSE(button->GetVisible());
  46. // Button is not visible after simulated login.
  47. EXPECT_FALSE(button->GetVisible());
  48. // Setting the pref makes the button visible.
  49. pref_service()->SetBoolean(prefs::kShowLogoutButtonInTray, true);
  50. EXPECT_TRUE(button->GetVisible());
  51. // Locking the screen hides the button.
  52. GetSessionControllerClient()->LockScreen();
  53. EXPECT_FALSE(button->GetVisible());
  54. // Unlocking the screen shows the button.
  55. GetSessionControllerClient()->UnlockScreen();
  56. EXPECT_TRUE(button->GetVisible());
  57. // Resetting the pref hides the button.
  58. pref_service()->SetBoolean(prefs::kShowLogoutButtonInTray, false);
  59. EXPECT_FALSE(button->GetVisible());
  60. }
  61. TEST_F(LogoutButtonTrayTest, ButtonPressed) {
  62. constexpr char kUserEmail[] = "user1@test.com";
  63. constexpr char kUserAction[] = "DemoMode.ExitFromShelf";
  64. LogoutButtonTray* const tray = Shell::GetPrimaryRootWindowController()
  65. ->GetStatusAreaWidget()
  66. ->logout_button_tray_for_testing();
  67. ASSERT_TRUE(tray);
  68. views::MdTextButton* const button = tray->button_for_test();
  69. TestSessionControllerClient* const session_client =
  70. GetSessionControllerClient();
  71. base::UserActionTester user_action_tester;
  72. const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
  73. ui::EventTimeForNow(), 0, 0);
  74. PrefService* const pref_service =
  75. Shell::Get()->session_controller()->GetUserPrefServiceForUser(
  76. AccountId::FromUserEmail(kUserEmail));
  77. SimulateUserLogin(kUserEmail);
  78. EXPECT_EQ(0, session_client->request_sign_out_count());
  79. EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction));
  80. EXPECT_EQ(0, Shell::Get()
  81. ->logout_confirmation_controller()
  82. ->confirm_logout_count_for_test());
  83. // Sign out immediately when duration is zero.
  84. pref_service->SetInteger(prefs::kLogoutDialogDurationMs, 0);
  85. views::test::ButtonTestApi button_test(button);
  86. button_test.NotifyClick(event);
  87. session_client->FlushForTest();
  88. EXPECT_EQ(1, session_client->request_sign_out_count());
  89. EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction));
  90. EXPECT_EQ(0, Shell::Get()
  91. ->logout_confirmation_controller()
  92. ->confirm_logout_count_for_test());
  93. // Call |LogoutConfirmationController::ConfirmLogout| when duration is
  94. // non-zero.
  95. pref_service->SetInteger(prefs::kLogoutDialogDurationMs, 1000);
  96. button_test.NotifyClick(event);
  97. session_client->FlushForTest();
  98. EXPECT_EQ(1, session_client->request_sign_out_count());
  99. EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction));
  100. EXPECT_EQ(1, Shell::Get()
  101. ->logout_confirmation_controller()
  102. ->confirm_logout_count_for_test());
  103. // Sign out immediately and record user action when duration is zero and it is
  104. // demo session.
  105. pref_service->SetInteger(prefs::kLogoutDialogDurationMs, 0);
  106. session_client->SetIsDemoSession();
  107. button_test.NotifyClick(event);
  108. session_client->FlushForTest();
  109. EXPECT_EQ(2, session_client->request_sign_out_count());
  110. EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction));
  111. EXPECT_EQ(1, Shell::Get()
  112. ->logout_confirmation_controller()
  113. ->confirm_logout_count_for_test());
  114. }
  115. } // namespace
  116. } // namespace ash