Home | History | Annotate | Download | only in notifications
      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 
     15 using namespace testing;
     16 
     17 namespace {
     18 
     19 const char* kTestUsers[] = {"test-user (at) gmail.com",
     20                             "test-user1 (at) gmail.com"};
     21 
     22 }  // anonymous namespace
     23 
     24 class 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 CleanUpOnMainThread() OVERRIDE {
     39     if (blocker_)
     40       blocker_->RemoveObserver(this);
     41     blocker_.reset();
     42     chromeos::LoginManagerTest::CleanUpOnMainThread();
     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 
     76 IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest,
     77                        PRE_BaseTest) {
     78   RegisterUser(kTestUsers[0]);
     79   RegisterUser(kTestUsers[1]);
     80   chromeos::StartupUtils::MarkOobeCompleted();
     81 }
     82 
     83 IN_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 
    108 IN_PROC_BROWSER_TEST_F(LoginStateNotificationBlockerChromeOSBrowserTest,
    109                        PRE_AlwaysAllowedNotifier) {
    110   RegisterUser(kTestUsers[0]);
    111   RegisterUser(kTestUsers[1]);
    112   chromeos::StartupUtils::MarkOobeCompleted();
    113 }
    114 
    115 IN_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