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