Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: chrome/browser/chromeos/preferences_unittest.cc

Issue 312023002: Sync starting language and input method preferences (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/preferences.h" 5 #include "chrome/browser/chromeos/preferences.h"
6 6
7 #include "base/json/json_string_value_serializer.h"
7 #include "base/prefs/pref_member.h" 8 #include "base/prefs/pref_member.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h"
11 #include "chrome/browser/chromeos/input_method/input_method_configuration.h"
12 #include "chrome/browser/chromeos/input_method/input_method_util.h"
8 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 13 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
9 #include "chrome/browser/chromeos/login/users/fake_user_manager.h" 14 #include "chrome/browser/chromeos/login/users/fake_user_manager.h"
10 #include "chrome/browser/chromeos/login/users/user_manager.h" 15 #include "chrome/browser/chromeos/login/users/user_manager.h"
16 #include "chrome/browser/chromeos/system/fake_input_device_settings.h"
11 #include "chrome/browser/download/download_prefs.h" 17 #include "chrome/browser/download/download_prefs.h"
12 #include "chrome/common/pref_names.h" 18 #include "chrome/common/pref_names.h"
13 #include "chrome/test/base/testing_pref_service_syncable.h" 19 #include "chrome/test/base/testing_pref_service_syncable.h"
20 #include "chromeos/ime/extension_ime_util.h"
21 #include "chromeos/ime/input_method_whitelist.h"
22 #include "chromeos/ime/mock_component_extension_ime_manager_delegate.h"
14 #include "components/pref_registry/pref_registry_syncable.h" 23 #include "components/pref_registry/pref_registry_syncable.h"
24 #include "content/public/test/test_browser_thread_bundle.h"
25 #include "content/public/test/test_utils.h"
26 #include "sync/api/attachments/attachment_id.h"
27 #include "sync/api/attachments/attachment_service_proxy_for_test.h"
28 #include "sync/api/fake_sync_change_processor.h"
29 #include "sync/api/sync_change.h"
30 #include "sync/api/sync_data.h"
31 #include "sync/api/sync_error_factory.h"
32 #include "sync/api/sync_error_factory_mock.h"
33 #include "sync/api/syncable_service.h"
34 #include "sync/protocol/preference_specifics.pb.h"
35 #include "sync/protocol/sync.pb.h"
15 #include "testing/gtest/include/gtest/gtest.h" 36 #include "testing/gtest/include/gtest/gtest.h"
37 #include "url/gurl.h"
16 38
17 namespace chromeos { 39 namespace chromeos {
18 namespace { 40 namespace {
19 41
20 class MyMockInputMethodManager : public input_method::MockInputMethodManager { 42 const char kIdentityIMEID[] =
43 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME";
44 const char kToUpperIMEID[] =
45 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME";
46 const char kAPIArgumentIMEID[] =
47 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME";
48 const char kUnknownIMEID[] =
49 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpUnknownIME";
50
51 syncer::SyncData
52 CreatePrefSyncData(const std::string& name, const base::Value& value) {
53 std::string serialized;
54 JSONStringValueSerializer json(&serialized);
55 json.Serialize(value);
56 sync_pb::EntitySpecifics specifics;
57 sync_pb::PreferenceSpecifics* pref = specifics.mutable_preference();
58 pref->set_name(name);
59 pref->set_value(serialized);
60 return syncer::SyncData::CreateRemoteData(
61 1,
62 specifics,
63 base::Time(),
64 syncer::AttachmentIdList(),
65 syncer::AttachmentServiceProxyForTest::Create());
66 }
67
68 } // anonymous namespace
69
70 namespace input_method {
71 namespace {
72
73 class MyMockInputMethodManager : public MockInputMethodManager {
21 public: 74 public:
22 MyMockInputMethodManager(StringPrefMember* previous, 75 MyMockInputMethodManager(StringPrefMember* previous,
23 StringPrefMember* current) 76 StringPrefMember* current)
24 : previous_(previous), 77 : previous_(previous),
25 current_(current) { 78 current_(current) {
79 input_method_extensions_.reset(new InputMethodDescriptors);
26 } 80 }
81
27 virtual ~MyMockInputMethodManager() { 82 virtual ~MyMockInputMethodManager() {
28 } 83 }
29 84
30 virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE { 85 virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE {
31 last_input_method_id_ = input_method_id; 86 last_input_method_id_ = input_method_id;
32 // Do the same thing as BrowserStateMonitor::UpdateUserPreferences. 87 // Do the same thing as BrowserStateMonitor::UpdateUserPreferences.
33 const std::string current_input_method_on_pref = current_->GetValue(); 88 const std::string current_input_method_on_pref = current_->GetValue();
34 if (current_input_method_on_pref == input_method_id) 89 if (current_input_method_on_pref == input_method_id)
35 return; 90 return;
36 previous_->SetValue(current_input_method_on_pref); 91 previous_->SetValue(current_input_method_on_pref);
37 current_->SetValue(input_method_id); 92 current_->SetValue(input_method_id);
38 } 93 }
39 94
95 virtual scoped_ptr<InputMethodDescriptors>
96 GetSupportedInputMethods() const OVERRIDE {
97 return whitelist_.GetSupportedInputMethods().Pass();
98 }
99
100 virtual void
101 GetInputMethodExtensions(InputMethodDescriptors* result) OVERRIDE {
102 *result = *input_method_extensions_;
103 }
104
105 virtual void AddInputMethodExtension(
106 const std::string& id, InputMethodEngineInterface* instance) OVERRIDE {
107 InputMethodDescriptor descriptor(
108 id, std::string(), std::string(), std::vector<std::string>(),
109 std::vector<std::string>(), false, GURL(), GURL());
110 input_method_extensions_->push_back(descriptor);
111 }
112
40 std::string last_input_method_id_; 113 std::string last_input_method_id_;
41 114
42 private: 115 private:
43 StringPrefMember* previous_; 116 StringPrefMember* previous_;
44 StringPrefMember* current_; 117 StringPrefMember* current_;
118 scoped_ptr<InputMethodDescriptors> input_method_extensions_;
119 InputMethodWhitelist whitelist_;
45 }; 120 };
46 121
47 } // anonymous namespace 122 } // anonymous namespace
48 123 } // namespace input_method
49 TEST(PreferencesTest, TestUpdatePrefOnBrowserScreenDetails) { 124
50 chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager(); 125 class PreferencesTest : public testing::Test {
51 chromeos::ScopedUserManagerEnabler user_manager_enabler(user_manager); 126 public:
52 const char test_user_email[] = "test_user@example.com"; 127 PreferencesTest() {}
53 const User* test_user = user_manager->AddUser(test_user_email); 128 virtual ~PreferencesTest() {}
54 user_manager->LoginUser(test_user_email); 129
55 130 virtual void SetUp() OVERRIDE {
56 TestingPrefServiceSyncable prefs; 131 chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager();
57 Preferences::RegisterProfilePrefs(prefs.registry()); 132 user_manager_enabler_.reset(
58 DownloadPrefs::RegisterProfilePrefs(prefs.registry()); 133 new chromeos::ScopedUserManagerEnabler(user_manager));
59 // kSelectFileLastDirectory is registered for Profile. Here we register it for 134
60 // testing. 135 const char test_user_email[] = "test_user@example.com";
61 prefs.registry()->RegisterStringPref( 136 test_user_ = user_manager->AddUser(test_user_email);
62 prefs::kSelectFileLastDirectory, 137 user_manager->LoginUser(test_user_email);
63 std::string(), 138 user_manager->SwitchActiveUser(test_user_email);
64 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 139
65 140 pref_service_.reset(new TestingPrefServiceSyncable);
66 StringPrefMember previous; 141 Preferences::RegisterProfilePrefs(pref_service_->registry());
67 previous.Init(prefs::kLanguagePreviousInputMethod, &prefs); 142 DownloadPrefs::RegisterProfilePrefs(pref_service_->registry());
68 previous.SetValue("KeyboardA"); 143
69 StringPrefMember current; 144 // kSelectFileLastDirectory is registered for Profile. Here we register it
70 current.Init(prefs::kLanguageCurrentInputMethod, &prefs); 145 // for testing.
71 current.SetValue("KeyboardB"); 146 pref_service_->registry()->RegisterStringPref(
72 147 prefs::kSelectFileLastDirectory,
73 MyMockInputMethodManager mock_manager(&previous, &current); 148 std::string(),
74 Preferences testee(&mock_manager); 149 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
75 testee.InitUserPrefsForTesting(&prefs, test_user); 150
76 testee.SetInputMethodListForTesting(); 151 previous_input_method_.Init(
77 152 prefs::kLanguagePreviousInputMethod, pref_service_.get());
78 // Confirm they're unchanged. 153 previous_input_method_.SetValue("KeyboardA");
79 EXPECT_EQ("KeyboardA", previous.GetValue()); 154 current_input_method_.Init(
80 EXPECT_EQ("KeyboardB", current.GetValue()); 155 prefs::kLanguageCurrentInputMethod, pref_service_.get());
81 EXPECT_EQ("KeyboardB", mock_manager.last_input_method_id_); 156 current_input_method_.SetValue("KeyboardB");
157
158 mock_manager_ = new input_method::MyMockInputMethodManager(
159 &previous_input_method_, &current_input_method_);
160 input_method::InitializeForTesting(mock_manager_);
161 system::InputDeviceSettings::SetSettingsForTesting(
162 new system::FakeInputDeviceSettings());
163
164 prefs_.reset(new Preferences(mock_manager_));
165 }
166
167 virtual void TearDown() OVERRIDE {
168 input_method::Shutdown();
169 }
170
171 scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
172 const User* test_user_;
173 scoped_ptr<TestingPrefServiceSyncable> pref_service_;
174 StringPrefMember previous_input_method_;
175 StringPrefMember current_input_method_;
176 input_method::MyMockInputMethodManager* mock_manager_;
177 scoped_ptr<Preferences> prefs_;
178
179 private:
180 DISALLOW_COPY_AND_ASSIGN(PreferencesTest);
181 };
182
183 TEST_F(PreferencesTest, TestUpdatePrefOnBrowserScreenDetails) {
184 prefs_->Init(pref_service_.get(), test_user_);
185
186 // Confirm the current and previous input methods are unchanged.
187 EXPECT_EQ("KeyboardA", previous_input_method_.GetValue());
188 EXPECT_EQ("KeyboardB", current_input_method_.GetValue());
189 EXPECT_EQ("KeyboardB", mock_manager_->last_input_method_id_);
82 } 190 }
83 191
192 class InputMethodPreferencesTest : public PreferencesTest {
193 public:
194 InputMethodPreferencesTest() {}
195 virtual ~InputMethodPreferencesTest() {}
196
197 virtual void SetUp() OVERRIDE {
198 PreferencesTest::SetUp();
199
200 // Initialize pref members.
201 preferred_languages_.Init(prefs::kLanguagePreferredLanguages,
202 pref_service_.get());
203 preferred_languages_syncable_.Init(
204 prefs::kLanguagePreferredLanguagesSyncable,
205 pref_service_.get());
206 preload_engines_.Init(prefs::kLanguagePreloadEngines, pref_service_.get());
207 preload_engines_syncable_.Init(prefs::kLanguagePreloadEnginesSyncable,
208 pref_service_.get());
209 enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes,
210 pref_service_.get());
211 enabled_extension_imes_syncable_.Init(
212 prefs::kLanguageEnabledExtensionImesSyncable, pref_service_.get());
213
214 // Initialize component and 3rd-party input method extensions.
215 InitComponentExtensionIMEManager();
216 mock_manager_->AddInputMethodExtension(kIdentityIMEID, NULL);
217 mock_manager_->AddInputMethodExtension(kToUpperIMEID, NULL);
218 mock_manager_->AddInputMethodExtension(kAPIArgumentIMEID, NULL);
219 }
220
221 void InitComponentExtensionIMEManager() {
222 // Set our custom IME list on the mock delegate.
223 input_method::MockComponentExtIMEManagerDelegate* mock_delegate =
224 new input_method::MockComponentExtIMEManagerDelegate();
225 mock_delegate->set_ime_list(CreateImeList());
226
227 // Pass the mock delegate to a new ComponentExtensionIMEManager.
228 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(mock_delegate);
229 scoped_ptr<ComponentExtensionIMEManager> component_extension_ime_manager(
230 new ComponentExtensionIMEManager);
231 component_extension_ime_manager->Initialize(delegate.Pass());
232
233 // Add the ComponentExtensionIMEManager to the mock InputMethodManager.
234 mock_manager_->SetComponentExtensionIMEManager(
235 component_extension_ime_manager.Pass());
236 }
237
238 std::vector<ComponentExtensionIME> CreateImeList() {
239 std::vector<ComponentExtensionIME> ime_list;
240
241 ComponentExtensionIME ext;
242 ext.id = extension_ime_util::kMozcExtensionId;
243 ext.description = "ext_description";
244 ext.path = base::FilePath("ext_file_path");
245
246 ComponentExtensionEngine ext_engine1;
247 ext_engine1.engine_id = "nacl_mozc_us";
248 ext_engine1.display_name = "ext_engine_1_display_name";
249 ext_engine1.language_codes.push_back("ja");
250 ext_engine1.layouts.push_back("us");
251 ext.engines.push_back(ext_engine1);
252
253 ComponentExtensionEngine ext_engine2;
254 ext_engine2.engine_id = "nacl_mozc_jp";
255 ext_engine2.display_name = "ext_engine_2_display_name";
256 ext_engine2.language_codes.push_back("ja");
257 ext_engine2.layouts.push_back("jp");
258 ext.engines.push_back(ext_engine2);
259
260 ime_list.push_back(ext);
261 return ime_list;
262 }
263
264 // Helper function to set local language and input values.
265 void SetLocalValues(const std::string& preferred_languages,
266 const std::string& preload_engines,
267 const std::string& enabled_extension_imes) {
268 preferred_languages_.SetValue(preferred_languages);
269 preload_engines_.SetValue(preload_engines);
270 enabled_extension_imes_.SetValue(enabled_extension_imes);
271 }
272
273 // Helper function to set global language and input values.
274 void SetGlobalValues(const std::string& preferred_languages,
275 const std::string& preload_engines,
276 const std::string& enabled_extension_imes) {
277 preferred_languages_syncable_.SetValue(preferred_languages);
278 preload_engines_syncable_.SetValue(preload_engines);
279 enabled_extension_imes_syncable_.SetValue(enabled_extension_imes);
280 }
281
282 // Helper function to check local language and input values.
283 void ExpectLocalValues(const std::string& preferred_languages,
284 const std::string& preload_engines,
285 const std::string& enabled_extension_imes) {
286 EXPECT_EQ(preferred_languages, preferred_languages_.GetValue());
287 EXPECT_EQ(preload_engines, preload_engines_.GetValue());
288 EXPECT_EQ(enabled_extension_imes, enabled_extension_imes_.GetValue());
289 }
290
291 // Helper function to check global language and input values.
292 void ExpectGlobalValues(const std::string& preferred_languages,
293 const std::string& preload_engines,
294 const std::string& enabled_extension_imes) {
295 EXPECT_EQ(preferred_languages, preferred_languages_syncable_.GetValue());
296 EXPECT_EQ(preload_engines, preload_engines_syncable_.GetValue());
297 EXPECT_EQ(enabled_extension_imes,
298 enabled_extension_imes_syncable_.GetValue());
299 }
300
301 // Translates engine IDs in a CSV string to input method IDs.
302 std::string ToInputMethodIds(std::string value) {
303 std::vector<std::string> tokens;
304 base::SplitString(value, ',', &tokens);
305 std::transform(tokens.begin(), tokens.end(), tokens.begin(),
306 &extension_ime_util::GetInputMethodIDByEngineID);
307 return JoinString(tokens, ',');
308 }
309
310 StringPrefMember preferred_languages_;
311 StringPrefMember preferred_languages_syncable_;
312 StringPrefMember preload_engines_;
313 StringPrefMember preload_engines_syncable_;
314 StringPrefMember enabled_extension_imes_;
315 StringPrefMember enabled_extension_imes_syncable_;
316 content::TestBrowserThreadBundle thread_bundle_;
317
318 private:
319 DISALLOW_COPY_AND_ASSIGN(InputMethodPreferencesTest);
320 };
321
322 // Tests that the server values are added to the values chosen at OOBE.
323 TEST_F(InputMethodPreferencesTest, TestOobeAndSync) {
324 scoped_ptr<input_method::InputMethodDescriptors> input_methods =
325 mock_manager_->GetSupportedInputMethods();
326
327 // Choose options at OOBE.
328 SetLocalValues("es",
329 ToInputMethodIds("xkb:us:altgr-intl:eng"),
330 std::string());
331 pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, true);
332
333 // Initialize preferences.
334 prefs_->Init(pref_service_.get(), test_user_);
335
336 // Suppose we add an input method before syncing starts.
337 preload_engines_.SetValue(
338 ToInputMethodIds("xkb:us:altgr-intl:eng,xkb:us:intl:eng"));
339
340 // Create some values to come from the server.
341 syncer::SyncDataList sync_data_list;
342 sync_data_list.push_back(CreatePrefSyncData(
343 prefs::kLanguagePreferredLanguagesSyncable, base::StringValue("ru,fi")));
344 sync_data_list.push_back(CreatePrefSyncData(
345 prefs::kLanguagePreloadEnginesSyncable,
346 base::StringValue("xkb:se::swe")));
347 sync_data_list.push_back(CreatePrefSyncData(
348 prefs::kLanguageEnabledExtensionImesSyncable,
349 base::StringValue(kIdentityIMEID)));
350
351 // Sync for the first time.
352 syncer::SyncableService* sync =
353 pref_service_->GetSyncableService(syncer::PREFERENCES);
354 sync->MergeDataAndStartSyncing(syncer::PREFERENCES,
355 sync_data_list,
356 scoped_ptr<syncer::SyncChangeProcessor>(
357 new syncer::FakeSyncChangeProcessor),
358 scoped_ptr<syncer::SyncErrorFactory>(
359 new syncer::SyncErrorFactoryMock));
360 content::RunAllPendingInMessageLoop();
361
362 // Note that we expect the preload_engines to have been translated to input
363 // method IDs during the merge.
364 std::string expected_languages("es,ru,fi");
365 std::string expected_preload_engines(
366 "xkb:us:altgr-intl:eng,xkb:us:intl:eng,xkb:se::swe");
367 std::string expected_extensions(kIdentityIMEID);
368 {
369 SCOPED_TRACE("Server values should have merged into local values.");
370 ExpectLocalValues(
371 expected_languages,
372 ToInputMethodIds(expected_preload_engines),
373 expected_extensions);
374 ExpectGlobalValues(
375 expected_languages, expected_preload_engines, expected_extensions);
376 }
377
378 // Update the global values from the server again.
379 syncer::SyncChangeList change_list;
380 change_list.push_back(syncer::SyncChange(
381 FROM_HERE,
382 syncer::SyncChange::ACTION_UPDATE,
383 CreatePrefSyncData(
384 prefs::kLanguagePreferredLanguagesSyncable,
385 base::StringValue("de"))));
386 change_list.push_back(syncer::SyncChange(
387 FROM_HERE,
388 syncer::SyncChange::ACTION_UPDATE,
389 CreatePrefSyncData(
390 prefs::kLanguagePreloadEnginesSyncable,
391 base::StringValue(ToInputMethodIds("xkb:de::ger")))));
392 change_list.push_back(syncer::SyncChange(
393 FROM_HERE,
394 syncer::SyncChange::ACTION_UPDATE,
395 CreatePrefSyncData(
396 prefs::kLanguageEnabledExtensionImesSyncable,
397 base::StringValue(kToUpperIMEID))));
398 sync->ProcessSyncChanges(FROM_HERE, change_list);
399 content::RunAllPendingInMessageLoop();
400
401 {
402 SCOPED_TRACE("Local preferences should have remained the same.");
403 ExpectLocalValues(
404 expected_languages,
405 ToInputMethodIds(expected_preload_engines),
406 expected_extensions);
407 }
408 // Change local preferences.
409 SetLocalValues("ja", ToInputMethodIds("xkb:jp::jpn"), "ime2");
410 {
411 SCOPED_TRACE("Global preferences should have been updated.");
412 ExpectGlobalValues("ja", "xkb:jp::jpn", "ime2");
413 }
414 }
415
416 // Test that logging in after sync has completed changes nothing.
417 TEST_F(InputMethodPreferencesTest, TestLogIn) {
418 // Set up existing preference values.
419 std::string languages("es");
420 std::string preload_engines(ToInputMethodIds("xkb:es::spa"));
421 std::string extensions(kIdentityIMEID);
422
423 SetLocalValues(languages, preload_engines, extensions);
424 SetGlobalValues(languages, preload_engines, extensions);
425 pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, false);
426
427 // Initialize preferences.
428 prefs_->Init(pref_service_.get(), test_user_);
429
430 // Create some values to come from the server.
431 syncer::SyncDataList sync_data_list;
432 sync_data_list.push_back(CreatePrefSyncData(
433 prefs::kLanguagePreferredLanguages, base::StringValue("ru,fi")));
434 sync_data_list.push_back(CreatePrefSyncData(
435 prefs::kLanguagePreloadEngines,
436 base::StringValue(ToInputMethodIds("xkb:ru::rus"))));
437 sync_data_list.push_back(CreatePrefSyncData(
438 prefs::kLanguageEnabledExtensionImes, base::StringValue(kIdentityIMEID)));
439
440 // Sync.
441 syncer::SyncableService* sync =
442 pref_service_->GetSyncableService(syncer::PREFERENCES);
443 sync->MergeDataAndStartSyncing(syncer::PREFERENCES,
444 sync_data_list,
445 scoped_ptr<syncer::SyncChangeProcessor>(
446 new syncer::FakeSyncChangeProcessor),
447 scoped_ptr<syncer::SyncErrorFactory>(
448 new syncer::SyncErrorFactoryMock));
449 content::RunAllPendingInMessageLoop();
450 {
451 SCOPED_TRACE("Local preferences should have remained the same.");
452 ExpectLocalValues(languages, preload_engines, extensions);
453 }
454 // Change local preferences.
455 SetLocalValues("ja", ToInputMethodIds("xkb:jp::jpn"), kToUpperIMEID);
456 {
457 SCOPED_TRACE("Global preferences should have been updated.");
458 ExpectGlobalValues("ja", "xkb:jp::jpn", kToUpperIMEID);
459 }
460 }
461
462 // Tests that logging in with preferences from before a) XKB component
463 // extensions and b) this IME syncing logic doesn't overwrite settings.
464 TEST_F(InputMethodPreferencesTest, TestLogInLegacy) {
465 // Simulate existing local preferences from M-36.
466 SetLocalValues("es", "xkb:es::spa", kIdentityIMEID);
467
468 // Initialize preferences.
469 prefs_->Init(pref_service_.get(), test_user_);
470
471 // Sync. Since this is an existing profile, the local values shouldn't change.
472 syncer::SyncDataList sync_data_list;
473 sync_data_list.push_back(CreatePrefSyncData(
474 prefs::kLanguagePreferredLanguagesSyncable, base::StringValue("ru,fi")));
475 sync_data_list.push_back(CreatePrefSyncData(
476 prefs::kLanguagePreloadEnginesSyncable,
477 base::StringValue(ToInputMethodIds("xkb:ru::rus"))));
478 sync_data_list.push_back(CreatePrefSyncData(
479 prefs::kLanguageEnabledExtensionImesSyncable,
480 base::StringValue(kToUpperIMEID)));
481
482 syncer::SyncableService* sync =
483 pref_service_->GetSyncableService(syncer::PREFERENCES);
484 sync->MergeDataAndStartSyncing(syncer::PREFERENCES,
485 sync_data_list,
486 scoped_ptr<syncer::SyncChangeProcessor>(
487 new syncer::FakeSyncChangeProcessor),
488 scoped_ptr<syncer::SyncErrorFactory>(
489 new syncer::SyncErrorFactoryMock));
490 content::RunAllPendingInMessageLoop();
491 {
492 SCOPED_TRACE("Local preferences should have remained the same.");
493 ExpectLocalValues("es", "xkb:es::spa", kIdentityIMEID);
494 }
495 // Change local preferences.
496 SetLocalValues("ja", ToInputMethodIds("xkb:jp::jp"), kAPIArgumentIMEID);
497 {
498 SCOPED_TRACE("Global preferences should have been updated.");
499 ExpectGlobalValues("ja", "xkb:jp::jp", kAPIArgumentIMEID);
500 }
501 }
502
503 // Tests some edge cases: empty strings, lots of values, duplicates.
504 TEST_F(InputMethodPreferencesTest, MergeStressTest) {
505 SetLocalValues("hr,lv,lt,es-419,he,el,da,ca,es,cs,bg",
506 ToInputMethodIds("xkb:es::spa,xkb:us::eng"),
507 std::string());
508 pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, true);
509
510 // Initialize preferences.
511 prefs_->Init(pref_service_.get(), test_user_);
512
513 // Change input methods and languages before syncing starts.
514 std::string local_extensions =
515 kToUpperIMEID + std::string(",") +
516 kAPIArgumentIMEID + std::string(",") +
517 kIdentityIMEID;
518 SetLocalValues(
519 "en,es,ja,hr,lv,lt,es-419,he,el,da,ca,es,cs,bg,ar",
520 ToInputMethodIds("xkb:es::spa,xkb:us:dvorak,xkb:ua::ukr"),
521 local_extensions);
522
523 // Create some tricky values to come from the server.
524 syncer::SyncDataList sync_data_list;
525 sync_data_list.push_back(CreatePrefSyncData(
526 prefs::kLanguagePreferredLanguagesSyncable,
527 base::StringValue("ar,fi,es,de,ar")));
528 sync_data_list.push_back(CreatePrefSyncData(
529 prefs::kLanguagePreloadEnginesSyncable,
530 base::StringValue(
531 "nacl_mozc_us,xkb:ru::rus,xkb:ru::rus,xkb:es::spa,xkb:es::spa")));
532 sync_data_list.push_back(CreatePrefSyncData(
533 prefs::kLanguageEnabledExtensionImesSyncable,
534 base::StringValue(std::string())));
535
536 // Sync for the first time.
537 syncer::SyncableService* sync =
538 pref_service_->GetSyncableService(syncer::PREFERENCES);
539 sync->MergeDataAndStartSyncing(syncer::PREFERENCES,
540 sync_data_list,
541 scoped_ptr<syncer::SyncChangeProcessor>(
542 new syncer::FakeSyncChangeProcessor),
543 scoped_ptr<syncer::SyncErrorFactory>(
544 new syncer::SyncErrorFactoryMock));
545 content::RunAllPendingInMessageLoop();
546 {
547 SCOPED_TRACE("Server values should have merged with local values.");
548 ExpectLocalValues(
549 "en-US,es,ja,hr,lv,lt,es-419,he,el,da,ca,es,cs,bg,ar,fi,de",
550 ToInputMethodIds("xkb:es::spa,xkb:us:dvorak,xkb:ua::ukr,"
551 "nacl_mozc_us,xkb:ru::rus"),
552 local_extensions);
553 }
554 }
555
556 // Tests non-existent IDs.
557 TEST_F(InputMethodPreferencesTest, MergeInvalidValues) {
558 SetLocalValues("es",
559 ToInputMethodIds("xkb:es::spa,xkb:us::eng"),
560 kIdentityIMEID);
561 pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, true);
562
563 // Initialize preferences.
564 prefs_->Init(pref_service_.get(), test_user_);
565
566 // Create some valid and some non-existent IDs from the server.
567 std::string preload_engines(
568 "xkb:ru::rus,xkb:xy::xyz,"
569 "_comp_ime_nothisisnotactuallyanextensionidxkb:es::spa," +
570 ToInputMethodIds("xkb:jp::jpn"));
571 syncer::SyncDataList sync_data_list;
572 sync_data_list.push_back(CreatePrefSyncData(
573 prefs::kLanguagePreferredLanguagesSyncable,
574 base::StringValue("klingon,en")));
575 sync_data_list.push_back(CreatePrefSyncData(
576 prefs::kLanguagePreloadEnginesSyncable,
577 base::StringValue(preload_engines)));
578 sync_data_list.push_back(CreatePrefSyncData(
579 prefs::kLanguageEnabledExtensionImesSyncable,
580 base::StringValue(kUnknownIMEID)));
581
582 // Sync for the first time.
583 syncer::SyncableService* sync =
584 pref_service_->GetSyncableService(syncer::PREFERENCES);
585 sync->MergeDataAndStartSyncing(syncer::PREFERENCES,
586 sync_data_list,
587 scoped_ptr<syncer::SyncChangeProcessor>(
588 new syncer::FakeSyncChangeProcessor),
589 scoped_ptr<syncer::SyncErrorFactory>(
590 new syncer::SyncErrorFactoryMock));
591 content::RunAllPendingInMessageLoop();
592 {
593 SCOPED_TRACE("Only valid server values should have been merged in.");
594 ExpectLocalValues(
595 "es,en-US",
596 ToInputMethodIds("xkb:es::spa,xkb:us::eng,xkb:ru::rus,xkb:jp::jpn"),
597 kIdentityIMEID);
598 }
599 }
600
84 } // namespace chromeos 601 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698