Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / user_adding_screen_browsertest.cc
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/session/session_state_delegate.h"
6 #include "ash/shell.h"
7 #include "base/prefs/pref_service.h"
8 #include "chrome/browser/chromeos/login/login_display_host_impl.h"
9 #include "chrome/browser/chromeos/login/login_manager_test.h"
10 #include "chrome/browser/chromeos/login/multi_profile_user_controller.h"
11 #include "chrome/browser/chromeos/login/startup_utils.h"
12 #include "chrome/browser/chromeos/login/user_adding_screen.h"
13 #include "chrome/browser/chromeos/login/user_manager.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/pref_names.h"
16 #include "chrome/test/base/in_process_browser_test.h"
17 #include "content/public/test/test_utils.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 using namespace testing;
21
22 namespace {
23
24 const char* kTestUsers[] = {"test-user1@gmail.com",
25                             "test-user2@gmail.com",
26                             "test-user3@gmail.com"};
27
28 }  // anonymous namespace
29
30 namespace chromeos {
31
32 class UserAddingScreenTest : public LoginManagerTest,
33                              public UserAddingScreen::Observer {
34  public:
35   UserAddingScreenTest() : LoginManagerTest(false),
36                            user_adding_started_(0),
37                            user_adding_finished_(0) {
38   }
39
40   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
41     LoginManagerTest::SetUpCommandLine(command_line);
42     command_line->AppendSwitch(::switches::kMultiProfiles);
43   }
44
45   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
46     LoginManagerTest::SetUpInProcessBrowserTestFixture();
47     UserAddingScreen::Get()->AddObserver(this);
48   }
49
50   virtual void OnUserAddingFinished() OVERRIDE { ++user_adding_finished_; }
51
52   virtual void OnUserAddingStarted() OVERRIDE { ++user_adding_started_; }
53
54   void SetUserCanLock(User* user, bool can_lock) {
55     user->set_can_lock(can_lock);
56   }
57
58   int user_adding_started() { return user_adding_started_; }
59
60   int user_adding_finished() { return user_adding_finished_; }
61
62  private:
63   int user_adding_started_;
64   int user_adding_finished_;
65
66   DISALLOW_COPY_AND_ASSIGN(UserAddingScreenTest);
67 };
68
69 IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, PRE_CancelAdding) {
70   RegisterUser(kTestUsers[0]);
71   RegisterUser(kTestUsers[1]);
72   RegisterUser(kTestUsers[2]);
73   StartupUtils::MarkOobeCompleted();
74 }
75
76 IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, CancelAdding) {
77   EXPECT_CALL(login_utils(), DoBrowserLaunch(_, _)).Times(1);
78   EXPECT_EQ(3u, UserManager::Get()->GetUsers().size());
79   EXPECT_EQ(0u, UserManager::Get()->GetLoggedInUsers().size());
80
81   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY,
82             ash::Shell::GetInstance()->session_state_delegate()->
83                 GetSessionState());
84
85   LoginUser(kTestUsers[0]);
86   EXPECT_EQ(1u, UserManager::Get()->GetLoggedInUsers().size());
87   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE,
88             ash::Shell::GetInstance()->session_state_delegate()->
89                 GetSessionState());
90
91   UserAddingScreen::Get()->Start();
92   content::RunAllPendingInMessageLoop();
93   EXPECT_EQ(1, user_adding_started());
94   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY,
95             ash::Shell::GetInstance()->session_state_delegate()->
96                 GetSessionState());
97
98   UserAddingScreen::Get()->Cancel();
99   content::RunAllPendingInMessageLoop();
100   EXPECT_EQ(1, user_adding_finished());
101   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE,
102             ash::Shell::GetInstance()->session_state_delegate()->
103                 GetSessionState());
104
105   EXPECT_TRUE(LoginDisplayHostImpl::default_host() == NULL);
106   EXPECT_EQ(1u, UserManager::Get()->GetLoggedInUsers().size());
107   EXPECT_EQ(kTestUsers[0], UserManager::Get()->GetActiveUser()->email());
108 }
109
110 IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, PRE_AddingSeveralUsers) {
111   RegisterUser(kTestUsers[0]);
112   RegisterUser(kTestUsers[1]);
113   RegisterUser(kTestUsers[2]);
114   StartupUtils::MarkOobeCompleted();
115 }
116
117 IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, AddingSeveralUsers) {
118   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY,
119             ash::Shell::GetInstance()->session_state_delegate()->
120                 GetSessionState());
121   EXPECT_CALL(login_utils(), DoBrowserLaunch(_, _)).Times(3);
122   LoginUser(kTestUsers[0]);
123   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE,
124             ash::Shell::GetInstance()->session_state_delegate()->
125                 GetSessionState());
126
127   UserManager* user_manager = UserManager::Get();
128
129   for (int i = 1; i < 3; ++i) {
130     UserAddingScreen::Get()->Start();
131     content::RunAllPendingInMessageLoop();
132     EXPECT_EQ(i, user_adding_started());
133     EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY,
134               ash::Shell::GetInstance()->session_state_delegate()->
135                   GetSessionState());
136     AddUser(kTestUsers[i]);
137     EXPECT_EQ(i, user_adding_finished());
138     EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE,
139               ash::Shell::GetInstance()->session_state_delegate()->
140                   GetSessionState());
141     EXPECT_TRUE(LoginDisplayHostImpl::default_host() == NULL);
142     ASSERT_EQ(unsigned(i + 1), user_manager->GetLoggedInUsers().size());
143   }
144
145   EXPECT_EQ(ash::SessionStateDelegate::SESSION_STATE_ACTIVE,
146             ash::Shell::GetInstance()->session_state_delegate()->
147                 GetSessionState());
148
149   // Now check how unlock policy works for these users.
150   PrefService* prefs1 = user_manager->
151       GetProfileByUser(user_manager->GetLoggedInUsers()[0])->GetPrefs();
152   PrefService* prefs2 = user_manager->
153       GetProfileByUser(user_manager->GetLoggedInUsers()[1])->GetPrefs();
154   PrefService* prefs3 = user_manager->
155       GetProfileByUser(user_manager->GetLoggedInUsers()[2])->GetPrefs();
156   ASSERT_TRUE(prefs1 != NULL);
157   ASSERT_TRUE(prefs2 != NULL);
158   ASSERT_TRUE(prefs3 != NULL);
159   prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false);
160   prefs2->SetBoolean(prefs::kEnableAutoScreenLock, false);
161   prefs3->SetBoolean(prefs::kEnableAutoScreenLock, false);
162
163   // One of the users has the primary-only policy.
164   // List of unlock users doesn't depend on kEnableLockScreen preference.
165   prefs1->SetBoolean(prefs::kEnableAutoScreenLock, true);
166   prefs1->SetString(prefs::kMultiProfileUserBehavior,
167                     MultiProfileUserController::kBehaviorPrimaryOnly);
168   prefs2->SetString(prefs::kMultiProfileUserBehavior,
169                     MultiProfileUserController::kBehaviorUnrestricted);
170   prefs3->SetString(prefs::kMultiProfileUserBehavior,
171                     MultiProfileUserController::kBehaviorUnrestricted);
172   chromeos::UserList unlock_users = user_manager->GetUnlockUsers();
173   ASSERT_EQ(1UL, unlock_users.size());
174   EXPECT_EQ(kTestUsers[0], unlock_users[0]->email());
175
176   prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false);
177   unlock_users = user_manager->GetUnlockUsers();
178   ASSERT_EQ(1UL, unlock_users.size());
179   EXPECT_EQ(kTestUsers[0], unlock_users[0]->email());
180
181   // If all users have unrestricted policy then anyone can perform unlock.
182   prefs1->SetString(prefs::kMultiProfileUserBehavior,
183                     MultiProfileUserController::kBehaviorUnrestricted);
184   unlock_users = user_manager->GetUnlockUsers();
185   ASSERT_EQ(3UL, unlock_users.size());
186   for (int i = 0; i < 3; ++i)
187     EXPECT_EQ(kTestUsers[i], unlock_users[i]->email());
188
189   // This preference doesn't affect list of unlock users.
190   prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true);
191   unlock_users = user_manager->GetUnlockUsers();
192   ASSERT_EQ(3UL, unlock_users.size());
193   for (int i = 0; i < 3; ++i)
194     EXPECT_EQ(kTestUsers[i], unlock_users[i]->email());
195
196   // Now one of the users is unable to unlock.
197   SetUserCanLock(user_manager->GetLoggedInUsers()[2], false);
198   unlock_users = user_manager->GetUnlockUsers();
199   ASSERT_EQ(2UL, unlock_users.size());
200   for (int i = 0; i < 2; ++i)
201     EXPECT_EQ(kTestUsers[i], unlock_users[i]->email());
202   SetUserCanLock(user_manager->GetLoggedInUsers()[2], true);
203
204   // Now one of the users has not-allowed policy.
205   // In this scenario this user is not allowed in multi-profile session but
206   // if that user happened to still be part of multi-profile session it should
207   // not be listed on screen lock.
208   prefs3->SetString(prefs::kMultiProfileUserBehavior,
209                     MultiProfileUserController::kBehaviorNotAllowed);
210   unlock_users = user_manager->GetUnlockUsers();
211   ASSERT_EQ(2UL, unlock_users.size());
212   for (int i = 0; i < 2; ++i)
213     EXPECT_EQ(kTestUsers[i], unlock_users[i]->email());
214 }
215
216 }  // namespace chromeos