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