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 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/input_method/input_method_persistence.h" 6 7#include "base/command_line.h" 8#include "base/prefs/pref_service.h" 9#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 10#include "chrome/browser/chromeos/language_preferences.h" 11#include "chrome/browser/chromeos/login/users/fake_user_manager.h" 12#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 13#include "chrome/browser/chromeos/profiles/profile_helper.h" 14#include "chrome/browser/profiles/profile_manager.h" 15#include "chrome/common/chrome_constants.h" 16#include "chrome/common/chrome_switches.h" 17#include "chrome/common/pref_names.h" 18#include "chrome/test/base/testing_browser_process.h" 19#include "chrome/test/base/testing_pref_service_syncable.h" 20#include "chrome/test/base/testing_profile.h" 21#include "chrome/test/base/testing_profile_manager.h" 22#include "chromeos/chromeos_switches.h" 23 24#include "testing/gtest/include/gtest/gtest.h" 25 26namespace chromeos { 27namespace input_method { 28 29namespace { 30const char kInputId1[] = "xkb:us:dvorak:eng"; 31const char kInputId2[] = "xkb:us:colemak:eng"; 32} 33 34class InputMethodPersistenceTest : public testing::Test { 35 protected: 36 InputMethodPersistenceTest() 37 : mock_profile_manager_(TestingBrowserProcess::GetGlobal()), 38 fake_user_manager_(new chromeos::FakeUserManager()), 39 user_manager_enabler_(fake_user_manager_) {} 40 41 virtual void SetUp() OVERRIDE { 42 ASSERT_TRUE(mock_profile_manager_.SetUp()); 43 44 // Add a user. 45 const char kTestUserName[] = "test-user@example.com"; 46 fake_user_manager_->AddUser(kTestUserName); 47 fake_user_manager_->LoginUser(kTestUserName); 48 49 // Create a valid profile for the user. 50 TestingProfile* mock_profile = 51 mock_profile_manager_.CreateTestingProfile(kTestUserName); 52 mock_profile_manager_.SetLoggedIn(true); 53 EXPECT_TRUE(ProfileManager::GetActiveUserProfile() == mock_profile); 54 55 mock_user_prefs_ = mock_profile->GetTestingPrefService(); 56 } 57 58 // Verifies that the user and system prefs contain the expected values. 59 void VerifyPrefs(const std::string& current_input_method, 60 const std::string& previous_input_method, 61 const std::string& preferred_keyboard_layout) { 62 EXPECT_EQ(current_input_method, 63 mock_user_prefs_->GetString(prefs::kLanguageCurrentInputMethod)); 64 EXPECT_EQ(previous_input_method, 65 mock_user_prefs_->GetString(prefs::kLanguagePreviousInputMethod)); 66 EXPECT_EQ(preferred_keyboard_layout, 67 g_browser_process->local_state()->GetString( 68 language_prefs::kPreferredKeyboardLayout)); 69 } 70 71 TestingPrefServiceSyncable* mock_user_prefs_; 72 MockInputMethodManager mock_manager_; 73 TestingProfileManager mock_profile_manager_; 74 chromeos::FakeUserManager* fake_user_manager_; 75 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 76}; 77 78TEST_F(InputMethodPersistenceTest, TestLifetime) { 79 { 80 InputMethodPersistence persistence(&mock_manager_); 81 EXPECT_EQ(1, mock_manager_.add_observer_count_); 82 } 83 EXPECT_EQ(1, mock_manager_.remove_observer_count_); 84} 85 86TEST_F(InputMethodPersistenceTest, TestPrefPersistenceByState) { 87 InputMethodPersistence persistence(&mock_manager_); 88 89 persistence.OnSessionStateChange(InputMethodManager::STATE_LOGIN_SCREEN); 90 mock_manager_.SetCurrentInputMethodId(kInputId1); 91 persistence.InputMethodChanged(&mock_manager_, false); 92 VerifyPrefs("", "", kInputId1); 93 94 persistence.OnSessionStateChange(InputMethodManager::STATE_BROWSER_SCREEN); 95 mock_manager_.SetCurrentInputMethodId(kInputId2); 96 persistence.InputMethodChanged(&mock_manager_, false); 97 VerifyPrefs(kInputId2, "", kInputId1); 98 99 persistence.OnSessionStateChange(InputMethodManager::STATE_LOCK_SCREEN); 100 mock_manager_.SetCurrentInputMethodId(kInputId1); 101 persistence.InputMethodChanged(&mock_manager_, false); 102 VerifyPrefs(kInputId2, "", kInputId1); 103 104 persistence.OnSessionStateChange(InputMethodManager::STATE_TERMINATING); 105 mock_manager_.SetCurrentInputMethodId(kInputId1); 106 persistence.InputMethodChanged(&mock_manager_, false); 107 VerifyPrefs(kInputId2, "", kInputId1); 108 109 persistence.OnSessionStateChange(InputMethodManager::STATE_LOGIN_SCREEN); 110 mock_manager_.SetCurrentInputMethodId(kInputId2); 111 persistence.InputMethodChanged(&mock_manager_, false); 112 VerifyPrefs(kInputId2, "", kInputId2); 113 114 persistence.OnSessionStateChange(InputMethodManager::STATE_BROWSER_SCREEN); 115 mock_manager_.SetCurrentInputMethodId(kInputId1); 116 persistence.InputMethodChanged(&mock_manager_, false); 117 VerifyPrefs(kInputId1, kInputId2, kInputId2); 118} 119 120} // namespace input_method 121} // namespace chromeos 122