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/memory/scoped_ptr.h" 9 #include "base/prefs/pref_service.h" 10 #include "base/prefs/testing_pref_service.h" 11 #include "base/run_loop.h" 12 #include "base/values.h" 13 #include "chrome/browser/browser_process.h" 14 #include "chrome/browser/chromeos/cros/network_library.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/cros_settings_names.h" 20 #include "chrome/browser/chromeos/settings/cros_settings_provider.h" 21 #include "chrome/browser/chromeos/settings/device_settings_service.h" 22 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" 23 #include "chrome/test/base/testing_browser_process.h" 24 #include "content/public/test/test_browser_thread_bundle.h" 25 #include "testing/gtest/include/gtest/gtest.h" 26 27 namespace chromeos { 28 29 class UserManagerTest : public testing::Test { 30 protected: 31 virtual void SetUp() OVERRIDE { 32 cros_settings_ = CrosSettings::Get(); 33 34 // Replace the real DeviceSettingsProvider with a stub. 35 device_settings_provider_ = 36 cros_settings_->GetProvider(chromeos::kReportDeviceVersionInfo); 37 EXPECT_TRUE(device_settings_provider_); 38 EXPECT_TRUE( 39 cros_settings_->RemoveSettingsProvider(device_settings_provider_)); 40 cros_settings_->AddSettingsProvider(&stub_settings_provider_); 41 42 // Populate the stub DeviceSettingsProvider with valid values. 43 SetDeviceSettings(false, "", false); 44 45 // Register an in-memory local settings instance. 46 local_state_.reset(new TestingPrefServiceSimple); 47 TestingBrowserProcess::GetGlobal()->SetLocalState(local_state_.get()); 48 UserManager::RegisterPrefs(local_state_->registry()); 49 // Wallpaper manager and user image managers prefs will be accessed by the 50 // unit-test as well. 51 UserImageManager::RegisterPrefs(local_state_->registry()); 52 WallpaperManager::RegisterPrefs(local_state_->registry()); 53 54 ResetUserManager(); 55 } 56 57 virtual void TearDown() OVERRIDE { 58 // Unregister the in-memory local settings instance. 59 TestingBrowserProcess::GetGlobal()->SetLocalState(0); 60 61 // Restore the real DeviceSettingsProvider. 62 EXPECT_TRUE( 63 cros_settings_->RemoveSettingsProvider(&stub_settings_provider_)); 64 cros_settings_->AddSettingsProvider(device_settings_provider_); 65 66 // Shut down the DeviceSettingsService. 67 DeviceSettingsService::Get()->UnsetSessionManager(); 68 69 base::RunLoop().RunUntilIdle(); 70 } 71 72 UserManagerImpl* GetUserManagerImpl() const { 73 return static_cast<UserManagerImpl*>(UserManager::Get()); 74 } 75 76 bool GetUserManagerEphemeralUsersEnabled() const { 77 return GetUserManagerImpl()->ephemeral_users_enabled_; 78 } 79 80 bool GetUserManagerLocallyManagedUsersEnabledByPolicy() const { 81 return GetUserManagerImpl()->locally_managed_users_enabled_by_policy_; 82 } 83 84 void SetUserManagerEphemeralUsersEnabled(bool ephemeral_users_enabled) { 85 GetUserManagerImpl()->ephemeral_users_enabled_ = ephemeral_users_enabled; 86 } 87 88 const std::string& GetUserManagerOwnerEmail() const { 89 return GetUserManagerImpl()-> owner_email_; 90 } 91 92 void SetUserManagerOwnerEmail(const std::string& owner_email) { 93 GetUserManagerImpl()->owner_email_ = owner_email; 94 } 95 96 void ResetUserManager() { 97 // Reset the UserManager singleton. 98 user_manager_enabler_.reset(); 99 // Initialize the UserManager singleton to a fresh UserManagerImpl instance. 100 user_manager_enabler_.reset( 101 new ScopedUserManagerEnabler(new UserManagerImpl)); 102 } 103 104 void SetDeviceSettings(bool ephemeral_users_enabled, 105 const std::string &owner, 106 bool locally_managed_users_enabled) { 107 base::FundamentalValue 108 ephemeral_users_enabled_value(ephemeral_users_enabled); 109 stub_settings_provider_.Set(kAccountsPrefEphemeralUsersEnabled, 110 ephemeral_users_enabled_value); 111 base::StringValue owner_value(owner); 112 stub_settings_provider_.Set(kDeviceOwner, owner_value); 113 stub_settings_provider_.Set(kAccountsPrefSupervisedUsersEnabled, 114 base::FundamentalValue(locally_managed_users_enabled)); 115 } 116 117 void RetrieveTrustedDevicePolicies() { 118 GetUserManagerImpl()->RetrieveTrustedDevicePolicies(); 119 } 120 121 protected: 122 content::TestBrowserThreadBundle thread_bundle_; 123 124 CrosSettings* cros_settings_; 125 CrosSettingsProvider* device_settings_provider_; 126 StubCrosSettingsProvider stub_settings_provider_; 127 scoped_ptr<TestingPrefServiceSimple> local_state_; 128 129 ScopedTestDeviceSettingsService test_device_settings_service_; 130 ScopedStubNetworkLibraryEnabler stub_network_library_enabler_; 131 ScopedTestCrosSettings test_cros_settings_; 132 133 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; 134 }; 135 136 TEST_F(UserManagerTest, RetrieveTrustedDevicePolicies) { 137 SetUserManagerEphemeralUsersEnabled(true); 138 SetUserManagerOwnerEmail(""); 139 140 SetDeviceSettings(false, "owner (at) invalid.domain", false); 141 RetrieveTrustedDevicePolicies(); 142 143 EXPECT_FALSE(GetUserManagerEphemeralUsersEnabled()); 144 EXPECT_EQ(GetUserManagerOwnerEmail(), "owner (at) invalid.domain"); 145 } 146 147 TEST_F(UserManagerTest, RemoveAllExceptOwnerFromList) { 148 UserManager::Get()->UserLoggedIn( 149 "owner (at) invalid.domain", "owner (at) invalid.domain", false); 150 ResetUserManager(); 151 UserManager::Get()->UserLoggedIn( 152 "user0 (at) invalid.domain", "owner (at) invalid.domain", false); 153 ResetUserManager(); 154 UserManager::Get()->UserLoggedIn( 155 "user1 (at) invalid.domain", "owner (at) invalid.domain", false); 156 ResetUserManager(); 157 158 const UserList* users = &UserManager::Get()->GetUsers(); 159 ASSERT_EQ(3U, users->size()); 160 EXPECT_EQ((*users)[0]->email(), "user1 (at) invalid.domain"); 161 EXPECT_EQ((*users)[1]->email(), "user0 (at) invalid.domain"); 162 EXPECT_EQ((*users)[2]->email(), "owner (at) invalid.domain"); 163 164 SetDeviceSettings(true, "owner (at) invalid.domain", false); 165 RetrieveTrustedDevicePolicies(); 166 167 users = &UserManager::Get()->GetUsers(); 168 EXPECT_EQ(1U, users->size()); 169 EXPECT_EQ((*users)[0]->email(), "owner (at) invalid.domain"); 170 } 171 172 TEST_F(UserManagerTest, RegularUserLoggedInAsEphemeral) { 173 SetDeviceSettings(true, "owner (at) invalid.domain", false); 174 RetrieveTrustedDevicePolicies(); 175 176 UserManager::Get()->UserLoggedIn( 177 "owner (at) invalid.domain", "user0 (at) invalid.domain", false); 178 ResetUserManager(); 179 UserManager::Get()->UserLoggedIn( 180 "user0 (at) invalid.domain", "user0 (at) invalid.domain", false); 181 ResetUserManager(); 182 183 const UserList* users = &UserManager::Get()->GetUsers(); 184 EXPECT_EQ(1U, users->size()); 185 EXPECT_EQ((*users)[0]->email(), "owner (at) invalid.domain"); 186 } 187 188 TEST_F(UserManagerTest, DisablingLMUByDeviceSettings) { 189 SetDeviceSettings(false, "owner (at) invalid.domain", false); 190 RetrieveTrustedDevicePolicies(); 191 EXPECT_EQ(GetUserManagerLocallyManagedUsersEnabledByPolicy(), false); 192 SetDeviceSettings(false, "owner (at) invalid.domain", true); 193 RetrieveTrustedDevicePolicies(); 194 EXPECT_EQ(GetUserManagerLocallyManagedUsersEnabledByPolicy(), true); 195 } 196 197 } // namespace chromeos 198