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

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

Issue 11466010: Decompose BrowserStateMonitor into two parts, simplifying unit tests and APIs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments. Created 8 years 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/input_method/browser_state_monitor.h" 5 #include "chrome/browser/chromeos/input_method/browser_state_monitor.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "chrome/browser/chromeos/input_method/mock_input_method_delegate.h" 10 #include "base/bind.h"
11 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
12 #include "chrome/common/chrome_notification_types.h" 11 #include "chrome/common/chrome_notification_types.h"
13 #include "content/public/browser/notification_details.h" 12 #include "content/public/browser/notification_details.h"
14 #include "content/public/browser/notification_service.h" 13 #include "content/public/browser/notification_service.h"
15 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
16 15
17 namespace chromeos { 16 namespace chromeos {
18 namespace input_method { 17 namespace input_method {
19 namespace { 18 namespace {
20 19
21 class TestableBrowserStateMonitor : public BrowserStateMonitor { 20 class MockObserver {
22 public: 21 public:
23 using BrowserStateMonitor::InputMethodChanged; 22 MockObserver()
24 using BrowserStateMonitor::Observe; 23 : state_(InputMethodManager::STATE_TERMINATING),
24 update_state_count_(0) { }
25 25
26 TestableBrowserStateMonitor(InputMethodManager* manager, 26 void SetState(InputMethodManager::State new_state) {
27 InputMethodDelegate* delegate) 27 ++update_state_count_;
28 : BrowserStateMonitor(manager, delegate) { 28 state_ = new_state;
29 } 29 }
30
31 base::Callback<void(InputMethodManager::State new_state)> AsCallback() {
32 return base::Bind(&MockObserver::SetState, base::Unretained(this));
33 }
34
35 int update_state_count() const {
36 return update_state_count_;
37 }
38
39 InputMethodManager::State state() const {
40 return state_;
41 }
42
43 private:
44 InputMethodManager::State state_;
45 int update_state_count_;
46
47 DISALLOW_COPY_AND_ASSIGN(MockObserver);
30 }; 48 };
31 49
32 } // anonymous namespace 50 } // anonymous namespace
33 51
34 TEST(BrowserStateMonitorLifetimeTest, TestConstruction) { 52 TEST(BrowserStateMonitorLifetimeTest, TestConstruction) {
35 MockInputMethodManager mock_manager; 53 MockObserver mock_observer;
36 MockInputMethodDelegate mock_delegate; 54 BrowserStateMonitor monitor(mock_observer.AsCallback());
37 TestableBrowserStateMonitor monitor(&mock_manager, &mock_delegate);
38 55
39 // Check the initial state of the |mock_manager| and |monitor| objects. 56 // Check the initial state of the |mock_observer| and |monitor| objects.
40 EXPECT_EQ(1, mock_manager.add_observer_count_); 57 EXPECT_EQ(1, mock_observer.update_state_count());
41 EXPECT_EQ(1, mock_manager.set_state_count_); 58 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, mock_observer.state());
42 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, mock_manager.last_state_);
43 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state()); 59 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.state());
44 } 60 }
45 61
46 TEST(BrowserStateMonitorLifetimeTest, TestDestruction) {
47 MockInputMethodManager mock_manager;
48 MockInputMethodDelegate mock_delegate;
49 {
50 TestableBrowserStateMonitor monitor(&mock_manager, &mock_delegate);
51 }
52 EXPECT_EQ(1, mock_manager.remove_observer_count_);
53 }
54
55 namespace { 62 namespace {
56 63
57 class BrowserStateMonitorTest : public testing::Test { 64 class BrowserStateMonitorTest : public testing::Test {
58 public: 65 public:
59 BrowserStateMonitorTest() 66 BrowserStateMonitorTest()
60 : monitor_(&mock_manager_, &mock_delegate_) { 67 : monitor_(mock_observer_.AsCallback()) {
61 } 68 }
62 69
63 protected: 70 protected:
64 MockInputMethodManager mock_manager_; 71 MockObserver mock_observer_;
65 MockInputMethodDelegate mock_delegate_; 72 BrowserStateMonitor monitor_;
66 TestableBrowserStateMonitor monitor_;
67 73
68 private: 74 private:
69 DISALLOW_COPY_AND_ASSIGN(BrowserStateMonitorTest); 75 DISALLOW_COPY_AND_ASSIGN(BrowserStateMonitorTest);
70 }; 76 };
71 77
72 } // anonymous namespace 78 } // anonymous namespace
73 79
74 TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChanged) { 80 TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChanged) {
75 EXPECT_EQ(1, mock_manager_.set_state_count_); 81 EXPECT_EQ(1, mock_observer_.update_state_count());
76 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, 82 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
77 content::NotificationService::AllSources(), 83 content::NotificationService::AllSources(),
78 content::NotificationService::NoDetails()); 84 content::NotificationService::NoDetails());
79 85
80 // Check if the state of the |mock_manager_| as well as the |monitor| are both 86 // Check if the state of the |mock_observer_| as well as the |monitor| are
81 // changed. 87 // both changed.
82 EXPECT_EQ(2, mock_manager_.set_state_count_); 88 EXPECT_EQ(2, mock_observer_.update_state_count());
83 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, 89 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN,
84 mock_manager_.last_state_); 90 mock_observer_.state());
85 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state()); 91 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
86 } 92 }
87 93
88 TEST_F(BrowserStateMonitorTest, TestObserveSessionStarted) { 94 TEST_F(BrowserStateMonitorTest, TestObserveSessionStarted) {
89 EXPECT_EQ(1, mock_manager_.set_state_count_); 95 EXPECT_EQ(1, mock_observer_.update_state_count());
90 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, 96 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED,
91 content::NotificationService::AllSources(), 97 content::NotificationService::AllSources(),
92 content::NotificationService::NoDetails()); 98 content::NotificationService::NoDetails());
93 99
94 // Check if the state of the |mock_manager_| as well as the |monitor| are both 100 // Check if the state of the |mock_observer_| as well as the |monitor| are
95 // changed. 101 // both changed.
96 EXPECT_EQ(2, mock_manager_.set_state_count_); 102 EXPECT_EQ(2, mock_observer_.update_state_count());
97 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, 103 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN,
98 mock_manager_.last_state_); 104 mock_observer_.state());
99 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state()); 105 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
100 } 106 }
101 107
102 TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChangedThenSessionStarted) { 108 TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChangedThenSessionStarted) {
103 EXPECT_EQ(1, mock_manager_.set_state_count_); 109 EXPECT_EQ(1, mock_observer_.update_state_count());
104 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, 110 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
105 content::NotificationService::AllSources(), 111 content::NotificationService::AllSources(),
106 content::NotificationService::NoDetails()); 112 content::NotificationService::NoDetails());
107 113
108 // Check if the state of the |mock_manager_| as well as the |monitor| are both 114 // Check if the state of the |mock_observer_| as well as the |monitor| are
109 // changed. 115 // both changed.
110 EXPECT_EQ(2, mock_manager_.set_state_count_); 116 EXPECT_EQ(2, mock_observer_.update_state_count());
111 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, 117 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN,
112 mock_manager_.last_state_); 118 mock_observer_.state());
113 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state()); 119 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
114 120
115 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, 121 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED,
116 content::NotificationService::AllSources(), 122 content::NotificationService::AllSources(),
117 content::NotificationService::NoDetails()); 123 content::NotificationService::NoDetails());
118 124
119 // The second notification should be nop. 125 // The second notification should be nop.
120 EXPECT_EQ(2, mock_manager_.set_state_count_); 126 EXPECT_EQ(2, mock_observer_.update_state_count());
121 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, 127 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN,
122 mock_manager_.last_state_); 128 mock_observer_.state());
123 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state()); 129 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
124 } 130 }
125 131
126 TEST_F(BrowserStateMonitorTest, TestObserveScreenLockUnlock) { 132 TEST_F(BrowserStateMonitorTest, TestObserveScreenLockUnlock) {
127 EXPECT_EQ(1, mock_manager_.set_state_count_); 133 EXPECT_EQ(1, mock_observer_.update_state_count());
128 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, 134 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
129 content::NotificationService::AllSources(), 135 content::NotificationService::AllSources(),
130 content::NotificationService::NoDetails()); 136 content::NotificationService::NoDetails());
131 EXPECT_EQ(2, mock_manager_.set_state_count_); 137 EXPECT_EQ(2, mock_observer_.update_state_count());
132 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, 138 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED,
133 content::NotificationService::AllSources(), 139 content::NotificationService::AllSources(),
134 content::NotificationService::NoDetails()); 140 content::NotificationService::NoDetails());
135 EXPECT_EQ(2, mock_manager_.set_state_count_); 141 EXPECT_EQ(2, mock_observer_.update_state_count());
136 bool locked = true; 142 bool locked = true;
137 monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 143 monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
138 content::NotificationService::AllSources(), 144 content::NotificationService::AllSources(),
139 content::Details<bool>(&locked)); 145 content::Details<bool>(&locked));
140 EXPECT_EQ(3, mock_manager_.set_state_count_); 146 EXPECT_EQ(3, mock_observer_.update_state_count());
141 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, 147 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN,
142 mock_manager_.last_state_); 148 mock_observer_.state());
143 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, monitor_.state()); 149 EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, monitor_.state());
144 150
145 // When the screen is locked, the monitor should ignore input method changes.
146 monitor_.InputMethodChanged(&mock_manager_, false);
147 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
148 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
149
150 locked = false; 151 locked = false;
151 monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 152 monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
152 content::NotificationService::AllSources(), 153 content::NotificationService::AllSources(),
153 content::Details<bool>(&locked)); 154 content::Details<bool>(&locked));
154 EXPECT_EQ(4, mock_manager_.set_state_count_); 155 EXPECT_EQ(4, mock_observer_.update_state_count());
155 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, 156 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN,
156 mock_manager_.last_state_); 157 mock_observer_.state());
157 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state()); 158 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
158
159 monitor_.InputMethodChanged(&mock_manager_, false);
160 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
161 EXPECT_EQ(1, mock_delegate_.update_user_input_method_count());
162 } 159 }
163 160
164 TEST_F(BrowserStateMonitorTest, TestObserveAppTerminating) { 161 TEST_F(BrowserStateMonitorTest, TestObserveAppTerminating) {
165 EXPECT_EQ(1, mock_manager_.set_state_count_); 162 EXPECT_EQ(1, mock_observer_.update_state_count());
166 monitor_.Observe(chrome::NOTIFICATION_APP_TERMINATING, 163 monitor_.Observe(chrome::NOTIFICATION_APP_TERMINATING,
167 content::NotificationService::AllSources(), 164 content::NotificationService::AllSources(),
168 content::NotificationService::NoDetails()); 165 content::NotificationService::NoDetails());
169 166
170 // Check if the state of the |mock_manager_| as well as the |monitor| are both 167 // Check if the state of the |mock_observer_| as well as the |monitor| are
171 // changed. 168 // both changed.
172 EXPECT_EQ(2, mock_manager_.set_state_count_); 169 EXPECT_EQ(2, mock_observer_.update_state_count());
173 EXPECT_EQ(InputMethodManager::STATE_TERMINATING, 170 EXPECT_EQ(InputMethodManager::STATE_TERMINATING,
174 mock_manager_.last_state_); 171 mock_observer_.state());
175 EXPECT_EQ(InputMethodManager::STATE_TERMINATING, monitor_.state()); 172 EXPECT_EQ(InputMethodManager::STATE_TERMINATING, monitor_.state());
176
177 // In the terminating state, the monitor should ignore input method changes.
178 monitor_.InputMethodChanged(&mock_manager_, false);
179 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
180 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
181 }
182
183 TEST_F(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreen) {
184 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor_.state());
185 monitor_.InputMethodChanged(&mock_manager_, false);
186 EXPECT_EQ(1, mock_delegate_.update_system_input_method_count());
187 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
188 monitor_.InputMethodChanged(&mock_manager_, false);
189 EXPECT_EQ(2, mock_delegate_.update_system_input_method_count());
190 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
191 }
192
193 TEST_F(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreen) {
194 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
195 content::NotificationService::AllSources(),
196 content::NotificationService::NoDetails());
197 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
198
199 monitor_.InputMethodChanged(&mock_manager_, false);
200 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
201 EXPECT_EQ(1, mock_delegate_.update_user_input_method_count());
202 monitor_.InputMethodChanged(&mock_manager_, false);
203 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
204 EXPECT_EQ(2, mock_delegate_.update_user_input_method_count());
205
206 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED,
207 content::NotificationService::AllSources(),
208 content::NotificationService::NoDetails());
209 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
210
211 monitor_.InputMethodChanged(&mock_manager_, false);
212 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
213 EXPECT_EQ(3, mock_delegate_.update_user_input_method_count());
214 monitor_.InputMethodChanged(&mock_manager_, false);
215 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
216 EXPECT_EQ(4, mock_delegate_.update_user_input_method_count());
217 }
218
219 TEST_F(BrowserStateMonitorTest, TestUpdatePrefOnLoginScreenDetails) {
220 EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor_.state());
221 std::string input_method_id = "xkb:us:dvorak:eng";
222 mock_manager_.SetCurrentInputMethodId(input_method_id);
223 monitor_.InputMethodChanged(&mock_manager_, false);
224 EXPECT_EQ(1, mock_delegate_.update_system_input_method_count());
225 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
226 EXPECT_EQ(input_method_id, mock_delegate_.system_input_method());
227 input_method_id = "xkb:us:colemak:eng";
228 mock_manager_.SetCurrentInputMethodId(input_method_id);
229 monitor_.InputMethodChanged(&mock_manager_, false);
230 EXPECT_EQ(2, mock_delegate_.update_system_input_method_count());
231 EXPECT_EQ(0, mock_delegate_.update_user_input_method_count());
232 EXPECT_EQ(input_method_id, mock_delegate_.system_input_method());
233 }
234
235 TEST_F(BrowserStateMonitorTest, TestUpdatePrefOnBrowserScreenDetails) {
236 monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
237 content::NotificationService::AllSources(),
238 content::NotificationService::NoDetails());
239 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
240 monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED,
241 content::NotificationService::AllSources(),
242 content::NotificationService::NoDetails());
243 EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.state());
244
245 const std::string input_method_id = "xkb:us:dvorak:eng";
246 mock_manager_.SetCurrentInputMethodId(input_method_id);
247 monitor_.InputMethodChanged(&mock_manager_, false);
248 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
249 EXPECT_EQ(1, mock_delegate_.update_user_input_method_count());
250 EXPECT_EQ(input_method_id, mock_delegate_.user_input_method());
251
252 monitor_.InputMethodChanged(&mock_manager_, false);
253 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
254 EXPECT_EQ(2, mock_delegate_.update_user_input_method_count());
255 EXPECT_EQ(input_method_id, mock_delegate_.user_input_method());
256
257 const std::string input_method_id_2 = "xkb:us:colemak:eng";
258 mock_manager_.SetCurrentInputMethodId(input_method_id_2);
259 monitor_.InputMethodChanged(&mock_manager_, false);
260 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
261 EXPECT_EQ(3, mock_delegate_.update_user_input_method_count());
262 EXPECT_EQ(input_method_id_2, mock_delegate_.user_input_method());
263
264 const std::string input_method_id_3 = "xkb:us::eng";
265 mock_manager_.SetCurrentInputMethodId(input_method_id_3);
266 monitor_.InputMethodChanged(&mock_manager_, false);
267 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
268 EXPECT_EQ(4, mock_delegate_.update_user_input_method_count());
269 EXPECT_EQ(input_method_id_3, mock_delegate_.user_input_method());
270
271 monitor_.InputMethodChanged(&mock_manager_, false);
272 EXPECT_EQ(0, mock_delegate_.update_system_input_method_count());
273 EXPECT_EQ(5, mock_delegate_.update_user_input_method_count());
274 EXPECT_EQ(input_method_id_3, mock_delegate_.user_input_method());
275 } 173 }
276 174
277 } // namespace input_method 175 } // namespace input_method
278 } // namespace chromeos 176 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698