Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / users / user_manager_unittest.cc
1 // Copyright 2014 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 <cstdlib>
6 #include <cstring>
7
8 #include "base/command_line.h"
9 #include "base/files/file_util.h"
10 #include "base/files/scoped_temp_dir.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/prefs/pref_service.h"
13 #include "base/run_loop.h"
14 #include "base/values.h"
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/chromeos/login/users/chrome_user_manager_impl.h"
17 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
18 #include "chrome/browser/chromeos/settings/cros_settings.h"
19 #include "chrome/browser/chromeos/settings/device_settings_service.h"
20 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
21 #include "chrome/browser/profiles/profile_manager.h"
22 #include "chrome/test/base/scoped_testing_local_state.h"
23 #include "chrome/test/base/testing_browser_process.h"
24 #include "chrome/test/base/testing_profile.h"
25 #include "chromeos/chromeos_switches.h"
26 #include "chromeos/dbus/dbus_thread_manager.h"
27 #include "chromeos/settings/cros_settings_names.h"
28 #include "chromeos/settings/cros_settings_provider.h"
29 #include "components/user_manager/user.h"
30 #include "components/user_manager/user_manager.h"
31 #include "content/public/common/content_switches.h"
32 #include "content/public/test/test_browser_thread_bundle.h"
33 #include "testing/gtest/include/gtest/gtest.h"
34
35 namespace chromeos {
36
37 class UnittestProfileManager : public ::ProfileManagerWithoutInit {
38  public:
39   explicit UnittestProfileManager(const base::FilePath& user_data_dir)
40       : ::ProfileManagerWithoutInit(user_data_dir) {}
41
42  protected:
43   virtual Profile* CreateProfileHelper(
44       const base::FilePath& file_path) override {
45     if (!base::PathExists(file_path)) {
46       if (!base::CreateDirectory(file_path))
47         return NULL;
48     }
49     return new TestingProfile(file_path, NULL);
50   }
51 };
52
53
54 class UserManagerTest : public testing::Test {
55  protected:
56   virtual void SetUp() override {
57     CommandLine& command_line = *CommandLine::ForCurrentProcess();
58     command_line.AppendSwitch(::switches::kTestType);
59     command_line.AppendSwitch(
60         chromeos::switches::kIgnoreUserProfileMappingForTests);
61
62     cros_settings_ = CrosSettings::Get();
63
64     // Replace the real DeviceSettingsProvider with a stub.
65     device_settings_provider_ =
66         cros_settings_->GetProvider(chromeos::kReportDeviceVersionInfo);
67     EXPECT_TRUE(device_settings_provider_);
68     EXPECT_TRUE(
69         cros_settings_->RemoveSettingsProvider(device_settings_provider_));
70     cros_settings_->AddSettingsProvider(&stub_settings_provider_);
71
72     // Populate the stub DeviceSettingsProvider with valid values.
73     SetDeviceSettings(false, "", false);
74
75     // Register an in-memory local settings instance.
76     local_state_.reset(
77         new ScopedTestingLocalState(TestingBrowserProcess::GetGlobal()));
78
79     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
80     TestingBrowserProcess::GetGlobal()->SetProfileManager(
81         new UnittestProfileManager(temp_dir_.path()));
82
83     chromeos::DBusThreadManager::Initialize();
84
85     ResetUserManager();
86   }
87
88   virtual void TearDown() override {
89     // Unregister the in-memory local settings instance.
90     local_state_.reset();
91
92     // Restore the real DeviceSettingsProvider.
93     EXPECT_TRUE(
94       cros_settings_->RemoveSettingsProvider(&stub_settings_provider_));
95     cros_settings_->AddSettingsProvider(device_settings_provider_);
96
97     // Shut down the DeviceSettingsService.
98     DeviceSettingsService::Get()->UnsetSessionManager();
99     TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
100
101     base::RunLoop().RunUntilIdle();
102     chromeos::DBusThreadManager::Shutdown();
103   }
104
105   ChromeUserManagerImpl* GetChromeUserManager() const {
106     return static_cast<ChromeUserManagerImpl*>(
107         user_manager::UserManager::Get());
108   }
109
110   bool GetUserManagerEphemeralUsersEnabled() const {
111     return GetChromeUserManager()->GetEphemeralUsersEnabled();
112   }
113
114   void SetUserManagerEphemeralUsersEnabled(bool ephemeral_users_enabled) {
115     GetChromeUserManager()->SetEphemeralUsersEnabled(ephemeral_users_enabled);
116   }
117
118   const std::string& GetUserManagerOwnerEmail() const {
119     return GetChromeUserManager()->GetOwnerEmail();
120   }
121
122   void SetUserManagerOwnerEmail(const std::string& owner_email) {
123     GetChromeUserManager()->SetOwnerEmail(owner_email);
124   }
125
126   void ResetUserManager() {
127     // Reset the UserManager singleton.
128     user_manager_enabler_.reset();
129     // Initialize the UserManager singleton to a fresh ChromeUserManagerImpl
130     // instance.
131     user_manager_enabler_.reset(
132         new ScopedUserManagerEnabler(new ChromeUserManagerImpl));
133
134     // ChromeUserManagerImpl ctor posts a task to reload policies.
135     base::RunLoop().RunUntilIdle();
136   }
137
138   void SetDeviceSettings(bool ephemeral_users_enabled,
139                          const std::string &owner,
140                          bool supervised_users_enabled) {
141     base::FundamentalValue
142         ephemeral_users_enabled_value(ephemeral_users_enabled);
143     stub_settings_provider_.Set(kAccountsPrefEphemeralUsersEnabled,
144         ephemeral_users_enabled_value);
145     base::StringValue owner_value(owner);
146     stub_settings_provider_.Set(kDeviceOwner, owner_value);
147     stub_settings_provider_.Set(kAccountsPrefSupervisedUsersEnabled,
148         base::FundamentalValue(supervised_users_enabled));
149   }
150
151   void RetrieveTrustedDevicePolicies() {
152     GetChromeUserManager()->RetrieveTrustedDevicePolicies();
153   }
154
155  protected:
156   content::TestBrowserThreadBundle thread_bundle_;
157
158   CrosSettings* cros_settings_;
159   CrosSettingsProvider* device_settings_provider_;
160   StubCrosSettingsProvider stub_settings_provider_;
161   scoped_ptr<ScopedTestingLocalState> local_state_;
162
163   ScopedTestDeviceSettingsService test_device_settings_service_;
164   ScopedTestCrosSettings test_cros_settings_;
165
166   scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
167   base::ScopedTempDir temp_dir_;
168 };
169
170 TEST_F(UserManagerTest, RetrieveTrustedDevicePolicies) {
171   SetUserManagerEphemeralUsersEnabled(true);
172   SetUserManagerOwnerEmail("");
173
174   SetDeviceSettings(false, "owner@invalid.domain", false);
175   RetrieveTrustedDevicePolicies();
176
177   EXPECT_FALSE(GetUserManagerEphemeralUsersEnabled());
178   EXPECT_EQ(GetUserManagerOwnerEmail(), "owner@invalid.domain");
179 }
180
181 TEST_F(UserManagerTest, RemoveAllExceptOwnerFromList) {
182   user_manager::UserManager::Get()->UserLoggedIn(
183       "owner@invalid.domain", "owner@invalid.domain", false);
184   ResetUserManager();
185   user_manager::UserManager::Get()->UserLoggedIn(
186       "user0@invalid.domain", "owner@invalid.domain", false);
187   ResetUserManager();
188   user_manager::UserManager::Get()->UserLoggedIn(
189       "user1@invalid.domain", "owner@invalid.domain", false);
190   ResetUserManager();
191
192   const user_manager::UserList* users =
193       &user_manager::UserManager::Get()->GetUsers();
194   ASSERT_EQ(3U, users->size());
195   EXPECT_EQ((*users)[0]->email(), "user1@invalid.domain");
196   EXPECT_EQ((*users)[1]->email(), "user0@invalid.domain");
197   EXPECT_EQ((*users)[2]->email(), "owner@invalid.domain");
198
199   SetDeviceSettings(true, "owner@invalid.domain", false);
200   RetrieveTrustedDevicePolicies();
201
202   users = &user_manager::UserManager::Get()->GetUsers();
203   EXPECT_EQ(1U, users->size());
204   EXPECT_EQ((*users)[0]->email(), "owner@invalid.domain");
205 }
206
207 TEST_F(UserManagerTest, RegularUserLoggedInAsEphemeral) {
208   SetDeviceSettings(true, "owner@invalid.domain", false);
209   RetrieveTrustedDevicePolicies();
210
211   user_manager::UserManager::Get()->UserLoggedIn(
212       "owner@invalid.domain", "user0@invalid.domain", false);
213   ResetUserManager();
214   user_manager::UserManager::Get()->UserLoggedIn(
215       "user0@invalid.domain", "user0@invalid.domain", false);
216   ResetUserManager();
217
218   const user_manager::UserList* users =
219       &user_manager::UserManager::Get()->GetUsers();
220   EXPECT_EQ(1U, users->size());
221   EXPECT_EQ((*users)[0]->email(), "owner@invalid.domain");
222 }
223
224 }  // namespace chromeos