| Index: chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc
|
| diff --git a/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc b/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..29ea1dfbeecb7aa0872a3c8e5eceeb91d837d3c0
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc
|
| @@ -0,0 +1,392 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/input_method/browser_state_monitor.h"
|
| +
|
| +#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
|
| +#include "chrome/browser/prefs/pref_member.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "chrome/test/base/testing_pref_service.h"
|
| +#include "content/public/browser/notification_details.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace chromeos {
|
| +namespace input_method {
|
| +namespace {
|
| +
|
| +void RegisterTestPrefs(PrefService* prefs) {
|
| + prefs->RegisterStringPref(prefs::kLanguagePreviousInputMethod,
|
| + "",
|
| + PrefService::UNSYNCABLE_PREF);
|
| + prefs->RegisterStringPref(prefs::kLanguageCurrentInputMethod,
|
| + "",
|
| + PrefService::UNSYNCABLE_PREF);
|
| +}
|
| +
|
| +class TestableBrowserStateMonitor : public BrowserStateMonitor {
|
| + public:
|
| + using BrowserStateMonitor::InputMethodChanged;
|
| + using BrowserStateMonitor::Observe;
|
| +
|
| + explicit TestableBrowserStateMonitor(InputMethodManager* manager)
|
| + : BrowserStateMonitor(manager) {
|
| + ResetCounters();
|
| + }
|
| +
|
| + virtual ~TestableBrowserStateMonitor() {
|
| + }
|
| +
|
| + void ResetCounters() {
|
| + update_local_state_count_ = 0;
|
| + last_local_state_.clear();
|
| + update_user_pref_count_ = 0;
|
| + last_user_pref_.clear();
|
| + }
|
| +
|
| + int update_local_state_count() const { return update_local_state_count_; }
|
| + const std::string& last_local_state() const { return last_local_state_; }
|
| + int update_user_pref_count() const { return update_user_pref_count_; }
|
| + const std::string& last_user_pref() const { return last_user_pref_; }
|
| +
|
| + protected:
|
| + virtual void UpdateLocalState(
|
| + const std::string& current_input_method) OVERRIDE {
|
| + ++update_local_state_count_;
|
| + last_local_state_ = current_input_method;
|
| + // Do not call the parent class' method since it depends on the global
|
| + // browser object which is a bit difficult to mock. This should be okay
|
| + // since the method is really simple.
|
| + }
|
| +
|
| + virtual void UpdateUserPreferences(
|
| + const std::string& current_input_method) OVERRIDE {
|
| + ++update_user_pref_count_;
|
| + last_user_pref_ = current_input_method;
|
| + BrowserStateMonitor::UpdateUserPreferences(current_input_method);
|
| + }
|
| +
|
| + private:
|
| + int update_local_state_count_;
|
| + std::string last_local_state_;
|
| + int update_user_pref_count_;
|
| + std::string last_user_pref_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestableBrowserStateMonitor);
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| +TEST(BrowserStateMonitorTest, TestConstruction) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + // Check the initial state of the |mock_manager| and |monitor| objects.
|
| + EXPECT_EQ(1, mock_manager.add_observer_count_);
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestDestruction) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + {
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| + }
|
| + EXPECT_EQ(1, mock_manager.remove_observer_count_);
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObserveLoginUserChanged) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // Check if the state of the |mock_manager| as well as the |monitor| are both
|
| + // changed.
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObserveSessionStarted) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // Check if the state of the |mock_manager| as well as the |monitor| are both
|
| + // changed.
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObserveLoginUserChangedThenSessionStarted) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // Check if the state of the |mock_manager| as well as the |monitor| are both
|
| + // changed.
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +
|
| + monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // The second notification should be nop.
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObserveScreenLockUnlock) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + bool locked = true;
|
| + monitor.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::Details<bool>(&locked));
|
| + EXPECT_EQ(3, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, monitor.state());
|
| +
|
| + // When the screen is locked, the monitor should ignore input method changes.
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| +
|
| + locked = false;
|
| + monitor.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::Details<bool>(&locked));
|
| + EXPECT_EQ(4, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(1, monitor.update_user_pref_count());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObserveAppTerminating) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(content::NOTIFICATION_APP_TERMINATING,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // Check if the state of the |mock_manager| as well as the |monitor| are both
|
| + // changed.
|
| + EXPECT_EQ(2, mock_manager.set_state_count_);
|
| + EXPECT_EQ(InputMethodManager::STATE_TERMINATING,
|
| + mock_manager.last_state_);
|
| + EXPECT_EQ(InputMethodManager::STATE_TERMINATING, monitor.state());
|
| +
|
| + // In the terminating state, the monitor should ignore input method changes.
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestObservePrefChanged) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| + monitor.Observe(chrome::NOTIFICATION_PREF_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| +
|
| + // NOTIFICATION_PREF_CHANGED should be ignored.
|
| + EXPECT_EQ(1, mock_manager.set_state_count_);
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreen) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state());
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(1, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(2, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreen) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(1, monitor.update_user_pref_count());
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(2, monitor.update_user_pref_count());
|
| +
|
| + monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(3, monitor.update_user_pref_count());
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(4, monitor.update_user_pref_count());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreenDetails) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state());
|
| + std::string input_method_id = "xkb:us:dvorak:eng";
|
| + mock_manager.SetCurrentInputMethodId(input_method_id);
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(1, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id, monitor.last_local_state());
|
| + input_method_id = "xkb:us:colemak:eng";
|
| + mock_manager.SetCurrentInputMethodId(input_method_id);
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(2, monitor.update_local_state_count());
|
| + EXPECT_EQ(0, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id, monitor.last_local_state());
|
| +}
|
| +
|
| +TEST(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreenDetails) {
|
| + TestingPrefService prefs;
|
| + RegisterTestPrefs(&prefs);
|
| + MockInputMethodManager mock_manager;
|
| + TestableBrowserStateMonitor monitor(&mock_manager);
|
| + monitor.SetPrefServiceForTesting(&prefs);
|
| +
|
| + StringPrefMember previous;
|
| + previous.Init(prefs::kLanguagePreviousInputMethod, &prefs, NULL);
|
| + EXPECT_EQ("", previous.GetValue());
|
| + StringPrefMember current;
|
| + current.Init(prefs::kLanguageCurrentInputMethod, &prefs, NULL);
|
| + EXPECT_EQ("", current.GetValue());
|
| +
|
| + monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| + monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| + EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state());
|
| +
|
| + const std::string input_method_id = "xkb:us:dvorak:eng";
|
| + mock_manager.SetCurrentInputMethodId(input_method_id);
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(1, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id, monitor.last_user_pref());
|
| + EXPECT_EQ("", previous.GetValue());
|
| + EXPECT_EQ(input_method_id, current.GetValue());
|
| +
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(2, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id, monitor.last_user_pref());
|
| + EXPECT_EQ("", previous.GetValue());
|
| + EXPECT_EQ(input_method_id, current.GetValue());
|
| +
|
| + const std::string input_method_id_2 = "xkb:us:colemak:eng";
|
| + mock_manager.SetCurrentInputMethodId(input_method_id_2);
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(3, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id_2, monitor.last_user_pref());
|
| + EXPECT_EQ(input_method_id, previous.GetValue());
|
| + EXPECT_EQ(input_method_id_2, current.GetValue());
|
| +
|
| + const std::string input_method_id_3 = "xkb:us::eng";
|
| + mock_manager.SetCurrentInputMethodId(input_method_id_3);
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(4, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id_3, monitor.last_user_pref());
|
| + EXPECT_EQ(input_method_id_2, previous.GetValue());
|
| + EXPECT_EQ(input_method_id_3, current.GetValue());
|
| +
|
| + monitor.InputMethodChanged(&mock_manager);
|
| + EXPECT_EQ(0, monitor.update_local_state_count());
|
| + EXPECT_EQ(5, monitor.update_user_pref_count());
|
| + EXPECT_EQ(input_method_id_3, monitor.last_user_pref());
|
| + EXPECT_EQ(input_method_id_2, previous.GetValue());
|
| + EXPECT_EQ(input_method_id_3, current.GetValue());
|
| +}
|
| +
|
| +} // namespace input_method
|
| +} // namespace chromeos
|
|
|