| Index: chrome/browser/chromeos/preferences_unittest.cc
|
| diff --git a/chrome/browser/chromeos/preferences_unittest.cc b/chrome/browser/chromeos/preferences_unittest.cc
|
| index c8d6f9367018408335918c38b01e0031dbefd61e..3eda2391083e9a2af79faa2eb7233e38aeeba8ba 100644
|
| --- a/chrome/browser/chromeos/preferences_unittest.cc
|
| +++ b/chrome/browser/chromeos/preferences_unittest.cc
|
| @@ -4,19 +4,49 @@
|
|
|
| #include "chrome/browser/chromeos/preferences.h"
|
|
|
| +#include "base/json/json_string_value_serializer.h"
|
| #include "base/prefs/pref_member.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/users/fake_user_manager.h"
|
| #include "chrome/browser/chromeos/login/users/user_manager.h"
|
| +#include "chrome/browser/chromeos/system/fake_input_device_settings.h"
|
| #include "chrome/browser/download/download_prefs.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/test/base/testing_pref_service_syncable.h"
|
| #include "components/pref_registry/pref_registry_syncable.h"
|
| +#include "sync/api/attachments/attachment_id.h"
|
| +#include "sync/api/attachments/attachment_service_proxy_for_test.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/protocol/preference_specifics.pb.h"
|
| +#include "sync/protocol/sync.pb.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace chromeos {
|
| namespace {
|
|
|
| +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());
|
| +}
|
| +
|
| class MyMockInputMethodManager : public input_method::MockInputMethodManager {
|
| public:
|
| MyMockInputMethodManager(StringPrefMember* previous,
|
| @@ -46,39 +76,346 @@ class MyMockInputMethodManager : public input_method::MockInputMethodManager {
|
|
|
| } // anonymous namespace
|
|
|
| -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* test_user = user_manager->AddUser(test_user_email);
|
| - user_manager->LoginUser(test_user_email);
|
| -
|
| - 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);
|
| -
|
| - StringPrefMember previous;
|
| - previous.Init(prefs::kLanguagePreviousInputMethod, &prefs);
|
| - previous.SetValue("KeyboardA");
|
| - StringPrefMember current;
|
| - current.Init(prefs::kLanguageCurrentInputMethod, &prefs);
|
| - current.SetValue("KeyboardB");
|
| -
|
| - MyMockInputMethodManager mock_manager(&previous, ¤t);
|
| - Preferences testee(&mock_manager);
|
| - testee.InitUserPrefsForTesting(&prefs, test_user);
|
| - testee.SetInputMethodListForTesting();
|
| -
|
| - // Confirm they're unchanged.
|
| - EXPECT_EQ("KeyboardA", previous.GetValue());
|
| - EXPECT_EQ("KeyboardB", current.GetValue());
|
| - EXPECT_EQ("KeyboardB", mock_manager.last_input_method_id_);
|
| +class PreferencesTest : public testing::Test {
|
| + public:
|
| + PreferencesTest() {}
|
| + virtual ~PreferencesTest() {}
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager();
|
| + user_manager_enabler_.reset(
|
| + new chromeos::ScopedUserManagerEnabler(user_manager));
|
| +
|
| + 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);
|
| +
|
| + pref_service_.reset(new TestingPrefServiceSyncable);
|
| + Preferences::RegisterProfilePrefs(pref_service_->registry());
|
| + DownloadPrefs::RegisterProfilePrefs(pref_service_->registry());
|
| +
|
| + // kSelectFileLastDirectory is registered for Profile. Here we register it
|
| + // for testing.
|
| + pref_service_->registry()->RegisterStringPref(
|
| + prefs::kSelectFileLastDirectory,
|
| + std::string(),
|
| + user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
|
| +
|
| + previous_input_method_.Init(
|
| + prefs::kLanguagePreviousInputMethod, pref_service_.get());
|
| + previous_input_method_.SetValue("KeyboardA");
|
| + current_input_method_.Init(
|
| + prefs::kLanguageCurrentInputMethod, pref_service_.get());
|
| + current_input_method_.SetValue("KeyboardB");
|
| +
|
| + mock_manager_ = new 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();
|
| + }
|
| +
|
| + scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
|
| + const User* test_user_;
|
| + scoped_ptr<TestingPrefServiceSyncable> pref_service_;
|
| + StringPrefMember previous_input_method_;
|
| + StringPrefMember current_input_method_;
|
| + MyMockInputMethodManager* mock_manager_;
|
| + scoped_ptr<Preferences> prefs_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(PreferencesTest);
|
| +};
|
| +
|
| +TEST_F(PreferencesTest, TestUpdatePrefOnBrowserScreenDetails) {
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| +
|
| + // 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();
|
| +
|
| + preferred_languages_.Init(prefs::kLanguagePreferredLanguages,
|
| + pref_service_.get());
|
| + preferred_languages_syncable_.Init(
|
| + prefs::kLanguagePreferredLanguagesSyncable,
|
| + pref_service_.get());
|
| + preload_engines_.Init(prefs::kLanguagePreloadEngines, pref_service_.get());
|
| + preload_engines_syncable_.Init(prefs::kLanguagePreloadEnginesSyncable,
|
| + pref_service_.get());
|
| + enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes,
|
| + pref_service_.get());
|
| + enabled_extension_imes_syncable_.Init(
|
| + prefs::kLanguageEnabledExtensionImesSyncable, pref_service_.get());
|
| + }
|
| +
|
| + // 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());
|
| + }
|
| +
|
| + StringPrefMember preferred_languages_;
|
| + StringPrefMember preferred_languages_syncable_;
|
| + StringPrefMember preload_engines_;
|
| + StringPrefMember preload_engines_syncable_;
|
| + StringPrefMember enabled_extension_imes_;
|
| + StringPrefMember enabled_extension_imes_syncable_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(InputMethodPreferencesTest);
|
| +};
|
| +
|
| +TEST_F(InputMethodPreferencesTest, TestOOBEAndSync) {
|
| + // Choose options at OOBE.
|
| + SetLocalValues("es", "xkb-old:es", "");
|
| + pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, true);
|
| +
|
| + // Initialize preferences.
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| +
|
| + // Add an input method before syncing starts.
|
| + preload_engines_.SetValue("xkb-old:es,xkb-old:us");
|
| +
|
| + // 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-old:ru")));
|
| + sync_data_list.push_back(CreatePrefSyncData(
|
| + prefs::kLanguageEnabledExtensionImesSyncable, base::StringValue("ime1")));
|
| +
|
| + // 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));
|
| + {
|
| + SCOPED_TRACE("Server values should have merged with local values.");
|
| + ExpectLocalValues("es,ru,fi", "xkb-old:es,xkb-old:us,xkb-old:ru", "ime1");
|
| + }
|
| +
|
| + // 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("xkb-old:de"))));
|
| + change_list.push_back(syncer::SyncChange(
|
| + FROM_HERE,
|
| + syncer::SyncChange::ACTION_UPDATE,
|
| + CreatePrefSyncData(
|
| + prefs::kLanguageEnabledExtensionImesSyncable,
|
| + base::StringValue("ime2"))));
|
| + sync->ProcessSyncChanges(FROM_HERE, change_list);
|
| +
|
| + {
|
| + SCOPED_TRACE("Local preferences should have remained the same.");
|
| + ExpectLocalValues("es,ru,fi", "xkb-old:es,xkb-old:us,xkb-old:ru", "ime1");
|
| + }
|
| + {
|
| + // Change local preferences.
|
| + SCOPED_TRACE("Global preferences should have been updated.");
|
| + SetLocalValues("jp", "xkb-old:jp", "ime2");
|
| + ExpectGlobalValues("jp", "xkb-old:jp", "ime2");
|
| + }
|
| +}
|
| +
|
| +TEST_F(InputMethodPreferencesTest, TestLogIn) {
|
| + // Set up existing preference values.
|
| + SetLocalValues("es", "xkb-old:es", "ime1");
|
| + SetGlobalValues("es", "xkb-old:es", "ime1");
|
| + pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, false);
|
| +
|
| + // Initialize preferences.
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| +
|
| + // 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("xkb-old:ru")));
|
| + sync_data_list.push_back(CreatePrefSyncData(
|
| + prefs::kLanguageEnabledExtensionImes, base::StringValue("ime1")));
|
| +
|
| + // 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));
|
| + {
|
| + SCOPED_TRACE("Local preferences should have remained the same.");
|
| + ExpectLocalValues("es", "xkb-old:es", "ime1");
|
| + }
|
| + {
|
| + // Change local preferences.
|
| + SCOPED_TRACE("Global preferences should have been updated.");
|
| + SetLocalValues("jp", "xkb-old:jp", "ime2");
|
| + ExpectGlobalValues("jp", "xkb-old:jp", "ime2");
|
| + }
|
| +}
|
| +
|
| +TEST_F(InputMethodPreferencesTest, TestLogInDifferentGlobalValues) {
|
| + // Set up existing preferences.
|
| + SetLocalValues("es", "xkb-old:es", "ime1");
|
| + pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, false);
|
| +
|
| + // The global preferences have changed since we initialized the local prefs.
|
| + SetGlobalValues("ru", "xkb-old:ru", "ime2");
|
| +
|
| + // Initialize preferences.
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| + {
|
| + SCOPED_TRACE("Local preferences should have remained the same.");
|
| + ExpectLocalValues("es", "xkb-old:es", "ime1");
|
| + }
|
| + {
|
| + // Change local preferences.
|
| + SCOPED_TRACE("Global preferences should have been updated.");
|
| + SetLocalValues("jp", "xkb-old:jp", "ime3");
|
| + ExpectGlobalValues("jp", "xkb-old:jp", "ime3");
|
| + }
|
| +}
|
| +
|
| +TEST_F(InputMethodPreferencesTest, TestLogInLegacy) {
|
| + // Simulate existing local preferences from M-36.
|
| + SetLocalValues("es", "xkb-old:es", "ime1");
|
| +
|
| + // Initialize preferences.
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| +
|
| + // Sync. Since this is an existing profile, the local values don'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("xkb-old:ru")));
|
| + sync_data_list.push_back(CreatePrefSyncData(
|
| + prefs::kLanguageEnabledExtensionImesSyncable, base::StringValue("ime2")));
|
| +
|
| + 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));
|
| + {
|
| + SCOPED_TRACE("Local preferences should have remained the same.");
|
| + ExpectLocalValues("es", "xkb-old:es", "ime1");
|
| + }
|
| + {
|
| + // Change local preferences.
|
| + SCOPED_TRACE("Global preferences should have been updated.");
|
| + SetLocalValues("jp", "xkb-old:jp", "ime3");
|
| + ExpectGlobalValues("jp", "xkb-old:jp", "ime3");
|
| + }
|
| +}
|
| +
|
| +TEST_F(InputMethodPreferencesTest, MergeStressTest) {
|
| + SetLocalValues("es", "xkb-old:es,xkb-old:us,xkb-old:jp", "");
|
| + pref_service_->SetBoolean(prefs::kLanguageShouldMergeInputMethods, true);
|
| +
|
| + // Initialize preferences.
|
| + prefs_->Init(pref_service_.get(), test_user_);
|
| +
|
| + // Change input methods and languages before syncing starts.
|
| + SetLocalValues("en,es,jp,ar",
|
| + "xkb-old:es,xkb-old:jp,xkb-old:dv,xkb-old:ar",
|
| + "ime2,ime1,ime4");
|
| +
|
| + // 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("xkb-old:ru,xkb-old:ru,xkb-old:jp,xkb-old:jp")));
|
| + sync_data_list.push_back(CreatePrefSyncData(
|
| + prefs::kLanguageEnabledExtensionImesSyncable,
|
| + base::StringValue("")));
|
| +
|
| + // 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));
|
| + {
|
| + SCOPED_TRACE("Server values should have merged with local values.");
|
| + ExpectLocalValues("en,es,jp,ar,fi,de",
|
| + "xkb-old:es,xkb-old:jp,xkb-old:dv,xkb-old:ar,xkb-old:ru",
|
| + "ime2,ime1,ime4");
|
| + }
|
| }
|
|
|
| } // namespace chromeos
|
|
|