1// Copyright 2013 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 5#include "ash/shell.h" 6#include "ash/system/system_notifier.h" 7#include "base/command_line.h" 8#include "chrome/browser/chromeos/login/login_manager_test.h" 9#include "chrome/browser/chromeos/login/startup_utils.h" 10#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" 11#include "chrome/browser/notifications/login_state_notification_blocker_chromeos.h" 12#include "content/public/test/test_utils.h" 13#include "ui/message_center/message_center.h" 14 15using namespace testing; 16 17namespace { 18 19const char* kTestUsers[] = {"test-user@gmail.com", 20 "test-user1@gmail.com"}; 21 22} // anonymous namespace 23 24class LoginStateNotificationBlockerChromeOSBrowserTest 25 : public chromeos::LoginManagerTest, 26 public message_center::NotificationBlocker::Observer { 27 public: 28 LoginStateNotificationBlockerChromeOSBrowserTest() 29 : chromeos::LoginManagerTest(false), 30 state_changed_count_(0) {} 31 virtual ~LoginStateNotificationBlockerChromeOSBrowserTest() {} 32 33 virtual void SetUpOnMainThread() OVERRIDE { 34 chromeos::LoginState::Get()->set_always_logged_in(false); 35 chromeos::LoginManagerTest::SetUpOnMainThread(); 36 } 37 38 virtual void TearDownOnMainThread() OVERRIDE { 39 if (blocker_) 40 blocker_->RemoveObserver(this); 41 blocker_.reset(); 42 chromeos::LoginManagerTest::TearDownOnMainThread(); 43 } 44 45 protected: 46 void CreateBlocker() { 47 blocker_.reset(new LoginStateNotificationBlockerChromeOS( 48 message_center::MessageCenter::Get())); 49 blocker_->AddObserver(this); 50 } 51 52 // message_center::NotificationBlocker::Observer ovverrides: 53 virtual void OnBlockingStateChanged( 54 message_center::NotificationBlocker* blocker) OVERRIDE { 55 state_changed_count_++; 56 } 57 58 int GetStateChangedCountAndReset() { 59 int result = state_changed_count_; 60 state_changed_count_ = 0; 61 return result; 62 } 63 64 bool ShouldShowNotificationAsPopup( 65 const message_center::NotifierId& notifier_id) { 66 return blocker_->ShouldShowNotificationAsPopup(notifier_id); 67 } 68 69 private: 70 int state_changed_count_; 71 scoped_ptr<message_center::NotificationBlocker> blocker_; 72 73 DISALLOW_COPY_AND_ASSIGN(LoginStateNotificationBlockerChromeOSBrowserTest); 74}; 75 76IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest, 77 PRE_BaseTest) { 78 RegisterUser(kTestUsers[0]); 79 RegisterUser(kTestUsers[1]); 80 chromeos::StartupUtils::MarkOobeCompleted(); 81} 82 83IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest, 84 BaseTest) { 85 CreateBlocker(); 86 message_center::NotifierId notifier_id( 87 message_center::NotifierId::APPLICATION, "test-notifier"); 88 89 // Logged in as a normal user. 90 EXPECT_CALL(login_utils(), DoBrowserLaunch(_, _)).Times(1); 91 LoginUser(kTestUsers[0]); 92 EXPECT_EQ(1, GetStateChangedCountAndReset()); 93 EXPECT_TRUE(ShouldShowNotificationAsPopup(notifier_id)); 94 95 // Multi-login user switch. 96 chromeos::UserAddingScreen::Get()->Start(); 97 content::RunAllPendingInMessageLoop(); 98 EXPECT_EQ(1, GetStateChangedCountAndReset()); 99 EXPECT_FALSE(ShouldShowNotificationAsPopup(notifier_id)); 100 101 // Multi-login user switch off. 102 chromeos::UserAddingScreen::Get()->Cancel(); 103 content::RunAllPendingInMessageLoop(); 104 EXPECT_EQ(1, GetStateChangedCountAndReset()); 105 EXPECT_TRUE(ShouldShowNotificationAsPopup(notifier_id)); 106} 107 108IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest, 109 PRE_AlwaysAllowedNotifier) { 110 RegisterUser(kTestUsers[0]); 111 RegisterUser(kTestUsers[1]); 112 chromeos::StartupUtils::MarkOobeCompleted(); 113} 114 115IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest, 116 AlwaysAllowedNotifier) { 117 CreateBlocker(); 118 119 // NOTIFIER_DISPLAY is allowed to shown in the login screen. 120 message_center::NotifierId notifier_id( 121 message_center::NotifierId::SYSTEM_COMPONENT, 122 ash::system_notifier::kNotifierDisplay); 123 124 // Logged in as a normal user. 125 EXPECT_CALL(login_utils(), DoBrowserLaunch(_, _)).Times(1); 126 LoginUser(kTestUsers[0]); 127 EXPECT_EQ(1, GetStateChangedCountAndReset()); 128 EXPECT_TRUE(ShouldShowNotificationAsPopup(notifier_id)); 129 130 // Multi-login user switch. 131 chromeos::UserAddingScreen::Get()->Start(); 132 content::RunAllPendingInMessageLoop(); 133 EXPECT_EQ(1, GetStateChangedCountAndReset()); 134 EXPECT_TRUE(ShouldShowNotificationAsPopup(notifier_id)); 135 136 // Multi-login user switch off. 137 chromeos::UserAddingScreen::Get()->Cancel(); 138 content::RunAllPendingInMessageLoop(); 139 EXPECT_EQ(1, GetStateChangedCountAndReset()); 140 EXPECT_TRUE(ShouldShowNotificationAsPopup(notifier_id)); 141} 142