Home | History | Annotate | Download | only in login
      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