OLD | NEW |
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 "chromeos/dbus/ibus/ibus_config_client.h" | 5 #include "chromeos/dbus/ibus/ibus_config_client.h" |
6 | 6 |
| 7 #include <vector> |
| 8 |
7 #include "base/bind.h" | 9 #include "base/bind.h" |
8 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
9 #include "base/values.h" | 11 #include "base/values.h" |
10 #include "chromeos/dbus/ibus/ibus_constants.h" | 12 #include "chromeos/dbus/ibus/ibus_constants.h" |
11 #include "dbus/message.h" | 13 #include "dbus/message.h" |
12 #include "dbus/mock_bus.h" | 14 #include "dbus/mock_bus.h" |
13 #include "dbus/mock_object_proxy.h" | 15 #include "dbus/mock_object_proxy.h" |
14 #include "dbus/object_path.h" | 16 #include "dbus/object_path.h" |
15 #include "dbus/values_util.h" | 17 #include "dbus/values_util.h" |
16 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
(...skipping 13 matching lines...) Expand all Loading... |
30 }; | 32 }; |
31 } // namespace | 33 } // namespace |
32 | 34 |
33 namespace chromeos { | 35 namespace chromeos { |
34 | 36 |
35 class MockErrorCallback { | 37 class MockErrorCallback { |
36 public: | 38 public: |
37 MOCK_METHOD0(Run, void()); | 39 MOCK_METHOD0(Run, void()); |
38 }; | 40 }; |
39 | 41 |
| 42 class MockOnIBusConfigReadyCallback { |
| 43 public: |
| 44 MOCK_METHOD0(Run, void()); |
| 45 }; |
| 46 |
40 // The base class of each type specified SetValue function handler. This class | 47 // The base class of each type specified SetValue function handler. This class |
41 // checks "section" and "key" field in SetValue message and callback success or | 48 // checks "section" and "key" field in SetValue message and callback success or |
42 // error callback based on given |success| flag. | 49 // error callback based on given |success| flag. |
43 class SetValueVerifierBase { | 50 class SetValueVerifierBase { |
44 public: | 51 public: |
45 SetValueVerifierBase(const std::string& expected_section, | 52 SetValueVerifierBase(const std::string& expected_section, |
46 const std::string& expected_key, | 53 const std::string& expected_key, |
47 HandlerBehavior behavior) | 54 HandlerBehavior behavior) |
48 : expected_section_(expected_section), | 55 : expected_section_(expected_section), |
49 expected_key_(expected_key), | 56 expected_key_(expected_key), |
50 behavior_(behavior) {} | 57 behavior_(behavior) {} |
51 | 58 |
| 59 virtual ~SetValueVerifierBase() {} |
| 60 |
52 // Handles SetValue method call. This function checks "section" and "key" | 61 // Handles SetValue method call. This function checks "section" and "key" |
53 // field. For the "value" field, subclass checks it with over riding | 62 // field. For the "value" field, subclass checks it with over riding |
54 // VeirfyVariant member function. | 63 // VeirfyVariant member function. |
55 void Run(dbus::MethodCall* method_call, | 64 void Run(dbus::MethodCall* method_call, |
56 int timeout_ms, | 65 int timeout_ms, |
57 const dbus::ObjectProxy::ResponseCallback& callback, | 66 const dbus::ObjectProxy::ResponseCallback& callback, |
58 const dbus::ObjectProxy::ErrorCallback& error_callback) { | 67 const dbus::ObjectProxy::ErrorCallback& error_callback) { |
59 dbus::MessageReader reader(method_call); | 68 dbus::MessageReader reader(method_call); |
60 std::string section; | 69 std::string section; |
61 std::string key; | 70 std::string key; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 } | 194 } |
186 EXPECT_FALSE(array_reader.HasMoreData()); | 195 EXPECT_FALSE(array_reader.HasMoreData()); |
187 } | 196 } |
188 | 197 |
189 private: | 198 private: |
190 const std::vector<std::string>& expected_value_; | 199 const std::vector<std::string>& expected_value_; |
191 | 200 |
192 DISALLOW_COPY_AND_ASSIGN(SetStringListValueHandler); | 201 DISALLOW_COPY_AND_ASSIGN(SetStringListValueHandler); |
193 }; | 202 }; |
194 | 203 |
| 204 // The class verifies GetNameOwner method call and emits response callback |
| 205 // asynchronouslly. |
| 206 class MockGetNameOwnerMethodCallHandler { |
| 207 public: |
| 208 MockGetNameOwnerMethodCallHandler() {} |
| 209 |
| 210 // Handles CallMethod function. |
| 211 void Run(dbus::MethodCall* method_call, |
| 212 int timeout_ms, |
| 213 const dbus::ObjectProxy::ResponseCallback& callback, |
| 214 const dbus::ObjectProxy::ErrorCallback& error_callback) { |
| 215 dbus::MessageReader reader(method_call); |
| 216 std::string target_name; |
| 217 EXPECT_TRUE(reader.PopString(&target_name)); |
| 218 EXPECT_EQ(ibus::config::kServiceName, target_name); |
| 219 EXPECT_FALSE(reader.HasMoreData()); |
| 220 |
| 221 callback_ = callback; |
| 222 } |
| 223 |
| 224 // Invokes reply with given |callback_| in Run method. |
| 225 void EmitReplyCallback(const std::string& owner) { |
| 226 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| 227 dbus::MessageWriter writer(response.get()); |
| 228 writer.AppendString(owner); |
| 229 callback_.Run(response.get()); |
| 230 } |
| 231 |
| 232 private: |
| 233 dbus::ObjectProxy::ResponseCallback callback_; |
| 234 |
| 235 DISALLOW_COPY_AND_ASSIGN(MockGetNameOwnerMethodCallHandler); |
| 236 }; |
| 237 |
| 238 |
| 239 // The class emulate GetNameOwner signal. |
| 240 class NameOwnerChangedHandler { |
| 241 public: |
| 242 NameOwnerChangedHandler() {} |
| 243 |
| 244 // OnConnectToSignal mock function. |
| 245 void OnConnectToSignal( |
| 246 const std::string& interface_name, |
| 247 const std::string& signal_name, |
| 248 const dbus::ObjectProxy::SignalCallback& signal_callback, |
| 249 const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) { |
| 250 callback_ = signal_callback; |
| 251 on_connected_callback.Run(interface_name, signal_name, true); |
| 252 } |
| 253 |
| 254 // Invokes reply with given |callback_| in Run method. |
| 255 void InvokeSignal(const std::string& name, |
| 256 const std::string& old_owner, |
| 257 const std::string& new_owner) { |
| 258 dbus::Signal signal(ibus::kDBusInterface, ibus::kGetNameOwnerMethod); |
| 259 dbus::MessageWriter writer(&signal); |
| 260 writer.AppendString(name); |
| 261 writer.AppendString(old_owner); |
| 262 writer.AppendString(new_owner); |
| 263 callback_.Run(&signal); |
| 264 } |
| 265 |
| 266 private: |
| 267 dbus::ObjectProxy::SignalCallback callback_; |
| 268 |
| 269 DISALLOW_COPY_AND_ASSIGN(NameOwnerChangedHandler); |
| 270 }; |
| 271 |
| 272 |
195 class IBusConfigClientTest : public testing::Test { | 273 class IBusConfigClientTest : public testing::Test { |
196 public: | 274 public: |
197 IBusConfigClientTest() {} | 275 IBusConfigClientTest() {} |
| 276 |
198 protected: | 277 protected: |
199 virtual void SetUp() OVERRIDE { | 278 virtual void SetUp() OVERRIDE { |
200 dbus::Bus::Options options; | 279 dbus::Bus::Options options; |
201 mock_bus_ = new dbus::MockBus(options); | 280 mock_bus_ = new dbus::MockBus(options); |
202 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), | 281 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), |
203 ibus::kServiceName, | 282 ibus::kServiceName, |
204 dbus::ObjectPath( | 283 dbus::ObjectPath( |
205 ibus::config::kServicePath)); | 284 ibus::config::kServicePath)); |
206 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, | |
207 dbus::ObjectPath( | |
208 ibus::config::kServicePath))) | |
209 .WillOnce(Return(mock_proxy_.get())); | |
210 | |
211 EXPECT_CALL(*mock_bus_, ShutdownAndBlock()); | 285 EXPECT_CALL(*mock_bus_, ShutdownAndBlock()); |
212 client_.reset(IBusConfigClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, | 286 client_.reset(IBusConfigClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, |
213 mock_bus_)); | 287 mock_bus_)); |
| 288 |
| 289 // Surpress uninteresting mock function call warning. |
| 290 EXPECT_CALL(*mock_bus_.get(), AssertOnOriginThread()) |
| 291 .WillRepeatedly(Return()); |
214 } | 292 } |
215 | 293 |
216 virtual void TearDown() OVERRIDE { | 294 virtual void TearDown() OVERRIDE { |
217 mock_bus_->ShutdownAndBlock(); | 295 mock_bus_->ShutdownAndBlock(); |
218 } | 296 } |
219 | 297 |
| 298 // Initialize |client_| by replying valid owner name synchronously. |
| 299 void InitializeSync() { |
| 300 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::config::kServiceName, |
| 301 dbus::ObjectPath( |
| 302 ibus::config::kServicePath))) |
| 303 .WillOnce(Return(mock_proxy_.get())); |
| 304 |
| 305 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy |
| 306 = new dbus::MockObjectProxy(mock_bus_.get(), |
| 307 ibus::kDBusServiceName, |
| 308 dbus::ObjectPath(ibus::kDBusObjectPath)); |
| 309 EXPECT_CALL(*mock_bus_, |
| 310 GetObjectProxy(ibus::kServiceName, |
| 311 dbus::ObjectPath(ibus::kDBusObjectPath))) |
| 312 .WillOnce(Return(mock_dbus_proxy.get())); |
| 313 |
| 314 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; |
| 315 EXPECT_CALL(*mock_dbus_proxy, CallMethodWithErrorCallback(_, _, _, _)) |
| 316 .WillOnce(Invoke(&mock_get_name_owner_method_call, |
| 317 &MockGetNameOwnerMethodCallHandler::Run)); |
| 318 NameOwnerChangedHandler handler; |
| 319 EXPECT_CALL(*mock_dbus_proxy, ConnectToSignal( |
| 320 ibus::kDBusInterface, |
| 321 ibus::kNameOwnerChangedSignal, |
| 322 _, |
| 323 _)).WillOnce(Invoke(&handler, |
| 324 &NameOwnerChangedHandler::OnConnectToSignal)); |
| 325 client_->InitializeAsync(base::Bind(&base::DoNothing)); |
| 326 mock_get_name_owner_method_call.EmitReplyCallback(":0.1"); |
| 327 } |
| 328 |
220 // The IBus config client to be tested. | 329 // The IBus config client to be tested. |
221 scoped_ptr<IBusConfigClient> client_; | 330 scoped_ptr<IBusConfigClient> client_; |
222 | 331 |
223 // A message loop to emulate asynchronous behavior. | 332 // A message loop to emulate asynchronous behavior. |
224 MessageLoop message_loop_; | 333 MessageLoop message_loop_; |
225 scoped_refptr<dbus::MockBus> mock_bus_; | 334 scoped_refptr<dbus::MockBus> mock_bus_; |
226 scoped_refptr<dbus::MockObjectProxy> mock_proxy_; | 335 scoped_refptr<dbus::MockObjectProxy> mock_proxy_; |
227 }; | 336 }; |
228 | 337 |
229 TEST_F(IBusConfigClientTest, SetStringValueTest) { | 338 TEST_F(IBusConfigClientTest, SetStringValueTest) { |
230 // Set expectations | 339 // Set expectations |
| 340 InitializeSync(); |
231 const char value[] = "value"; | 341 const char value[] = "value"; |
232 SetStringValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 342 SetStringValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
233 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 343 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
234 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 344 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
235 MockErrorCallback error_callback; | 345 MockErrorCallback error_callback; |
236 EXPECT_CALL(error_callback, Run()).Times(0); | 346 EXPECT_CALL(error_callback, Run()).Times(0); |
237 | 347 |
238 // Call SetStringValue. | 348 // Call SetStringValue. |
239 client_->SetStringValue(kKey, kSection, value, | 349 client_->SetStringValue(kKey, kSection, value, |
240 base::Bind(&MockErrorCallback::Run, | 350 base::Bind(&MockErrorCallback::Run, |
241 base::Unretained(&error_callback))); | 351 base::Unretained(&error_callback))); |
242 } | 352 } |
243 | 353 |
244 TEST_F(IBusConfigClientTest, SetStringValueTest_Fail) { | 354 TEST_F(IBusConfigClientTest, SetStringValueTest_Fail) { |
245 // Set expectations | 355 // Set expectations |
| 356 InitializeSync(); |
246 const char value[] = "value"; | 357 const char value[] = "value"; |
247 SetStringValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 358 SetStringValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
248 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 359 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
249 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 360 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
250 MockErrorCallback error_callback; | 361 MockErrorCallback error_callback; |
251 EXPECT_CALL(error_callback, Run()); | 362 EXPECT_CALL(error_callback, Run()); |
252 | 363 |
253 // Call SetStringValue. | 364 // Call SetStringValue. |
254 client_->SetStringValue(kKey, kSection, value, | 365 client_->SetStringValue(kKey, kSection, value, |
255 base::Bind(&MockErrorCallback::Run, | 366 base::Bind(&MockErrorCallback::Run, |
256 base::Unretained(&error_callback))); | 367 base::Unretained(&error_callback))); |
257 } | 368 } |
258 | 369 |
259 TEST_F(IBusConfigClientTest, SetIntValueTest) { | 370 TEST_F(IBusConfigClientTest, SetIntValueTest) { |
260 // Set expectations | 371 // Set expectations |
| 372 InitializeSync(); |
261 const int value = 1234; | 373 const int value = 1234; |
262 SetIntValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 374 SetIntValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
263 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 375 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
264 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 376 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
265 MockErrorCallback error_callback; | 377 MockErrorCallback error_callback; |
266 EXPECT_CALL(error_callback, Run()).Times(0); | 378 EXPECT_CALL(error_callback, Run()).Times(0); |
267 | 379 |
268 // Call SetIntValue. | 380 // Call SetIntValue. |
269 client_->SetIntValue(kKey, kSection, value, | 381 client_->SetIntValue(kKey, kSection, value, |
270 base::Bind(&MockErrorCallback::Run, | 382 base::Bind(&MockErrorCallback::Run, |
271 base::Unretained(&error_callback))); | 383 base::Unretained(&error_callback))); |
272 } | 384 } |
273 | 385 |
274 TEST_F(IBusConfigClientTest, SetIntValueTest_Fail) { | 386 TEST_F(IBusConfigClientTest, SetIntValueTest_Fail) { |
275 // Set expectations | 387 // Set expectations |
| 388 InitializeSync(); |
276 const int value = 1234; | 389 const int value = 1234; |
277 SetIntValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 390 SetIntValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
278 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 391 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
279 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 392 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
280 MockErrorCallback error_callback; | 393 MockErrorCallback error_callback; |
281 EXPECT_CALL(error_callback, Run()); | 394 EXPECT_CALL(error_callback, Run()); |
282 | 395 |
283 // Call SetIntValue. | 396 // Call SetIntValue. |
284 client_->SetIntValue(kKey, kSection, value, | 397 client_->SetIntValue(kKey, kSection, value, |
285 base::Bind(&MockErrorCallback::Run, | 398 base::Bind(&MockErrorCallback::Run, |
286 base::Unretained(&error_callback))); | 399 base::Unretained(&error_callback))); |
287 } | 400 } |
288 | 401 |
289 TEST_F(IBusConfigClientTest, SetBoolValueTest) { | 402 TEST_F(IBusConfigClientTest, SetBoolValueTest) { |
290 // Set expectations | 403 // Set expectations |
| 404 InitializeSync(); |
291 const bool value = true; | 405 const bool value = true; |
292 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 406 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
293 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 407 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
294 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 408 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
295 MockErrorCallback error_callback; | 409 MockErrorCallback error_callback; |
296 EXPECT_CALL(error_callback, Run()).Times(0); | 410 EXPECT_CALL(error_callback, Run()).Times(0); |
297 | 411 |
298 // Call SetBoolValue. | 412 // Call SetBoolValue. |
299 client_->SetBoolValue(kKey, kSection, value, | 413 client_->SetBoolValue(kKey, kSection, value, |
300 base::Bind(&MockErrorCallback::Run, | 414 base::Bind(&MockErrorCallback::Run, |
301 base::Unretained(&error_callback))); | 415 base::Unretained(&error_callback))); |
302 } | 416 } |
303 | 417 |
304 TEST_F(IBusConfigClientTest, SetBoolValueTest_Fail) { | 418 TEST_F(IBusConfigClientTest, SetBoolValueTest_Fail) { |
305 // Set expectations | 419 // Set expectations |
| 420 InitializeSync(); |
306 const bool value = true; | 421 const bool value = true; |
307 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 422 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
308 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 423 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
309 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 424 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
310 MockErrorCallback error_callback; | 425 MockErrorCallback error_callback; |
311 EXPECT_CALL(error_callback, Run()); | 426 EXPECT_CALL(error_callback, Run()); |
312 | 427 |
313 // Call SetBoolValue. | 428 // Call SetBoolValue. |
314 client_->SetBoolValue(kKey, kSection, value, | 429 client_->SetBoolValue(kKey, kSection, value, |
315 base::Bind(&MockErrorCallback::Run, | 430 base::Bind(&MockErrorCallback::Run, |
316 base::Unretained(&error_callback))); | 431 base::Unretained(&error_callback))); |
317 } | 432 } |
318 | 433 |
319 TEST_F(IBusConfigClientTest, SetStringListValueTest) { | 434 TEST_F(IBusConfigClientTest, SetStringListValueTest) { |
320 // Set expectations | 435 // Set expectations |
| 436 InitializeSync(); |
321 std::vector<std::string> value; | 437 std::vector<std::string> value; |
322 value.push_back("Sample value 1"); | 438 value.push_back("Sample value 1"); |
323 value.push_back("Sample value 2"); | 439 value.push_back("Sample value 2"); |
324 | 440 |
325 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 441 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
326 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 442 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
327 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 443 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
328 MockErrorCallback error_callback; | 444 MockErrorCallback error_callback; |
329 EXPECT_CALL(error_callback, Run()).Times(0); | 445 EXPECT_CALL(error_callback, Run()).Times(0); |
330 | 446 |
331 // Call SetStringListValue. | 447 // Call SetStringListValue. |
332 client_->SetStringListValue(kKey, kSection, value, | 448 client_->SetStringListValue(kKey, kSection, value, |
333 base::Bind(&MockErrorCallback::Run, | 449 base::Bind(&MockErrorCallback::Run, |
334 base::Unretained(&error_callback))); | 450 base::Unretained(&error_callback))); |
335 } | 451 } |
336 | 452 |
337 TEST_F(IBusConfigClientTest, SetStringListValueTest_Fail) { | 453 TEST_F(IBusConfigClientTest, SetStringListValueTest_Fail) { |
338 // Set expectations | 454 // Set expectations |
| 455 InitializeSync(); |
339 std::vector<std::string> value; | 456 std::vector<std::string> value; |
340 value.push_back("Sample value 1"); | 457 value.push_back("Sample value 1"); |
341 value.push_back("Sample value 2"); | 458 value.push_back("Sample value 2"); |
342 | 459 |
343 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 460 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
344 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 461 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
345 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 462 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
346 MockErrorCallback error_callback; | 463 MockErrorCallback error_callback; |
347 EXPECT_CALL(error_callback, Run()); | 464 EXPECT_CALL(error_callback, Run()); |
348 | 465 |
349 // Call SetStringListValue. | 466 // Call SetStringListValue. |
350 client_->SetStringListValue(kKey, kSection, value, | 467 client_->SetStringListValue(kKey, kSection, value, |
351 base::Bind(&MockErrorCallback::Run, | 468 base::Bind(&MockErrorCallback::Run, |
352 base::Unretained(&error_callback))); | 469 base::Unretained(&error_callback))); |
353 } | 470 } |
354 | 471 |
| 472 TEST_F(IBusConfigClientTest, IBusConfigDaemon_NotAvailableTest) { |
| 473 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; |
| 474 |
| 475 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, |
| 476 dbus::ObjectPath( |
| 477 ibus::config::kServicePath))) |
| 478 .Times(0); |
| 479 |
| 480 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy |
| 481 = new dbus::MockObjectProxy(mock_bus_.get(), |
| 482 ibus::kServiceName, |
| 483 dbus::ObjectPath(ibus::kDBusObjectPath)); |
| 484 EXPECT_CALL(*mock_bus_, |
| 485 GetObjectProxy(ibus::kServiceName, |
| 486 dbus::ObjectPath(ibus::kDBusObjectPath))) |
| 487 .WillOnce(Return(mock_dbus_proxy.get())); |
| 488 EXPECT_CALL(*mock_dbus_proxy, CallMethodWithErrorCallback(_, _, _, _)) |
| 489 .WillOnce(Invoke(&mock_get_name_owner_method_call, |
| 490 &MockGetNameOwnerMethodCallHandler::Run)); |
| 491 NameOwnerChangedHandler handler; |
| 492 EXPECT_CALL(*mock_dbus_proxy, ConnectToSignal( |
| 493 ibus::kDBusInterface, |
| 494 ibus::kNameOwnerChangedSignal, |
| 495 _, |
| 496 _)).WillOnce(Invoke(&handler, |
| 497 &NameOwnerChangedHandler::OnConnectToSignal)); |
| 498 client_->InitializeAsync(base::Bind(&base::DoNothing)); |
| 499 |
| 500 // Passing empty string means there is no owner, thus ibus-config daemon is |
| 501 // not ready. |
| 502 mock_get_name_owner_method_call.EmitReplyCallback(""); |
| 503 |
| 504 // Make sure not crashing by function call without initialize. |
| 505 const bool value = true; |
| 506 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)).Times(0); |
| 507 MockErrorCallback error_callback; |
| 508 EXPECT_CALL(error_callback, Run()).Times(0); |
| 509 client_->SetBoolValue(kKey, kSection, value, |
| 510 base::Bind(&MockErrorCallback::Run, |
| 511 base::Unretained(&error_callback))); |
| 512 } |
| 513 |
| 514 TEST_F(IBusConfigClientTest, IBusConfigDaemon_SlowInitializeTest) { |
| 515 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; |
| 516 |
| 517 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::config::kServiceName, |
| 518 dbus::ObjectPath( |
| 519 ibus::config::kServicePath))) |
| 520 .WillOnce(Return(mock_proxy_.get())); |
| 521 |
| 522 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy |
| 523 = new dbus::MockObjectProxy(mock_bus_.get(), |
| 524 ibus::kServiceName, |
| 525 dbus::ObjectPath(ibus::kDBusObjectPath)); |
| 526 EXPECT_CALL(*mock_bus_, |
| 527 GetObjectProxy(ibus::kServiceName, |
| 528 dbus::ObjectPath(ibus::kDBusObjectPath))) |
| 529 .WillOnce(Return(mock_dbus_proxy.get())); |
| 530 EXPECT_CALL(*mock_dbus_proxy, CallMethodWithErrorCallback(_, _, _, _)) |
| 531 .WillOnce(Invoke(&mock_get_name_owner_method_call, |
| 532 &MockGetNameOwnerMethodCallHandler::Run)); |
| 533 NameOwnerChangedHandler name_owner_changed_handler; |
| 534 EXPECT_CALL(*mock_dbus_proxy, ConnectToSignal( |
| 535 ibus::kDBusInterface, |
| 536 ibus::kNameOwnerChangedSignal, |
| 537 _, |
| 538 _)).WillOnce(Invoke(&name_owner_changed_handler, |
| 539 &NameOwnerChangedHandler::OnConnectToSignal)); |
| 540 client_->InitializeAsync(base::Bind(&base::DoNothing)); |
| 541 |
| 542 // Passing empty string means there is no owner, thus ibus-config daemon is |
| 543 // not ready. |
| 544 mock_get_name_owner_method_call.EmitReplyCallback(""); |
| 545 |
| 546 // Fire NameOwnerChanged signal to emulate ibus-config daemon was acquired |
| 547 // well-known name. |
| 548 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, |
| 549 "", |
| 550 ":0.1"); |
| 551 |
| 552 // Make sure it is possible to emit method calls. |
| 553 const bool value = true; |
| 554 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 555 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 556 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 557 MockErrorCallback error_callback; |
| 558 EXPECT_CALL(error_callback, Run()); |
| 559 |
| 560 // Call SetBoolValue. |
| 561 client_->SetBoolValue(kKey, kSection, value, |
| 562 base::Bind(&MockErrorCallback::Run, |
| 563 base::Unretained(&error_callback))); |
| 564 } |
| 565 |
| 566 TEST_F(IBusConfigClientTest, IBusConfigDaemon_ShutdownTest) { |
| 567 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; |
| 568 |
| 569 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::config::kServiceName, |
| 570 dbus::ObjectPath( |
| 571 ibus::config::kServicePath))) |
| 572 .WillRepeatedly(Return(mock_proxy_.get())); |
| 573 |
| 574 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy |
| 575 = new dbus::MockObjectProxy(mock_bus_.get(), |
| 576 ibus::kServiceName, |
| 577 dbus::ObjectPath(ibus::kDBusObjectPath)); |
| 578 EXPECT_CALL(*mock_bus_, |
| 579 GetObjectProxy(ibus::kServiceName, |
| 580 dbus::ObjectPath(ibus::kDBusObjectPath))) |
| 581 .WillOnce(Return(mock_dbus_proxy.get())); |
| 582 EXPECT_CALL(*mock_dbus_proxy, CallMethodWithErrorCallback(_, _, _, _)) |
| 583 .WillOnce(Invoke(&mock_get_name_owner_method_call, |
| 584 &MockGetNameOwnerMethodCallHandler::Run)); |
| 585 NameOwnerChangedHandler name_owner_changed_handler; |
| 586 EXPECT_CALL(*mock_dbus_proxy, ConnectToSignal( |
| 587 ibus::kDBusInterface, |
| 588 ibus::kNameOwnerChangedSignal, |
| 589 _, |
| 590 _)).WillOnce(Invoke(&name_owner_changed_handler, |
| 591 &NameOwnerChangedHandler::OnConnectToSignal)); |
| 592 client_->InitializeAsync(base::Bind(&base::DoNothing)); |
| 593 |
| 594 const bool value = true; |
| 595 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 596 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 597 .WillRepeatedly(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 598 MockErrorCallback error_callback; |
| 599 EXPECT_CALL(error_callback, Run()).WillRepeatedly(Return()); |
| 600 |
| 601 // Initialize succeeded sucessfully. |
| 602 mock_get_name_owner_method_call.EmitReplyCallback(":0.2"); |
| 603 |
| 604 // Call SetBoolValue. |
| 605 client_->SetBoolValue(kKey, kSection, value, |
| 606 base::Bind(&MockErrorCallback::Run, |
| 607 base::Unretained(&error_callback))); |
| 608 |
| 609 // Fire NameOwnerChanged signal to emulate shutting down the ibus-config |
| 610 // daemon. |
| 611 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, |
| 612 ":0.1", |
| 613 ""); |
| 614 |
| 615 // Make sure not crashing on emitting method call. |
| 616 client_->SetBoolValue(kKey, kSection, value, |
| 617 base::Bind(&MockErrorCallback::Run, |
| 618 base::Unretained(&error_callback))); |
| 619 |
| 620 // Fire NameOwnerChanged signal to emulate that ibus-daemon is revived. |
| 621 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, |
| 622 "", |
| 623 ":0.2"); |
| 624 |
| 625 // Make sure it is possible to emit method calls. |
| 626 client_->SetBoolValue(kKey, kSection, value, |
| 627 base::Bind(&MockErrorCallback::Run, |
| 628 base::Unretained(&error_callback))); |
| 629 } |
| 630 |
355 } // namespace chromeos | 631 } // namespace chromeos |
OLD | NEW |