preferences_browsertest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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 <sys/types.h> 6 7#include "ash/shell.h" 8#include "base/compiler_specific.h" 9#include "base/macros.h" 10#include "base/prefs/pref_service.h" 11#include "chrome/browser/browser_process.h" 12#include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" 13#include "chrome/browser/chromeos/login/login_manager_test.h" 14#include "chrome/browser/chromeos/login/startup_utils.h" 15#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" 16#include "chrome/browser/chromeos/login/users/user_manager.h" 17#include "chrome/browser/chromeos/preferences.h" 18#include "chrome/browser/chromeos/profiles/profile_helper.h" 19#include "chrome/browser/chromeos/settings/cros_settings.h" 20#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" 21#include "chrome/browser/chromeos/system/fake_input_device_settings.h" 22#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h" 23#include "chrome/common/pref_names.h" 24#include "chromeos/chromeos_switches.h" 25#include "chromeos/ime/fake_ime_keyboard.h" 26#include "components/feedback/tracing_manager.h" 27#include "content/public/test/test_utils.h" 28#include "testing/gtest/include/gtest/gtest.h" 29#include "ui/events/event_utils.h" 30 31namespace chromeos { 32 33namespace { 34 35const char* kTestUsers[] = {"test-user1@gmail.com", "test-user2@gmail.com"}; 36 37} // namespace 38 39class PreferencesTest : public LoginManagerTest { 40 public: 41 PreferencesTest() 42 : LoginManagerTest(true), 43 input_settings_(NULL), 44 keyboard_(NULL) {} 45 46 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 47 LoginManagerTest::SetUpCommandLine(command_line); 48 command_line->AppendSwitch(switches::kStubCrosSettings); 49 } 50 51 virtual void SetUpOnMainThread() OVERRIDE { 52 LoginManagerTest::SetUpOnMainThread(); 53 input_settings_ = new system::FakeInputDeviceSettings(); 54 system::InputDeviceSettings::SetSettingsForTesting(input_settings_); 55 keyboard_ = new input_method::FakeImeKeyboard(); 56 static_cast<input_method::InputMethodManagerImpl*>( 57 input_method::InputMethodManager::Get()) 58 ->SetImeKeyboardForTesting(keyboard_); 59 CrosSettings::Get()->SetString(kDeviceOwner, kTestUsers[0]); 60 } 61 62 // Sets set of preferences in given |prefs|. Value of prefernece depends of 63 // |variant| value. For opposite |variant| values all preferences receive 64 // different values. 65 void SetPrefs(PrefService* prefs, bool variant) { 66 prefs->SetBoolean(prefs::kTapToClickEnabled, variant); 67 prefs->SetBoolean(prefs::kPrimaryMouseButtonRight, !variant); 68 prefs->SetBoolean(prefs::kTapDraggingEnabled, variant); 69 prefs->SetBoolean(prefs::kEnableTouchpadThreeFingerClick, !variant); 70 prefs->SetBoolean(prefs::kNaturalScroll, variant); 71 prefs->SetInteger(prefs::kMouseSensitivity, !variant); 72 prefs->SetInteger(prefs::kTouchpadSensitivity, variant); 73 prefs->SetBoolean(prefs::kTouchHudProjectionEnabled, !variant); 74 prefs->SetBoolean(prefs::kLanguageXkbAutoRepeatEnabled, variant); 75 prefs->SetInteger(prefs::kLanguageXkbAutoRepeatDelay, variant ? 100 : 500); 76 prefs->SetInteger(prefs::kLanguageXkbAutoRepeatInterval, variant ? 1 : 4); 77 prefs->SetString(prefs::kLanguagePreloadEngines, 78 variant ? "xkb:us::eng,xkb:us:dvorak:eng" 79 : "xkb:us::eng,xkb:ru::rus"); 80 } 81 82 void CheckSettingsCorrespondToPrefs(PrefService* prefs) { 83 EXPECT_EQ(prefs->GetBoolean(prefs::kTapToClickEnabled), 84 input_settings_->current_touchpad_settings().GetTapToClick()); 85 EXPECT_EQ(prefs->GetBoolean(prefs::kPrimaryMouseButtonRight), 86 input_settings_->current_mouse_settings() 87 .GetPrimaryButtonRight()); 88 EXPECT_EQ(prefs->GetBoolean(prefs::kTapDraggingEnabled), 89 input_settings_->current_touchpad_settings().GetTapDragging()); 90 EXPECT_EQ(prefs->GetBoolean(prefs::kEnableTouchpadThreeFingerClick), 91 input_settings_->current_touchpad_settings() 92 .GetThreeFingerClick()); 93 EXPECT_EQ(prefs->GetInteger(prefs::kMouseSensitivity), 94 input_settings_->current_mouse_settings().GetSensitivity()); 95 EXPECT_EQ(prefs->GetInteger(prefs::kTouchpadSensitivity), 96 input_settings_->current_touchpad_settings().GetSensitivity()); 97 EXPECT_EQ(prefs->GetBoolean(prefs::kTouchHudProjectionEnabled), 98 ash::Shell::GetInstance()->is_touch_hud_projection_enabled()); 99 EXPECT_EQ(prefs->GetBoolean(prefs::kLanguageXkbAutoRepeatEnabled), 100 keyboard_->auto_repeat_is_enabled_); 101 input_method::AutoRepeatRate rate = keyboard_->last_auto_repeat_rate_; 102 EXPECT_EQ(prefs->GetInteger(prefs::kLanguageXkbAutoRepeatDelay), 103 (int)rate.initial_delay_in_ms); 104 EXPECT_EQ(prefs->GetInteger(prefs::kLanguageXkbAutoRepeatInterval), 105 (int)rate.repeat_interval_in_ms); 106 EXPECT_EQ( 107 prefs->GetString(prefs::kLanguageCurrentInputMethod), 108 input_method::InputMethodManager::Get()->GetCurrentInputMethod().id()); 109 } 110 111 void CheckLocalStateCorrespondsToPrefs(PrefService* prefs) { 112 PrefService* local_state = g_browser_process->local_state(); 113 EXPECT_EQ(local_state->GetBoolean(prefs::kOwnerTapToClickEnabled), 114 prefs->GetBoolean(prefs::kTapToClickEnabled)); 115 EXPECT_EQ(local_state->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight), 116 prefs->GetBoolean(prefs::kPrimaryMouseButtonRight)); 117 } 118 119 void DisableAnimations() { 120 // Disable animations for user transitions. 121 chrome::MultiUserWindowManagerChromeOS* manager = 122 static_cast<chrome::MultiUserWindowManagerChromeOS*>( 123 chrome::MultiUserWindowManager::GetInstance()); 124 manager->SetAnimationSpeedForTest( 125 chrome::MultiUserWindowManagerChromeOS::ANIMATION_SPEED_DISABLED); 126 } 127 128 private: 129 system::FakeInputDeviceSettings* input_settings_; 130 input_method::FakeImeKeyboard* keyboard_; 131 132 DISALLOW_COPY_AND_ASSIGN(PreferencesTest); 133}; 134 135IN_PROC_BROWSER_TEST_F(PreferencesTest, PRE_MultiProfiles) { 136 RegisterUser(kTestUsers[0]); 137 RegisterUser(kTestUsers[1]); 138 chromeos::StartupUtils::MarkOobeCompleted(); 139} 140 141IN_PROC_BROWSER_TEST_F(PreferencesTest, MultiProfiles) { 142 UserManager* user_manager = UserManager::Get(); 143 144 // Add first user and init its preferences. Check that corresponding 145 // settings has been changed. 146 LoginUser(kTestUsers[0]); 147 const user_manager::User* user1 = user_manager->FindUser(kTestUsers[0]); 148 PrefService* prefs1 = 149 ProfileHelper::Get()->GetProfileByUser(user1)->GetPrefs(); 150 SetPrefs(prefs1, false); 151 content::RunAllPendingInMessageLoop(); 152 CheckSettingsCorrespondToPrefs(prefs1); 153 154 // Add second user and init its prefs with different values. 155 UserAddingScreen::Get()->Start(); 156 content::RunAllPendingInMessageLoop(); 157 DisableAnimations(); 158 AddUser(kTestUsers[1]); 159 content::RunAllPendingInMessageLoop(); 160 const user_manager::User* user2 = user_manager->FindUser(kTestUsers[1]); 161 EXPECT_TRUE(user2->is_active()); 162 PrefService* prefs2 = 163 ProfileHelper::Get()->GetProfileByUser(user2)->GetPrefs(); 164 SetPrefs(prefs2, true); 165 166 // Check that settings were changed accordingly. 167 EXPECT_TRUE(user2->is_active()); 168 CheckSettingsCorrespondToPrefs(prefs2); 169 170 // Check that changing prefs of the active user doesn't affect prefs of the 171 // inactive user. 172 scoped_ptr<base::DictionaryValue> prefs_backup = 173 prefs1->GetPreferenceValues(); 174 SetPrefs(prefs2, false); 175 CheckSettingsCorrespondToPrefs(prefs2); 176 EXPECT_TRUE(prefs_backup->Equals(prefs1->GetPreferenceValues().get())); 177 SetPrefs(prefs2, true); 178 CheckSettingsCorrespondToPrefs(prefs2); 179 EXPECT_TRUE(prefs_backup->Equals(prefs1->GetPreferenceValues().get())); 180 181 // Check that changing prefs of the inactive user doesn't affect prefs of the 182 // active user. 183 prefs_backup = prefs2->GetPreferenceValues(); 184 SetPrefs(prefs1, true); 185 CheckSettingsCorrespondToPrefs(prefs2); 186 EXPECT_TRUE(prefs_backup->Equals(prefs2->GetPreferenceValues().get())); 187 SetPrefs(prefs1, false); 188 CheckSettingsCorrespondToPrefs(prefs2); 189 EXPECT_TRUE(prefs_backup->Equals(prefs2->GetPreferenceValues().get())); 190 191 // Check that changing non-owner prefs doesn't change corresponding local 192 // state prefs and vice versa. 193 EXPECT_EQ(user_manager->GetOwnerEmail(), kTestUsers[0]); 194 CheckLocalStateCorrespondsToPrefs(prefs1); 195 prefs2->SetBoolean(prefs::kTapToClickEnabled, 196 !prefs1->GetBoolean(prefs::kTapToClickEnabled)); 197 CheckLocalStateCorrespondsToPrefs(prefs1); 198 prefs1->SetBoolean(prefs::kTapToClickEnabled, 199 !prefs1->GetBoolean(prefs::kTapToClickEnabled)); 200 CheckLocalStateCorrespondsToPrefs(prefs1); 201 202 // Switch user back. 203 user_manager->SwitchActiveUser(kTestUsers[0]); 204 CheckSettingsCorrespondToPrefs(prefs1); 205 CheckLocalStateCorrespondsToPrefs(prefs1); 206} 207 208} // namespace chromeos 209