| 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 |