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