Index: chrome/browser/chromeos/preferences_unittest.cc |
diff --git a/chrome/browser/chromeos/preferences_unittest.cc b/chrome/browser/chromeos/preferences_unittest.cc |
index 8483e1ed3c1b1e504fb55ec486c9e5c148c79f7b..194b3036c8578b18c171b9066b0a46b1de4bfc94 100644 |
--- a/chrome/browser/chromeos/preferences_unittest.cc |
+++ b/chrome/browser/chromeos/preferences_unittest.cc |
@@ -4,82 +4,25 @@ |
#include "chrome/browser/chromeos/preferences.h" |
-#include "base/json/json_string_value_serializer.h" |
#include "base/prefs/pref_member.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/string_util.h" |
-#include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
-#include "chrome/browser/chromeos/login/session/user_session_manager.h" |
#include "chrome/browser/chromeos/login/users/fake_user_manager.h" |
#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" |
-#include "chrome/browser/chromeos/system/fake_input_device_settings.h" |
-#include "chrome/common/chrome_constants.h" |
+#include "chrome/browser/download/download_prefs.h" |
#include "chrome/common/pref_names.h" |
-#include "chrome/test/base/testing_browser_process.h" |
#include "chrome/test/base/testing_pref_service_syncable.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "chrome/test/base/testing_profile_manager.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
-#include "content/public/test/test_utils.h" |
-#include "sync/api/attachments/attachment_id.h" |
-#include "sync/api/fake_sync_change_processor.h" |
-#include "sync/api/sync_change.h" |
-#include "sync/api/sync_data.h" |
-#include "sync/api/sync_error_factory.h" |
-#include "sync/api/sync_error_factory_mock.h" |
-#include "sync/api/syncable_service.h" |
-#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" |
-#include "sync/protocol/preference_specifics.pb.h" |
-#include "sync/protocol/sync.pb.h" |
+#include "components/pref_registry/pref_registry_syncable.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/base/ime/chromeos/extension_ime_util.h" |
-#include "ui/base/ime/chromeos/input_method_whitelist.h" |
-#include "ui/base/ime/chromeos/mock_component_extension_ime_manager_delegate.h" |
-#include "url/gurl.h" |
namespace chromeos { |
namespace { |
-const char kIdentityIMEID[] = |
- "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME"; |
-const char kToUpperIMEID[] = |
- "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME"; |
-const char kAPIArgumentIMEID[] = |
- "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME"; |
-const char kUnknownIMEID[] = |
- "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpUnknownIME"; |
- |
-syncer::SyncData |
-CreatePrefSyncData(const std::string& name, const base::Value& value) { |
- std::string serialized; |
- JSONStringValueSerializer json(&serialized); |
- json.Serialize(value); |
- sync_pb::EntitySpecifics specifics; |
- sync_pb::PreferenceSpecifics* pref = specifics.mutable_preference(); |
- pref->set_name(name); |
- pref->set_value(serialized); |
- return syncer::SyncData::CreateRemoteData( |
- 1, |
- specifics, |
- base::Time(), |
- syncer::AttachmentIdList(), |
- syncer::AttachmentServiceProxyForTest::Create()); |
-} |
- |
-} // anonymous namespace |
- |
-namespace input_method { |
-namespace { |
- |
-class MyMockInputMethodManager : public MockInputMethodManager { |
+class MyMockInputMethodManager : public input_method::MockInputMethodManager { |
public: |
class State : public MockInputMethodManager::State { |
public: |
explicit State(MyMockInputMethodManager* manager) |
- : MockInputMethodManager::State(manager), manager_(manager) { |
- input_method_extensions_.reset(new InputMethodDescriptors); |
- } |
+ : MockInputMethodManager::State(manager), manager_(manager) {}; |
virtual void ChangeInputMethod(const std::string& input_method_id, |
bool show_message) override { |
@@ -93,27 +36,11 @@ |
manager_->current_->SetValue(input_method_id); |
} |
- virtual void |
- GetInputMethodExtensions(InputMethodDescriptors* result) override { |
- *result = *input_method_extensions_; |
- } |
- |
- virtual void AddInputMethodExtension( |
- const std::string& id, |
- const InputMethodDescriptors& descriptors, |
- InputMethodEngineInterface* instance) override { |
- InputMethodDescriptor descriptor( |
- id, std::string(), std::string(), std::vector<std::string>(), |
- std::vector<std::string>(), false, GURL(), GURL()); |
- input_method_extensions_->push_back(descriptor); |
- } |
- |
protected: |
virtual ~State() {}; |
private: |
MyMockInputMethodManager* const manager_; |
- scoped_ptr<InputMethodDescriptors> input_method_extensions_; |
}; |
MyMockInputMethodManager(StringPrefMember* previous, |
@@ -125,584 +52,49 @@ |
virtual ~MyMockInputMethodManager() {} |
- virtual scoped_ptr<InputMethodDescriptors> |
- GetSupportedInputMethods() const override { |
- return whitelist_.GetSupportedInputMethods().Pass(); |
- } |
- |
std::string last_input_method_id_; |
private: |
StringPrefMember* previous_; |
StringPrefMember* current_; |
- InputMethodWhitelist whitelist_; |
}; |
} // anonymous namespace |
-} // namespace input_method |
-class PreferencesTest : public testing::Test { |
- public: |
- PreferencesTest() {} |
- virtual ~PreferencesTest() {} |
+TEST(PreferencesTest, TestUpdatePrefOnBrowserScreenDetails) { |
+ chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager(); |
+ chromeos::ScopedUserManagerEnabler user_manager_enabler(user_manager); |
+ const char test_user_email[] = "test_user@example.com"; |
+ const user_manager::User* test_user = user_manager->AddUser(test_user_email); |
+ user_manager->LoginUser(test_user_email); |
- virtual void SetUp() override { |
- profile_manager_.reset( |
- new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
- ASSERT_TRUE(profile_manager_->SetUp()); |
+ TestingPrefServiceSyncable prefs; |
+ Preferences::RegisterProfilePrefs(prefs.registry()); |
+ DownloadPrefs::RegisterProfilePrefs(prefs.registry()); |
+ // kSelectFileLastDirectory is registered for Profile. Here we register it for |
+ // testing. |
+ prefs.registry()->RegisterStringPref( |
+ prefs::kSelectFileLastDirectory, |
+ std::string(), |
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
- chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager(); |
- user_manager_enabler_.reset( |
- new chromeos::ScopedUserManagerEnabler(user_manager)); |
+ StringPrefMember previous; |
+ previous.Init(prefs::kLanguagePreviousInputMethod, &prefs); |
+ previous.SetValue("KeyboardA"); |
+ StringPrefMember current; |
+ current.Init(prefs::kLanguageCurrentInputMethod, &prefs); |
+ current.SetValue("KeyboardB"); |
- const char test_user_email[] = "test_user@example.com"; |
- test_user_ = user_manager->AddUser(test_user_email); |
- user_manager->LoginUser(test_user_email); |
- user_manager->SwitchActiveUser(test_user_email); |
+ MyMockInputMethodManager mock_manager(&previous, ¤t); |
+ Preferences testee(&mock_manager); |
+ testee.InitUserPrefsForTesting( |
+ &prefs, test_user, mock_manager.GetActiveIMEState()); |
+ testee.SetInputMethodListForTesting(); |
- test_profile_ = profile_manager_->CreateTestingProfile( |
- chrome::kInitialProfile); |
- pref_service_ = test_profile_->GetTestingPrefService(); |
- |
- previous_input_method_.Init( |
- prefs::kLanguagePreviousInputMethod, pref_service_); |
- previous_input_method_.SetValue("KeyboardA"); |
- current_input_method_.Init( |
- prefs::kLanguageCurrentInputMethod, pref_service_); |
- current_input_method_.SetValue("KeyboardB"); |
- |
- mock_manager_ = new input_method::MyMockInputMethodManager( |
- &previous_input_method_, ¤t_input_method_); |
- input_method::InitializeForTesting(mock_manager_); |
- system::InputDeviceSettings::SetSettingsForTesting( |
- new system::FakeInputDeviceSettings()); |
- |
- prefs_.reset(new Preferences(mock_manager_)); |
- } |
- |
- virtual void TearDown() override { |
- input_method::Shutdown(); |
- // UserSessionManager doesn't listen to profile destruction, so make sure |
- // the default IME state isn't still cached in case test_profile_ is |
- // given the same address in the next test. |
- UserSessionManager::GetInstance()->RemoveProfileForTesting(test_profile_); |
- } |
- |
- void InitPreferences() { |
- prefs_->InitUserPrefsForTesting( |
- pref_service_, test_user_, mock_manager_->GetActiveIMEState()); |
- prefs_->SetInputMethodListForTesting(); |
- } |
- |
- scoped_ptr<TestingProfileManager> profile_manager_; |
- scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_; |
- scoped_ptr<Preferences> prefs_; |
- StringPrefMember previous_input_method_; |
- StringPrefMember current_input_method_; |
- |
- // Not owned. |
- const user_manager::User* test_user_; |
- TestingProfile* test_profile_; |
- TestingPrefServiceSyncable* pref_service_; |
- input_method::MyMockInputMethodManager* mock_manager_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(PreferencesTest); |
-}; |
- |
-TEST_F(PreferencesTest, TestUpdatePrefOnBrowserScreenDetails) { |
- InitPreferences(); |
- |
- // Confirm the current and previous input methods are unchanged. |
- EXPECT_EQ("KeyboardA", previous_input_method_.GetValue()); |
- EXPECT_EQ("KeyboardB", current_input_method_.GetValue()); |
- EXPECT_EQ("KeyboardB", mock_manager_->last_input_method_id_); |
-} |
- |
-class InputMethodPreferencesTest : public PreferencesTest { |
- public: |
- InputMethodPreferencesTest() {} |
- virtual ~InputMethodPreferencesTest() {} |
- |
- virtual void SetUp() override { |
- PreferencesTest::SetUp(); |
- |
- // Initialize pref members. |
- preferred_languages_.Init(prefs::kLanguagePreferredLanguages, |
- pref_service_); |
- preferred_languages_syncable_.Init( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- pref_service_); |
- preload_engines_.Init(prefs::kLanguagePreloadEngines, pref_service_); |
- preload_engines_syncable_.Init(prefs::kLanguagePreloadEnginesSyncable, |
- pref_service_); |
- enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes, |
- pref_service_); |
- enabled_extension_imes_syncable_.Init( |
- prefs::kLanguageEnabledExtensionImesSyncable, pref_service_); |
- |
- // Initialize component and 3rd-party input method extensions. |
- InitComponentExtensionIMEManager(); |
- input_method::InputMethodDescriptors descriptors; |
- mock_manager_->GetActiveIMEState()->AddInputMethodExtension( |
- kIdentityIMEID, |
- descriptors, |
- NULL); |
- mock_manager_->GetActiveIMEState()->AddInputMethodExtension( |
- kToUpperIMEID, |
- descriptors, |
- NULL); |
- mock_manager_->GetActiveIMEState()->AddInputMethodExtension( |
- kAPIArgumentIMEID, |
- descriptors, |
- NULL); |
- } |
- |
- void InitComponentExtensionIMEManager() { |
- // Set our custom IME list on the mock delegate. |
- input_method::MockComponentExtIMEManagerDelegate* mock_delegate = |
- new input_method::MockComponentExtIMEManagerDelegate(); |
- mock_delegate->set_ime_list(CreateImeList()); |
- |
- // Pass the mock delegate to a new ComponentExtensionIMEManager. |
- scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(mock_delegate); |
- scoped_ptr<ComponentExtensionIMEManager> component_extension_ime_manager( |
- new ComponentExtensionIMEManager); |
- component_extension_ime_manager->Initialize(delegate.Pass()); |
- |
- // Add the ComponentExtensionIMEManager to the mock InputMethodManager. |
- mock_manager_->SetComponentExtensionIMEManager( |
- component_extension_ime_manager.Pass()); |
- } |
- |
- std::vector<ComponentExtensionIME> CreateImeList() { |
- std::vector<ComponentExtensionIME> ime_list; |
- |
- ComponentExtensionIME ext; |
- ext.id = extension_ime_util::kMozcExtensionId; |
- ext.description = "ext_description"; |
- ext.path = base::FilePath("ext_file_path"); |
- |
- ComponentExtensionEngine ext_engine1; |
- ext_engine1.engine_id = "nacl_mozc_us"; |
- ext_engine1.display_name = "ext_engine_1_display_name"; |
- ext_engine1.language_codes.push_back("ja"); |
- ext_engine1.layouts.push_back("us"); |
- ext.engines.push_back(ext_engine1); |
- |
- ComponentExtensionEngine ext_engine2; |
- ext_engine2.engine_id = "nacl_mozc_jp"; |
- ext_engine2.display_name = "ext_engine_2_display_name"; |
- ext_engine2.language_codes.push_back("ja"); |
- ext_engine2.layouts.push_back("jp"); |
- ext.engines.push_back(ext_engine2); |
- |
- ime_list.push_back(ext); |
- return ime_list; |
- } |
- |
- // Helper function to set local language and input values. |
- void SetLocalValues(const std::string& preferred_languages, |
- const std::string& preload_engines, |
- const std::string& enabled_extension_imes) { |
- preferred_languages_.SetValue(preferred_languages); |
- preload_engines_.SetValue(preload_engines); |
- enabled_extension_imes_.SetValue(enabled_extension_imes); |
- } |
- |
- // Helper function to set global language and input values. |
- void SetGlobalValues(const std::string& preferred_languages, |
- const std::string& preload_engines, |
- const std::string& enabled_extension_imes) { |
- preferred_languages_syncable_.SetValue(preferred_languages); |
- preload_engines_syncable_.SetValue(preload_engines); |
- enabled_extension_imes_syncable_.SetValue(enabled_extension_imes); |
- } |
- |
- // Helper function to check local language and input values. |
- void ExpectLocalValues(const std::string& preferred_languages, |
- const std::string& preload_engines, |
- const std::string& enabled_extension_imes) { |
- EXPECT_EQ(preferred_languages, preferred_languages_.GetValue()); |
- EXPECT_EQ(preload_engines, preload_engines_.GetValue()); |
- EXPECT_EQ(enabled_extension_imes, enabled_extension_imes_.GetValue()); |
- } |
- |
- // Helper function to check global language and input values. |
- void ExpectGlobalValues(const std::string& preferred_languages, |
- const std::string& preload_engines, |
- const std::string& enabled_extension_imes) { |
- EXPECT_EQ(preferred_languages, preferred_languages_syncable_.GetValue()); |
- EXPECT_EQ(preload_engines, preload_engines_syncable_.GetValue()); |
- EXPECT_EQ(enabled_extension_imes, |
- enabled_extension_imes_syncable_.GetValue()); |
- } |
- |
- // Translates engine IDs in a CSV string to input method IDs. |
- std::string ToInputMethodIds(std::string value) { |
- std::vector<std::string> tokens; |
- base::SplitString(value, ',', &tokens); |
- std::transform(tokens.begin(), tokens.end(), tokens.begin(), |
- &extension_ime_util::GetInputMethodIDByEngineID); |
- return JoinString(tokens, ','); |
- } |
- |
- StringPrefMember preferred_languages_; |
- StringPrefMember preferred_languages_syncable_; |
- StringPrefMember preload_engines_; |
- StringPrefMember preload_engines_syncable_; |
- StringPrefMember enabled_extension_imes_; |
- StringPrefMember enabled_extension_imes_syncable_; |
- content::TestBrowserThreadBundle thread_bundle_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(InputMethodPreferencesTest); |
-}; |
- |
-// Tests that the server values are added to the values chosen at OOBE. |
-TEST_F(InputMethodPreferencesTest, TestOobeAndSync) { |
- // Choose options at OOBE. |
- pref_service_->SetBoolean( |
- prefs::kLanguageShouldMergeInputMethods, true); |
- SetLocalValues("es", |
- ToInputMethodIds("xkb:us:altgr-intl:eng"), |
- std::string()); |
- InitPreferences(); |
- |
- // Suppose we add an input method before syncing starts. |
- preload_engines_.SetValue( |
- ToInputMethodIds("xkb:us:altgr-intl:eng,xkb:us:intl:eng")); |
- |
- // Create some values to come from the server. |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, base::StringValue("ru,fi"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue("xkb:se::swe"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(kIdentityIMEID))); |
- |
- // Sync for the first time. |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- |
- // Note that we expect the preload_engines to have been translated to input |
- // method IDs during the merge. |
- std::string expected_languages("es,ru,fi"); |
- std::string expected_preload_engines( |
- "xkb:us:altgr-intl:eng,xkb:us:intl:eng,xkb:se::swe"); |
- std::string expected_extensions(kIdentityIMEID); |
- { |
- SCOPED_TRACE("Server values should have merged into local values."); |
- ExpectLocalValues( |
- expected_languages, |
- ToInputMethodIds(expected_preload_engines), |
- expected_extensions); |
- } |
- { |
- SCOPED_TRACE("Server values should have been updated to local values."); |
- ExpectGlobalValues( |
- expected_languages, expected_preload_engines, expected_extensions); |
- } |
- |
- // Update the global values from the server again. |
- syncer::SyncChangeList change_list; |
- change_list.push_back(syncer::SyncChange( |
- FROM_HERE, |
- syncer::SyncChange::ACTION_UPDATE, |
- CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- base::StringValue("de")))); |
- change_list.push_back(syncer::SyncChange( |
- FROM_HERE, |
- syncer::SyncChange::ACTION_UPDATE, |
- CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue(ToInputMethodIds("xkb:de::ger"))))); |
- change_list.push_back(syncer::SyncChange( |
- FROM_HERE, |
- syncer::SyncChange::ACTION_UPDATE, |
- CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(kToUpperIMEID)))); |
- sync->ProcessSyncChanges(FROM_HERE, change_list); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- |
- { |
- SCOPED_TRACE("Local preferences should have remained the same."); |
- ExpectLocalValues( |
- expected_languages, |
- ToInputMethodIds(expected_preload_engines), |
- expected_extensions); |
- } |
- // Change local preferences. |
- SetLocalValues("ja", ToInputMethodIds("xkb:jp::jpn"), "ime2"); |
- { |
- SCOPED_TRACE("Global preferences should have been updated."); |
- ExpectGlobalValues("ja", "xkb:jp::jpn", "ime2"); |
- } |
- content::RunAllBlockingPoolTasksUntilIdle(); |
-} |
- |
-// Tests that logging in after sync has completed changes nothing. |
-TEST_F(InputMethodPreferencesTest, TestLogIn) { |
- // Set up existing preference values. |
- std::string languages("es"); |
- std::string preload_engines(ToInputMethodIds("xkb:es::spa")); |
- std::string extensions(kIdentityIMEID); |
- |
- SetLocalValues(languages, preload_engines, extensions); |
- SetGlobalValues(languages, preload_engines, extensions); |
- pref_service_->SetBoolean( |
- prefs::kLanguageShouldMergeInputMethods, false); |
- InitPreferences(); |
- |
- // Create some values to come from the server. |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguages, base::StringValue("ru,fi"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEngines, |
- base::StringValue(ToInputMethodIds("xkb:ru::rus")))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImes, base::StringValue(kIdentityIMEID))); |
- |
- // Sync. |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- { |
- SCOPED_TRACE("Local preferences should have remained the same."); |
- ExpectLocalValues(languages, preload_engines, extensions); |
- } |
- // Change local preferences. |
- SetLocalValues("ja", ToInputMethodIds("xkb:jp::jpn"), kToUpperIMEID); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- { |
- SCOPED_TRACE("Global preferences should have been updated."); |
- ExpectGlobalValues("ja", "xkb:jp::jpn", kToUpperIMEID); |
- } |
-} |
- |
-// Tests that logging in with preferences from before a) XKB component |
-// extensions and b) the IME syncing logic doesn't overwrite settings. |
-TEST_F(InputMethodPreferencesTest, TestLogInLegacy) { |
- // Simulate existing local preferences from M-36. |
- SetLocalValues("es", "xkb:es::spa", kIdentityIMEID); |
- InitPreferences(); |
- |
- // Sync. Since this is an existing profile, the local values shouldn't change. |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, base::StringValue("ru,fi"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue(ToInputMethodIds("xkb:ru::rus")))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(kToUpperIMEID))); |
- |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- { |
- SCOPED_TRACE("Local preferences should have remained the same."); |
- ExpectLocalValues("es", "xkb:es::spa", kIdentityIMEID); |
- } |
- { |
- SCOPED_TRACE("Global preferences should have remained the same."); |
- ExpectGlobalValues("ru,fi", ToInputMethodIds("xkb:ru::rus"), kToUpperIMEID); |
- } |
- // Change local preferences. |
- SetLocalValues("ja", ToInputMethodIds("xkb:jp::jp"), kAPIArgumentIMEID); |
- { |
- SCOPED_TRACE("Global preferences should have been updated."); |
- ExpectGlobalValues("ja", "xkb:jp::jp", kAPIArgumentIMEID); |
- } |
-} |
- |
-// Tests some edge cases: empty strings, lots of values, duplicates. |
-TEST_F(InputMethodPreferencesTest, MergeStressTest) { |
- SetLocalValues("hr,lv,lt,es-419,he,el,da,ca,es,cs,bg", |
- ToInputMethodIds("xkb:es::spa,xkb:us::eng"), |
- std::string()); |
- pref_service_->SetBoolean( |
- prefs::kLanguageShouldMergeInputMethods, true); |
- InitPreferences(); |
- |
- // Change input methods and languages before syncing starts. |
- std::string local_extensions = |
- kToUpperIMEID + std::string(",") + |
- kAPIArgumentIMEID + std::string(",") + |
- kIdentityIMEID; |
- SetLocalValues( |
- "en,es,ja,hr,lv,lt,es-419,he,el,da,ca,es,cs,bg,ar", |
- ToInputMethodIds("xkb:es::spa,xkb:us:dvorak,xkb:ua::ukr"), |
- local_extensions); |
- |
- // Create some tricky values to come from the server. |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- base::StringValue("ar,fi,es,de,ar"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue( |
- "nacl_mozc_us,xkb:ru::rus,xkb:ru::rus,xkb:es::spa,xkb:es::spa"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(std::string()))); |
- |
- // Sync for the first time. |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- { |
- SCOPED_TRACE("Server values should have merged into local values."); |
- ExpectLocalValues( |
- "en,es,ja,hr,lv,lt,es-419,he,el,da,ca,es,cs,bg,ar,fi,de", |
- ToInputMethodIds("xkb:es::spa,xkb:us:dvorak,xkb:ua::ukr," |
- "nacl_mozc_us,xkb:ru::rus"), |
- local_extensions); |
- } |
- { |
- SCOPED_TRACE("Server values should have incorporated local values."); |
- ExpectGlobalValues( |
- "en,es,ja,hr,lv,lt,es-419,he,el,da,ca,es,cs,bg,ar,fi,de", |
- "xkb:es::spa,xkb:us:dvorak,xkb:ua::ukr,nacl_mozc_us,xkb:ru::rus", |
- local_extensions); |
- } |
-} |
- |
-// Tests non-existent IDs. |
-TEST_F(InputMethodPreferencesTest, MergeInvalidValues) { |
- SetLocalValues("es", |
- ToInputMethodIds("xkb:es::spa,xkb:us::eng"), |
- kIdentityIMEID); |
- pref_service_->SetBoolean( |
- prefs::kLanguageShouldMergeInputMethods, true); |
- InitPreferences(); |
- |
- // Create some valid and some non-existent IDs from the server. |
- std::string preload_engines( |
- "xkb:ru::rus,xkb:xy::xyz," |
- "_comp_ime_nothisisnotactuallyanextensionidxkb:es::spa," + |
- ToInputMethodIds("xkb:jp::jpn")); |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- base::StringValue("klingon,en-US"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue(preload_engines))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(kUnknownIMEID))); |
- |
- // Sync for the first time. |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- { |
- SCOPED_TRACE("Only valid server values should have been merged in."); |
- ExpectLocalValues( |
- "es,en-US", |
- ToInputMethodIds("xkb:es::spa,xkb:us::eng,xkb:ru::rus,xkb:jp::jpn"), |
- kIdentityIMEID); |
- } |
-} |
- |
-// Tests that we merge input methods even if syncing has started before |
-// initialization of Preferences. |
-TEST_F(InputMethodPreferencesTest, MergeAfterSyncing) { |
- SetLocalValues("es", |
- ToInputMethodIds("xkb:es::spa,xkb:us::eng"), |
- kIdentityIMEID); |
- pref_service_->SetBoolean( |
- prefs::kLanguageShouldMergeInputMethods, true); |
- |
- // Create some valid and some non-existent IDs from the server. |
- std::string preload_engines( |
- "xkb:ru::rus,xkb:xy::xyz," + ToInputMethodIds("xkb:jp::jpn")); |
- syncer::SyncDataList sync_data_list; |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreferredLanguagesSyncable, |
- base::StringValue("en-US"))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguagePreloadEnginesSyncable, |
- base::StringValue(preload_engines))); |
- sync_data_list.push_back(CreatePrefSyncData( |
- prefs::kLanguageEnabledExtensionImesSyncable, |
- base::StringValue(kUnknownIMEID))); |
- |
- // Sync for the first time. |
- syncer::SyncableService* sync = |
- pref_service_->GetSyncableService( |
- syncer::PREFERENCES); |
- sync->MergeDataAndStartSyncing(syncer::PREFERENCES, |
- sync_data_list, |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::FakeSyncChangeProcessor), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- InitPreferences(); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- |
- { |
- SCOPED_TRACE("Local values should have been merged on initialization."); |
- ExpectLocalValues( |
- "es,en-US", |
- ToInputMethodIds("xkb:es::spa,xkb:us::eng,xkb:ru::rus,xkb:jp::jpn"), |
- kIdentityIMEID); |
- } |
- { |
- SCOPED_TRACE( |
- "Syncable values should have added local values on initialization."); |
- ExpectGlobalValues( |
- "es,en-US", |
- "xkb:es::spa,xkb:us::eng,xkb:ru::rus,xkb:xy::xyz," + |
- ToInputMethodIds("xkb:jp::jpn"), |
- std::string(kIdentityIMEID) + "," + kUnknownIMEID); |
- } |
+ // Confirm they're unchanged. |
+ EXPECT_EQ("KeyboardA", previous.GetValue()); |
+ EXPECT_EQ("KeyboardB", current.GetValue()); |
+ EXPECT_EQ("KeyboardB", mock_manager.last_input_method_id_); |
} |
} // namespace chromeos |