1 // Copyright (c) 2011 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/cros/cros_mock.h"
6
7 #include "base/memory/ref_counted.h"
8 #include "base/message_loop.h"
9 #include "base/time.h"
10 #include "chrome/browser/chromeos/cros/mock_cryptohome_library.h"
11 #include "chrome/browser/chromeos/cros/mock_input_method_library.h"
12 #include "chrome/browser/chromeos/cros/mock_library_loader.h"
13 #include "chrome/browser/chromeos/cros/mock_network_library.h"
14 #include "chrome/browser/chromeos/cros/mock_power_library.h"
15 #include "chrome/browser/chromeos/cros/mock_screen_lock_library.h"
16 #include "chrome/browser/chromeos/cros/mock_speech_synthesis_library.h"
17 #include "chrome/browser/chromeos/cros/mock_touchpad_library.h"
18 #include "chrome/browser/chromeos/input_method/input_method_util.h"
19 #include "chrome/browser/chromeos/login/wizard_controller.h"
20 #include "chrome/browser/chromeos/login/wizard_screen.h"
21 #include "chrome/test/in_process_browser_test.h"
22 #include "chrome/test/ui_test_utils.h"
23 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25
26 namespace chromeos {
27
28 using ::testing::AnyNumber;
29 using ::testing::AtMost;
30 using ::testing::InSequence;
31 using ::testing::InvokeWithoutArgs;
32 using ::testing::Return;
33 using ::testing::ReturnRef;
34 using ::testing::StrictMock;
35 using ::testing::_;
36
CrosMock()37 CrosMock::CrosMock()
38 : loader_(NULL),
39 mock_cryptohome_library_(NULL),
40 mock_input_method_library_(NULL),
41 mock_network_library_(NULL),
42 mock_power_library_(NULL),
43 mock_screen_lock_library_(NULL),
44 mock_speech_synthesis_library_(NULL),
45 mock_touchpad_library_(NULL),
46 current_input_method_("", "", "", ""),
47 previous_input_method_("", "", "", "") {
48 current_input_method_ =
49 input_method::GetFallbackInputMethodDescriptor();
50 }
51
~CrosMock()52 CrosMock::~CrosMock() {
53 }
54
test_api()55 chromeos::CrosLibrary::TestApi* CrosMock::test_api() {
56 return chromeos::CrosLibrary::Get()->GetTestApi();
57 }
58
InitStatusAreaMocks()59 void CrosMock::InitStatusAreaMocks() {
60 InitMockInputMethodLibrary();
61 InitMockNetworkLibrary();
62 InitMockPowerLibrary();
63 InitMockTouchpadLibrary();
64 }
65
InitMockLibraryLoader()66 void CrosMock::InitMockLibraryLoader() {
67 if (loader_)
68 return;
69 loader_ = new StrictMock<MockLibraryLoader>();
70 EXPECT_CALL(*loader_, Load(_))
71 .Times(AnyNumber())
72 .WillRepeatedly(Return(true));
73 test_api()->SetLibraryLoader(loader_, true);
74 }
75
InitMockCryptohomeLibrary()76 void CrosMock::InitMockCryptohomeLibrary() {
77 InitMockLibraryLoader();
78 if (mock_cryptohome_library_)
79 return;
80 mock_cryptohome_library_ = new StrictMock<MockCryptohomeLibrary>();
81 test_api()->SetCryptohomeLibrary(mock_cryptohome_library_, true);
82 }
83
InitMockInputMethodLibrary()84 void CrosMock::InitMockInputMethodLibrary() {
85 InitMockLibraryLoader();
86 if (mock_input_method_library_)
87 return;
88 mock_input_method_library_ = new StrictMock<MockInputMethodLibrary>();
89 test_api()->SetInputMethodLibrary(mock_input_method_library_, true);
90 }
91
InitMockNetworkLibrary()92 void CrosMock::InitMockNetworkLibrary() {
93 InitMockLibraryLoader();
94 if (mock_network_library_)
95 return;
96 mock_network_library_ = new StrictMock<MockNetworkLibrary>();
97 test_api()->SetNetworkLibrary(mock_network_library_, true);
98 }
99
InitMockPowerLibrary()100 void CrosMock::InitMockPowerLibrary() {
101 InitMockLibraryLoader();
102 if (mock_power_library_)
103 return;
104 mock_power_library_ = new StrictMock<MockPowerLibrary>();
105 test_api()->SetPowerLibrary(mock_power_library_, true);
106 }
107
InitMockScreenLockLibrary()108 void CrosMock::InitMockScreenLockLibrary() {
109 InitMockLibraryLoader();
110 if (mock_screen_lock_library_)
111 return;
112 mock_screen_lock_library_ = new StrictMock<MockScreenLockLibrary>();
113 test_api()->SetScreenLockLibrary(mock_screen_lock_library_, true);
114 }
115
InitMockSpeechSynthesisLibrary()116 void CrosMock::InitMockSpeechSynthesisLibrary() {
117 InitMockLibraryLoader();
118 if (mock_speech_synthesis_library_)
119 return;
120 mock_speech_synthesis_library_ =
121 new StrictMock<MockSpeechSynthesisLibrary>();
122 test_api()->SetSpeechSynthesisLibrary(mock_speech_synthesis_library_, true);
123 }
124
InitMockTouchpadLibrary()125 void CrosMock::InitMockTouchpadLibrary() {
126 InitMockLibraryLoader();
127 if (mock_touchpad_library_)
128 return;
129 mock_touchpad_library_ = new StrictMock<MockTouchpadLibrary>();
130 test_api()->SetTouchpadLibrary(mock_touchpad_library_, true);
131 }
132
133 // Initialization of mocks.
mock_cryptohome_library()134 MockCryptohomeLibrary* CrosMock::mock_cryptohome_library() {
135 return mock_cryptohome_library_;
136 }
137
mock_input_method_library()138 MockInputMethodLibrary* CrosMock::mock_input_method_library() {
139 return mock_input_method_library_;
140 }
141
mock_network_library()142 MockNetworkLibrary* CrosMock::mock_network_library() {
143 return mock_network_library_;
144 }
145
mock_power_library()146 MockPowerLibrary* CrosMock::mock_power_library() {
147 return mock_power_library_;
148 }
149
mock_screen_lock_library()150 MockScreenLockLibrary* CrosMock::mock_screen_lock_library() {
151 return mock_screen_lock_library_;
152 }
153
mock_speech_synthesis_library()154 MockSpeechSynthesisLibrary* CrosMock::mock_speech_synthesis_library() {
155 return mock_speech_synthesis_library_;
156 }
157
mock_touchpad_library()158 MockTouchpadLibrary* CrosMock::mock_touchpad_library() {
159 return mock_touchpad_library_;
160 }
161
SetStatusAreaMocksExpectations()162 void CrosMock::SetStatusAreaMocksExpectations() {
163 SetInputMethodLibraryStatusAreaExpectations();
164 SetNetworkLibraryStatusAreaExpectations();
165 SetPowerLibraryStatusAreaExpectations();
166 SetPowerLibraryExpectations();
167 SetTouchpadLibraryExpectations();
168 }
169
SetInputMethodLibraryStatusAreaExpectations()170 void CrosMock::SetInputMethodLibraryStatusAreaExpectations() {
171 EXPECT_CALL(*mock_input_method_library_, AddObserver(_))
172 .Times(AnyNumber())
173 .RetiresOnSaturation();
174 EXPECT_CALL(*mock_input_method_library_, GetActiveInputMethods())
175 .Times(AnyNumber())
176 .WillRepeatedly(InvokeWithoutArgs(CreateInputMethodDescriptors))
177 .RetiresOnSaturation();
178 EXPECT_CALL(*mock_input_method_library_, GetSupportedInputMethods())
179 .Times(AnyNumber())
180 .WillRepeatedly(InvokeWithoutArgs(CreateInputMethodDescriptors))
181 .RetiresOnSaturation();
182 EXPECT_CALL(*mock_input_method_library_, GetKeyboardOverlayId(_))
183 .Times(AnyNumber())
184 .WillRepeatedly((Return("en_US")))
185 .RetiresOnSaturation();
186 EXPECT_CALL(*mock_input_method_library_, current_input_method())
187 .Times(AnyNumber())
188 .WillRepeatedly((Return(current_input_method_)))
189 .RetiresOnSaturation();
190 EXPECT_CALL(*mock_input_method_library_, previous_input_method())
191 .Times(AnyNumber())
192 .WillRepeatedly((Return(previous_input_method_)))
193 .RetiresOnSaturation();
194 EXPECT_CALL(*mock_input_method_library_, current_ime_properties())
195 .Times(AnyNumber())
196 .WillRepeatedly((ReturnRef(ime_properties_)))
197 .RetiresOnSaturation();
198 EXPECT_CALL(*mock_input_method_library_, GetNumActiveInputMethods())
199 .Times(AnyNumber())
200 .WillRepeatedly((Return(1)))
201 .RetiresOnSaturation();
202 EXPECT_CALL(*mock_input_method_library_, SetImeConfig(_, _, _))
203 .Times(AnyNumber())
204 .WillRepeatedly((Return(true)))
205 .RetiresOnSaturation();
206 EXPECT_CALL(*mock_input_method_library_, RemoveObserver(_))
207 .Times(AnyNumber())
208 .RetiresOnSaturation();
209 EXPECT_CALL(*mock_input_method_library_, SetDeferImeStartup(_))
210 .Times(AnyNumber())
211 .RetiresOnSaturation();
212 EXPECT_CALL(*mock_input_method_library_, StopInputMethodDaemon())
213 .Times(AnyNumber())
214 .RetiresOnSaturation();
215 EXPECT_CALL(*mock_input_method_library_, ChangeInputMethod(_))
216 .Times(AnyNumber())
217 .RetiresOnSaturation();
218 }
219
SetNetworkLibraryStatusAreaExpectations()220 void CrosMock::SetNetworkLibraryStatusAreaExpectations() {
221 // We don't care how often these are called, just set their return values:
222 EXPECT_CALL(*mock_network_library_, AddNetworkManagerObserver(_))
223 .Times(AnyNumber());
224 EXPECT_CALL(*mock_network_library_, AddNetworkDeviceObserver(_, _))
225 .Times(AnyNumber());
226 EXPECT_CALL(*mock_network_library_, AddCellularDataPlanObserver(_))
227 .Times(AnyNumber());
228 EXPECT_CALL(*mock_network_library_, RemoveNetworkManagerObserver(_))
229 .Times(AnyNumber());
230 EXPECT_CALL(*mock_network_library_, RemoveNetworkDeviceObserver(_, _))
231 .Times(AnyNumber());
232 EXPECT_CALL(*mock_network_library_, RemoveObserverForAllNetworks(_))
233 .Times(AnyNumber());
234 EXPECT_CALL(*mock_network_library_, RemoveCellularDataPlanObserver(_))
235 .Times(AnyNumber());
236 EXPECT_CALL(*mock_network_library_, IsLocked())
237 .Times(AnyNumber())
238 .WillRepeatedly((Return(false)));
239 EXPECT_CALL(*mock_network_library_, FindCellularDevice())
240 .Times(AnyNumber())
241 .WillRepeatedly((Return((const NetworkDevice*)(NULL))));
242 EXPECT_CALL(*mock_network_library_, ethernet_available())
243 .Times(AnyNumber())
244 .WillRepeatedly((Return(true)));
245 EXPECT_CALL(*mock_network_library_, wifi_available())
246 .Times(AnyNumber())
247 .WillRepeatedly((Return(false)));
248 EXPECT_CALL(*mock_network_library_, cellular_available())
249 .Times(AnyNumber())
250 .WillRepeatedly((Return(false)));
251 EXPECT_CALL(*mock_network_library_, ethernet_enabled())
252 .Times(AnyNumber())
253 .WillRepeatedly((Return(true)));
254 EXPECT_CALL(*mock_network_library_, wifi_enabled())
255 .Times(AnyNumber())
256 .WillRepeatedly((Return(false)));
257 EXPECT_CALL(*mock_network_library_, cellular_enabled())
258 .Times(AnyNumber())
259 .WillRepeatedly((Return(false)));
260 EXPECT_CALL(*mock_network_library_, active_network())
261 .Times(AnyNumber())
262 .WillRepeatedly((Return((const Network*)(NULL))));
263 EXPECT_CALL(*mock_network_library_, wifi_network())
264 .Times(AnyNumber())
265 .WillRepeatedly((Return((const WifiNetwork*)(NULL))));
266 EXPECT_CALL(*mock_network_library_, cellular_network())
267 .Times(AnyNumber())
268 .WillRepeatedly((Return((const CellularNetwork*)(NULL))));
269 EXPECT_CALL(*mock_network_library_, virtual_network())
270 .Times(AnyNumber())
271 .WillRepeatedly((Return((const VirtualNetwork*)(NULL))));
272 EXPECT_CALL(*mock_network_library_, wifi_networks())
273 .Times(AnyNumber())
274 .WillRepeatedly((ReturnRef(wifi_networks_)));
275 EXPECT_CALL(*mock_network_library_, cellular_networks())
276 .Times(AnyNumber())
277 .WillRepeatedly((ReturnRef(cellular_networks_)));
278 EXPECT_CALL(*mock_network_library_, virtual_networks())
279 .Times(AnyNumber())
280 .WillRepeatedly((ReturnRef(virtual_networks_)));
281
282 // Set specific expectations for interesting functions:
283
284 // NetworkMenuButton::OnNetworkChanged() calls:
285 EXPECT_CALL(*mock_network_library_, Connected())
286 .Times(AnyNumber())
287 .WillRepeatedly((Return(false)))
288 .RetiresOnSaturation();
289 EXPECT_CALL(*mock_network_library_, Connecting())
290 .Times(AnyNumber())
291 .WillRepeatedly((Return(false)))
292 .RetiresOnSaturation();
293 EXPECT_CALL(*mock_network_library_, cellular_connected())
294 .Times(AnyNumber())
295 .WillRepeatedly((Return(false)))
296 .RetiresOnSaturation();
297
298 // NetworkMenu::InitMenuItems() calls:
299 EXPECT_CALL(*mock_network_library_, IsLocked())
300 .Times(AnyNumber())
301 .WillRepeatedly((Return(false)))
302 .RetiresOnSaturation();
303 EXPECT_CALL(*mock_network_library_, ethernet_connected())
304 .Times(1)
305 .WillRepeatedly((Return(false)))
306 .RetiresOnSaturation();
307 EXPECT_CALL(*mock_network_library_, ethernet_connecting())
308 .Times(1)
309 .WillRepeatedly((Return(false)))
310 .RetiresOnSaturation();
311 }
312
SetPowerLibraryStatusAreaExpectations()313 void CrosMock::SetPowerLibraryStatusAreaExpectations() {
314 EXPECT_CALL(*mock_power_library_, AddObserver(_))
315 .Times(2)
316 .RetiresOnSaturation();
317 EXPECT_CALL(*mock_power_library_, battery_fully_charged())
318 .Times(1)
319 .WillRepeatedly((Return(false)))
320 .RetiresOnSaturation();
321 EXPECT_CALL(*mock_power_library_, battery_is_present())
322 .Times(1)
323 .WillOnce((Return(true)))
324 .RetiresOnSaturation();
325 EXPECT_CALL(*mock_power_library_, battery_percentage())
326 .Times(1)
327 .WillRepeatedly((Return(42.0)))
328 .RetiresOnSaturation();
329 EXPECT_CALL(*mock_power_library_, line_power_on())
330 .Times(1)
331 .WillRepeatedly((Return(false)))
332 .RetiresOnSaturation();
333 EXPECT_CALL(*mock_power_library_, battery_time_to_empty())
334 .Times(1)
335 .WillRepeatedly((Return(base::TimeDelta::FromMinutes(42))))
336 .RetiresOnSaturation();
337 EXPECT_CALL(*mock_power_library_, battery_time_to_full())
338 .Times(1)
339 .WillRepeatedly((Return(base::TimeDelta::FromMinutes(24))))
340 .RetiresOnSaturation();
341 EXPECT_CALL(*mock_power_library_, RemoveObserver(_))
342 .Times(2)
343 .RetiresOnSaturation();
344 }
345
SetPowerLibraryExpectations()346 void CrosMock::SetPowerLibraryExpectations() {
347 // EnableScreenLock is currently bounded with a prefs value and thus is
348 // always called when loading
349 EXPECT_CALL(*mock_power_library_, EnableScreenLock(_))
350 .Times(AnyNumber());
351 }
352
SetSpeechSynthesisLibraryExpectations()353 void CrosMock::SetSpeechSynthesisLibraryExpectations() {
354 InSequence s;
355 EXPECT_CALL(*mock_speech_synthesis_library_, StopSpeaking())
356 .WillOnce(Return(true))
357 .RetiresOnSaturation();
358 EXPECT_CALL(*mock_speech_synthesis_library_, Speak(_))
359 .WillOnce(Return(true))
360 .RetiresOnSaturation();
361 EXPECT_CALL(*mock_speech_synthesis_library_, IsSpeaking())
362 .Times(AnyNumber())
363 .WillRepeatedly(Return(true));
364 EXPECT_CALL(*mock_speech_synthesis_library_, StopSpeaking())
365 .WillOnce(Return(true))
366 .RetiresOnSaturation();
367 EXPECT_CALL(*mock_speech_synthesis_library_, Speak(_))
368 .WillOnce(Return(true))
369 .RetiresOnSaturation();
370 EXPECT_CALL(*mock_speech_synthesis_library_, IsSpeaking())
371 .WillOnce(Return(true))
372 .WillOnce(Return(true))
373 .WillOnce(Return(false))
374 .RetiresOnSaturation();
375 }
376
SetTouchpadLibraryExpectations()377 void CrosMock::SetTouchpadLibraryExpectations() {
378 EXPECT_CALL(*mock_touchpad_library_, SetSensitivity(_))
379 .Times(AnyNumber());
380 EXPECT_CALL(*mock_touchpad_library_, SetTapToClick(_))
381 .Times(AnyNumber());
382 }
383
TearDownMocks()384 void CrosMock::TearDownMocks() {
385 // Prevent bogus gMock leak check from firing.
386 if (loader_)
387 test_api()->SetLibraryLoader(NULL, false);
388 if (mock_cryptohome_library_)
389 test_api()->SetCryptohomeLibrary(NULL, false);
390 if (mock_input_method_library_)
391 test_api()->SetInputMethodLibrary(NULL, false);
392 if (mock_network_library_)
393 test_api()->SetNetworkLibrary(NULL, false);
394 if (mock_power_library_)
395 test_api()->SetPowerLibrary(NULL, false);
396 if (mock_screen_lock_library_)
397 test_api()->SetScreenLockLibrary(NULL, false);
398 if (mock_speech_synthesis_library_)
399 test_api()->SetSpeechSynthesisLibrary(NULL, false);
400 if (mock_touchpad_library_)
401 test_api()->SetTouchpadLibrary(NULL, false);
402 }
403
CreateInputMethodDescriptors()404 InputMethodDescriptors* CrosMock::CreateInputMethodDescriptors() {
405 InputMethodDescriptors* descriptors = new InputMethodDescriptors;
406 descriptors->push_back(
407 input_method::GetFallbackInputMethodDescriptor());
408 return descriptors;
409 }
410
411 } // namespace chromeos
412