OLD | NEW |
(Empty) | |
| 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/browser_state_monitor.h" |
| 6 |
| 7 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
| 8 #include "chrome/browser/prefs/pref_member.h" |
| 9 #include "chrome/common/chrome_notification_types.h" |
| 10 #include "chrome/common/pref_names.h" |
| 11 #include "chrome/test/base/testing_pref_service.h" |
| 12 #include "content/public/browser/notification_details.h" |
| 13 #include "content/public/browser/notification_service.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 |
| 16 namespace chromeos { |
| 17 namespace input_method { |
| 18 namespace { |
| 19 |
| 20 void RegisterTestPrefs(PrefService* prefs) { |
| 21 prefs->RegisterStringPref(prefs::kLanguagePreviousInputMethod, |
| 22 "", |
| 23 PrefService::UNSYNCABLE_PREF); |
| 24 prefs->RegisterStringPref(prefs::kLanguageCurrentInputMethod, |
| 25 "", |
| 26 PrefService::UNSYNCABLE_PREF); |
| 27 } |
| 28 |
| 29 class TestableBrowserStateMonitor : public BrowserStateMonitor { |
| 30 public: |
| 31 using BrowserStateMonitor::InputMethodChanged; |
| 32 using BrowserStateMonitor::Observe; |
| 33 |
| 34 explicit TestableBrowserStateMonitor(InputMethodManager* manager) |
| 35 : BrowserStateMonitor(manager) { |
| 36 ResetCounters(); |
| 37 } |
| 38 |
| 39 virtual ~TestableBrowserStateMonitor() { |
| 40 } |
| 41 |
| 42 void ResetCounters() { |
| 43 update_local_state_count_ = 0; |
| 44 last_local_state_.clear(); |
| 45 update_user_pref_count_ = 0; |
| 46 last_user_pref_.clear(); |
| 47 } |
| 48 |
| 49 int update_local_state_count() const { return update_local_state_count_; } |
| 50 const std::string& last_local_state() const { return last_local_state_; } |
| 51 int update_user_pref_count() const { return update_user_pref_count_; } |
| 52 const std::string& last_user_pref() const { return last_user_pref_; } |
| 53 |
| 54 protected: |
| 55 virtual void UpdateLocalState( |
| 56 const std::string& current_input_method) OVERRIDE { |
| 57 ++update_local_state_count_; |
| 58 last_local_state_ = current_input_method; |
| 59 // Do not call the parent class' method since it depends on the global |
| 60 // browser object which is a bit difficult to mock. This should be okay |
| 61 // since the method is really simple. |
| 62 } |
| 63 |
| 64 virtual void UpdateUserPreferences( |
| 65 const std::string& current_input_method) OVERRIDE { |
| 66 ++update_user_pref_count_; |
| 67 last_user_pref_ = current_input_method; |
| 68 BrowserStateMonitor::UpdateUserPreferences(current_input_method); |
| 69 } |
| 70 |
| 71 private: |
| 72 int update_local_state_count_; |
| 73 std::string last_local_state_; |
| 74 int update_user_pref_count_; |
| 75 std::string last_user_pref_; |
| 76 |
| 77 DISALLOW_COPY_AND_ASSIGN(TestableBrowserStateMonitor); |
| 78 }; |
| 79 |
| 80 } // anonymous namespace |
| 81 |
| 82 TEST(BrowserStateMonitorTest, TestConstruction) { |
| 83 TestingPrefService prefs; |
| 84 RegisterTestPrefs(&prefs); |
| 85 MockInputMethodManager mock_manager; |
| 86 TestableBrowserStateMonitor monitor(&mock_manager); |
| 87 monitor.SetPrefServiceForTesting(&prefs); |
| 88 |
| 89 // Check the initial state of the |mock_manager| and |monitor| objects. |
| 90 EXPECT_EQ(1, mock_manager.add_observer_count_); |
| 91 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 92 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, mock_manager.last_state_); |
| 93 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state()); |
| 94 } |
| 95 |
| 96 TEST(BrowserStateMonitorTest, TestDestruction) { |
| 97 TestingPrefService prefs; |
| 98 RegisterTestPrefs(&prefs); |
| 99 MockInputMethodManager mock_manager; |
| 100 { |
| 101 TestableBrowserStateMonitor monitor(&mock_manager); |
| 102 monitor.SetPrefServiceForTesting(&prefs); |
| 103 } |
| 104 EXPECT_EQ(1, mock_manager.remove_observer_count_); |
| 105 } |
| 106 |
| 107 TEST(BrowserStateMonitorTest, TestObserveLoginUserChanged) { |
| 108 TestingPrefService prefs; |
| 109 RegisterTestPrefs(&prefs); |
| 110 MockInputMethodManager mock_manager; |
| 111 TestableBrowserStateMonitor monitor(&mock_manager); |
| 112 monitor.SetPrefServiceForTesting(&prefs); |
| 113 |
| 114 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 115 monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 116 content::NotificationService::AllSources(), |
| 117 content::NotificationService::NoDetails()); |
| 118 |
| 119 // Check if the state of the |mock_manager| as well as the |monitor| are both |
| 120 // changed. |
| 121 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 122 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_); |
| 123 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 124 } |
| 125 |
| 126 TEST(BrowserStateMonitorTest, TestObserveSessionStarted) { |
| 127 TestingPrefService prefs; |
| 128 RegisterTestPrefs(&prefs); |
| 129 MockInputMethodManager mock_manager; |
| 130 TestableBrowserStateMonitor monitor(&mock_manager); |
| 131 monitor.SetPrefServiceForTesting(&prefs); |
| 132 |
| 133 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 134 monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED, |
| 135 content::NotificationService::AllSources(), |
| 136 content::NotificationService::NoDetails()); |
| 137 |
| 138 // Check if the state of the |mock_manager| as well as the |monitor| are both |
| 139 // changed. |
| 140 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 141 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_); |
| 142 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 143 } |
| 144 |
| 145 TEST(BrowserStateMonitorTest, TestObserveLoginUserChangedThenSessionStarted) { |
| 146 TestingPrefService prefs; |
| 147 RegisterTestPrefs(&prefs); |
| 148 MockInputMethodManager mock_manager; |
| 149 TestableBrowserStateMonitor monitor(&mock_manager); |
| 150 monitor.SetPrefServiceForTesting(&prefs); |
| 151 |
| 152 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 153 monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 154 content::NotificationService::AllSources(), |
| 155 content::NotificationService::NoDetails()); |
| 156 |
| 157 // Check if the state of the |mock_manager| as well as the |monitor| are both |
| 158 // changed. |
| 159 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 160 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_); |
| 161 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 162 |
| 163 monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED, |
| 164 content::NotificationService::AllSources(), |
| 165 content::NotificationService::NoDetails()); |
| 166 |
| 167 // The second notification should be nop. |
| 168 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 169 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_); |
| 170 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 171 } |
| 172 |
| 173 TEST(BrowserStateMonitorTest, TestObserveScreenLockUnlock) { |
| 174 TestingPrefService prefs; |
| 175 RegisterTestPrefs(&prefs); |
| 176 MockInputMethodManager mock_manager; |
| 177 TestableBrowserStateMonitor monitor(&mock_manager); |
| 178 monitor.SetPrefServiceForTesting(&prefs); |
| 179 |
| 180 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 181 monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 182 content::NotificationService::AllSources(), |
| 183 content::NotificationService::NoDetails()); |
| 184 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 185 monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED, |
| 186 content::NotificationService::AllSources(), |
| 187 content::NotificationService::NoDetails()); |
| 188 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 189 bool locked = true; |
| 190 monitor.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
| 191 content::NotificationService::AllSources(), |
| 192 content::Details<bool>(&locked)); |
| 193 EXPECT_EQ(3, mock_manager.set_state_count_); |
| 194 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, mock_manager.last_state_); |
| 195 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, monitor.state()); |
| 196 |
| 197 // When the screen is locked, the monitor should ignore input method changes. |
| 198 monitor.InputMethodChanged(&mock_manager); |
| 199 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 200 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 201 |
| 202 locked = false; |
| 203 monitor.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
| 204 content::NotificationService::AllSources(), |
| 205 content::Details<bool>(&locked)); |
| 206 EXPECT_EQ(4, mock_manager.set_state_count_); |
| 207 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, mock_manager.last_state_); |
| 208 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 209 |
| 210 monitor.InputMethodChanged(&mock_manager); |
| 211 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 212 EXPECT_EQ(1, monitor.update_user_pref_count()); |
| 213 } |
| 214 |
| 215 TEST(BrowserStateMonitorTest, TestObserveAppTerminating) { |
| 216 TestingPrefService prefs; |
| 217 RegisterTestPrefs(&prefs); |
| 218 MockInputMethodManager mock_manager; |
| 219 TestableBrowserStateMonitor monitor(&mock_manager); |
| 220 monitor.SetPrefServiceForTesting(&prefs); |
| 221 |
| 222 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 223 monitor.Observe(content::NOTIFICATION_APP_TERMINATING, |
| 224 content::NotificationService::AllSources(), |
| 225 content::NotificationService::NoDetails()); |
| 226 |
| 227 // Check if the state of the |mock_manager| as well as the |monitor| are both |
| 228 // changed. |
| 229 EXPECT_EQ(2, mock_manager.set_state_count_); |
| 230 EXPECT_EQ(InputMethodManager::STATE_TERMINATING, |
| 231 mock_manager.last_state_); |
| 232 EXPECT_EQ(InputMethodManager::STATE_TERMINATING, monitor.state()); |
| 233 |
| 234 // In the terminating state, the monitor should ignore input method changes. |
| 235 monitor.InputMethodChanged(&mock_manager); |
| 236 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 237 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 238 } |
| 239 |
| 240 TEST(BrowserStateMonitorTest, TestObservePrefChanged) { |
| 241 TestingPrefService prefs; |
| 242 RegisterTestPrefs(&prefs); |
| 243 MockInputMethodManager mock_manager; |
| 244 TestableBrowserStateMonitor monitor(&mock_manager); |
| 245 monitor.SetPrefServiceForTesting(&prefs); |
| 246 |
| 247 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 248 monitor.Observe(chrome::NOTIFICATION_PREF_CHANGED, |
| 249 content::NotificationService::AllSources(), |
| 250 content::NotificationService::NoDetails()); |
| 251 |
| 252 // NOTIFICATION_PREF_CHANGED should be ignored. |
| 253 EXPECT_EQ(1, mock_manager.set_state_count_); |
| 254 } |
| 255 |
| 256 TEST(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreen) { |
| 257 TestingPrefService prefs; |
| 258 RegisterTestPrefs(&prefs); |
| 259 MockInputMethodManager mock_manager; |
| 260 TestableBrowserStateMonitor monitor(&mock_manager); |
| 261 monitor.SetPrefServiceForTesting(&prefs); |
| 262 |
| 263 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state()); |
| 264 monitor.InputMethodChanged(&mock_manager); |
| 265 EXPECT_EQ(1, monitor.update_local_state_count()); |
| 266 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 267 monitor.InputMethodChanged(&mock_manager); |
| 268 EXPECT_EQ(2, monitor.update_local_state_count()); |
| 269 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 270 } |
| 271 |
| 272 TEST(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreen) { |
| 273 TestingPrefService prefs; |
| 274 RegisterTestPrefs(&prefs); |
| 275 MockInputMethodManager mock_manager; |
| 276 TestableBrowserStateMonitor monitor(&mock_manager); |
| 277 monitor.SetPrefServiceForTesting(&prefs); |
| 278 |
| 279 monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 280 content::NotificationService::AllSources(), |
| 281 content::NotificationService::NoDetails()); |
| 282 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 283 |
| 284 monitor.InputMethodChanged(&mock_manager); |
| 285 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 286 EXPECT_EQ(1, monitor.update_user_pref_count()); |
| 287 monitor.InputMethodChanged(&mock_manager); |
| 288 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 289 EXPECT_EQ(2, monitor.update_user_pref_count()); |
| 290 |
| 291 monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED, |
| 292 content::NotificationService::AllSources(), |
| 293 content::NotificationService::NoDetails()); |
| 294 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 295 |
| 296 monitor.InputMethodChanged(&mock_manager); |
| 297 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 298 EXPECT_EQ(3, monitor.update_user_pref_count()); |
| 299 monitor.InputMethodChanged(&mock_manager); |
| 300 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 301 EXPECT_EQ(4, monitor.update_user_pref_count()); |
| 302 } |
| 303 |
| 304 TEST(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreenDetails) { |
| 305 TestingPrefService prefs; |
| 306 RegisterTestPrefs(&prefs); |
| 307 MockInputMethodManager mock_manager; |
| 308 TestableBrowserStateMonitor monitor(&mock_manager); |
| 309 monitor.SetPrefServiceForTesting(&prefs); |
| 310 |
| 311 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state()); |
| 312 std::string input_method_id = "xkb:us:dvorak:eng"; |
| 313 mock_manager.SetCurrentInputMethodId(input_method_id); |
| 314 monitor.InputMethodChanged(&mock_manager); |
| 315 EXPECT_EQ(1, monitor.update_local_state_count()); |
| 316 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 317 EXPECT_EQ(input_method_id, monitor.last_local_state()); |
| 318 input_method_id = "xkb:us:colemak:eng"; |
| 319 mock_manager.SetCurrentInputMethodId(input_method_id); |
| 320 monitor.InputMethodChanged(&mock_manager); |
| 321 EXPECT_EQ(2, monitor.update_local_state_count()); |
| 322 EXPECT_EQ(0, monitor.update_user_pref_count()); |
| 323 EXPECT_EQ(input_method_id, monitor.last_local_state()); |
| 324 } |
| 325 |
| 326 TEST(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreenDetails) { |
| 327 TestingPrefService prefs; |
| 328 RegisterTestPrefs(&prefs); |
| 329 MockInputMethodManager mock_manager; |
| 330 TestableBrowserStateMonitor monitor(&mock_manager); |
| 331 monitor.SetPrefServiceForTesting(&prefs); |
| 332 |
| 333 StringPrefMember previous; |
| 334 previous.Init(prefs::kLanguagePreviousInputMethod, &prefs, NULL); |
| 335 EXPECT_EQ("", previous.GetValue()); |
| 336 StringPrefMember current; |
| 337 current.Init(prefs::kLanguageCurrentInputMethod, &prefs, NULL); |
| 338 EXPECT_EQ("", current.GetValue()); |
| 339 |
| 340 monitor.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 341 content::NotificationService::AllSources(), |
| 342 content::NotificationService::NoDetails()); |
| 343 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 344 monitor.Observe(chrome::NOTIFICATION_SESSION_STARTED, |
| 345 content::NotificationService::AllSources(), |
| 346 content::NotificationService::NoDetails()); |
| 347 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor.state()); |
| 348 |
| 349 const std::string input_method_id = "xkb:us:dvorak:eng"; |
| 350 mock_manager.SetCurrentInputMethodId(input_method_id); |
| 351 monitor.InputMethodChanged(&mock_manager); |
| 352 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 353 EXPECT_EQ(1, monitor.update_user_pref_count()); |
| 354 EXPECT_EQ(input_method_id, monitor.last_user_pref()); |
| 355 EXPECT_EQ("", previous.GetValue()); |
| 356 EXPECT_EQ(input_method_id, current.GetValue()); |
| 357 |
| 358 monitor.InputMethodChanged(&mock_manager); |
| 359 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 360 EXPECT_EQ(2, monitor.update_user_pref_count()); |
| 361 EXPECT_EQ(input_method_id, monitor.last_user_pref()); |
| 362 EXPECT_EQ("", previous.GetValue()); |
| 363 EXPECT_EQ(input_method_id, current.GetValue()); |
| 364 |
| 365 const std::string input_method_id_2 = "xkb:us:colemak:eng"; |
| 366 mock_manager.SetCurrentInputMethodId(input_method_id_2); |
| 367 monitor.InputMethodChanged(&mock_manager); |
| 368 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 369 EXPECT_EQ(3, monitor.update_user_pref_count()); |
| 370 EXPECT_EQ(input_method_id_2, monitor.last_user_pref()); |
| 371 EXPECT_EQ(input_method_id, previous.GetValue()); |
| 372 EXPECT_EQ(input_method_id_2, current.GetValue()); |
| 373 |
| 374 const std::string input_method_id_3 = "xkb:us::eng"; |
| 375 mock_manager.SetCurrentInputMethodId(input_method_id_3); |
| 376 monitor.InputMethodChanged(&mock_manager); |
| 377 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 378 EXPECT_EQ(4, monitor.update_user_pref_count()); |
| 379 EXPECT_EQ(input_method_id_3, monitor.last_user_pref()); |
| 380 EXPECT_EQ(input_method_id_2, previous.GetValue()); |
| 381 EXPECT_EQ(input_method_id_3, current.GetValue()); |
| 382 |
| 383 monitor.InputMethodChanged(&mock_manager); |
| 384 EXPECT_EQ(0, monitor.update_local_state_count()); |
| 385 EXPECT_EQ(5, monitor.update_user_pref_count()); |
| 386 EXPECT_EQ(input_method_id_3, monitor.last_user_pref()); |
| 387 EXPECT_EQ(input_method_id_2, previous.GetValue()); |
| 388 EXPECT_EQ(input_method_id_3, current.GetValue()); |
| 389 } |
| 390 |
| 391 } // namespace input_method |
| 392 } // namespace chromeos |
OLD | NEW |