Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(720)

Side by Side Diff: chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc

Issue 9999018: chrome/browser/chromeos/input_method/ refactoring [part 6 of 6] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase, remove |should_hide_properties_| Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698