user_manager_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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/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/users/chrome_user_manager_impl.h" 16#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 17#include "chrome/browser/chromeos/settings/cros_settings.h" 18#include "chrome/browser/chromeos/settings/device_settings_service.h" 19#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" 20#include "chrome/browser/profiles/profile_manager.h" 21#include "chrome/test/base/scoped_testing_local_state.h" 22#include "chrome/test/base/testing_browser_process.h" 23#include "chrome/test/base/testing_profile.h" 24#include "chromeos/chromeos_switches.h" 25#include "chromeos/dbus/dbus_thread_manager.h" 26#include "chromeos/settings/cros_settings_names.h" 27#include "chromeos/settings/cros_settings_provider.h" 28#include "components/user_manager/user.h" 29#include "components/user_manager/user_manager.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 34namespace chromeos { 35 36class 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 53class 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::DBusThreadManager::Initialize(); 83 84 ResetUserManager(); 85 } 86 87 virtual void TearDown() OVERRIDE { 88 // Unregister the in-memory local settings instance. 89 local_state_.reset(); 90 91 // Restore the real DeviceSettingsProvider. 92 EXPECT_TRUE( 93 cros_settings_->RemoveSettingsProvider(&stub_settings_provider_)); 94 cros_settings_->AddSettingsProvider(device_settings_provider_); 95 96 // Shut down the DeviceSettingsService. 97 DeviceSettingsService::Get()->UnsetSessionManager(); 98 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); 99 100 base::RunLoop().RunUntilIdle(); 101 chromeos::DBusThreadManager::Shutdown(); 102 } 103 104 ChromeUserManagerImpl* GetChromeUserManager() const { 105 return static_cast<ChromeUserManagerImpl*>( 106 user_manager::UserManager::Get()); 107 } 108 109 bool GetUserManagerEphemeralUsersEnabled() const { 110 return GetChromeUserManager()->GetEphemeralUsersEnabled(); 111 } 112 113 void SetUserManagerEphemeralUsersEnabled(bool ephemeral_users_enabled) { 114 GetChromeUserManager()->SetEphemeralUsersEnabled(ephemeral_users_enabled); 115 } 116 117 const std::string& GetUserManagerOwnerEmail() const { 118 return GetChromeUserManager()->GetOwnerEmail(); 119 } 120 121 void SetUserManagerOwnerEmail(const std::string& owner_email) { 122 GetChromeUserManager()->SetOwnerEmail(owner_email); 123 } 124 125 void ResetUserManager() { 126 // Reset the UserManager singleton. 127 user_manager_enabler_.reset(); 128 // Initialize the UserManager singleton to a fresh ChromeUserManagerImpl 129 // instance. 130 user_manager_enabler_.reset( 131 new ScopedUserManagerEnabler(new ChromeUserManagerImpl)); 132 133 // ChromeUserManagerImpl ctor posts a task to reload policies. 134 base::RunLoop().RunUntilIdle(); 135 } 136 137 void SetDeviceSettings(bool ephemeral_users_enabled, 138 const std::string &owner, 139 bool supervised_users_enabled) { 140 base::FundamentalValue 141 ephemeral_users_enabled_value(ephemeral_users_enabled); 142 stub_settings_provider_.Set(kAccountsPrefEphemeralUsersEnabled, 143 ephemeral_users_enabled_value); 144 base::StringValue owner_value(owner); 145 stub_settings_provider_.Set(kDeviceOwner, owner_value); 146 stub_settings_provider_.Set(kAccountsPrefSupervisedUsersEnabled, 147 base::FundamentalValue(supervised_users_enabled)); 148 } 149 150 void RetrieveTrustedDevicePolicies() { 151 GetChromeUserManager()->RetrieveTrustedDevicePolicies(); 152 } 153 154 protected: 155 content::TestBrowserThreadBundle thread_bundle_; 156 157 CrosSettings* cros_settings_; 158 CrosSettingsProvider* device_settings_provider_; 159 StubCrosSettingsProvider stub_settings_provider_; 160 scoped_ptr<ScopedTestingLocalState> local_state_; 161 162 ScopedTestDeviceSettingsService test_device_settings_service_; 163 ScopedTestCrosSettings test_cros_settings_; 164 165 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; 166 base::ScopedTempDir temp_dir_; 167}; 168 169TEST_F(UserManagerTest, RetrieveTrustedDevicePolicies) { 170 SetUserManagerEphemeralUsersEnabled(true); 171 SetUserManagerOwnerEmail(""); 172 173 SetDeviceSettings(false, "owner@invalid.domain", false); 174 RetrieveTrustedDevicePolicies(); 175 176 EXPECT_FALSE(GetUserManagerEphemeralUsersEnabled()); 177 EXPECT_EQ(GetUserManagerOwnerEmail(), "owner@invalid.domain"); 178} 179 180TEST_F(UserManagerTest, RemoveAllExceptOwnerFromList) { 181 user_manager::UserManager::Get()->UserLoggedIn( 182 "owner@invalid.domain", "owner@invalid.domain", false); 183 ResetUserManager(); 184 user_manager::UserManager::Get()->UserLoggedIn( 185 "user0@invalid.domain", "owner@invalid.domain", false); 186 ResetUserManager(); 187 user_manager::UserManager::Get()->UserLoggedIn( 188 "user1@invalid.domain", "owner@invalid.domain", false); 189 ResetUserManager(); 190 191 const user_manager::UserList* users = 192 &user_manager::UserManager::Get()->GetUsers(); 193 ASSERT_EQ(3U, users->size()); 194 EXPECT_EQ((*users)[0]->email(), "user1@invalid.domain"); 195 EXPECT_EQ((*users)[1]->email(), "user0@invalid.domain"); 196 EXPECT_EQ((*users)[2]->email(), "owner@invalid.domain"); 197 198 SetDeviceSettings(true, "owner@invalid.domain", false); 199 RetrieveTrustedDevicePolicies(); 200 201 users = &user_manager::UserManager::Get()->GetUsers(); 202 EXPECT_EQ(1U, users->size()); 203 EXPECT_EQ((*users)[0]->email(), "owner@invalid.domain"); 204} 205 206TEST_F(UserManagerTest, RegularUserLoggedInAsEphemeral) { 207 SetDeviceSettings(true, "owner@invalid.domain", false); 208 RetrieveTrustedDevicePolicies(); 209 210 user_manager::UserManager::Get()->UserLoggedIn( 211 "owner@invalid.domain", "user0@invalid.domain", false); 212 ResetUserManager(); 213 user_manager::UserManager::Get()->UserLoggedIn( 214 "user0@invalid.domain", "user0@invalid.domain", false); 215 ResetUserManager(); 216 217 const user_manager::UserList* users = 218 &user_manager::UserManager::Get()->GetUsers(); 219 EXPECT_EQ(1U, users->size()); 220 EXPECT_EQ((*users)[0]->email(), "owner@invalid.domain"); 221} 222 223} // namespace chromeos 224