Chromium Code Reviews| 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 checkes "section" and "key" | 61 // Handles SetValue method call. This function checkes "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 dbus::MessageReader reader(method_call); | |
| 215 std::string target_name; | |
| 216 EXPECT_TRUE(reader.PopString(&target_name)); | |
| 217 EXPECT_EQ(ibus::config::kServiceName, target_name); | |
| 218 EXPECT_FALSE(reader.HasMoreData()); | |
| 219 | |
| 220 callback_ = callback; | |
| 221 } | |
| 222 | |
| 223 // Invokes reply with given |callback_| in Run method. | |
| 224 void EmitReplyCallback(const std::string& owner) { | |
| 225 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
| 226 dbus::MessageWriter writer(response.get()); | |
| 227 writer.AppendString(owner); | |
| 228 callback_.Run(response.get()); | |
| 229 } | |
| 230 | |
| 231 private: | |
| 232 dbus::ObjectProxy::ResponseCallback callback_; | |
| 233 | |
| 234 DISALLOW_COPY_AND_ASSIGN(MockGetNameOwnerMethodCallHandler); | |
| 235 }; | |
| 236 | |
| 237 | |
| 238 // The class emulate GetNameOwner signal. | |
| 239 class NameOwnerChangedHandler { | |
| 240 public: | |
| 241 NameOwnerChangedHandler() {} | |
| 242 | |
| 243 // SetNameOwnerChangedCallback mock function. | |
| 244 void SetNameOwnerChangedCallback( | |
| 245 dbus::ObjectProxy::SignalCallback callback) { | |
| 246 callback_ = callback; | |
| 247 } | |
| 248 | |
| 249 // Invokes reply with given |callback_| in Run method. | |
| 250 void InvokeSignal(const std::string& name, | |
| 251 const std::string& old_owner, | |
| 252 const std::string& new_owner) { | |
| 253 dbus::Signal signal(ibus::kDBusInterface, ibus::kGetNameOwnerMethod); | |
| 254 dbus::MessageWriter writer(&signal); | |
| 255 writer.AppendString(name); | |
| 256 writer.AppendString(old_owner); | |
| 257 writer.AppendString(new_owner); | |
| 258 callback_.Run(&signal); | |
| 259 } | |
| 260 | |
| 261 private: | |
| 262 dbus::ObjectProxy::SignalCallback callback_; | |
| 263 | |
| 264 DISALLOW_COPY_AND_ASSIGN(NameOwnerChangedHandler); | |
| 265 }; | |
| 266 | |
| 267 | |
| 195 class IBusConfigClientTest : public testing::Test { | 268 class IBusConfigClientTest : public testing::Test { |
| 196 public: | 269 public: |
| 197 IBusConfigClientTest() {} | 270 IBusConfigClientTest() {} |
| 271 | |
| 198 protected: | 272 protected: |
| 199 virtual void SetUp() OVERRIDE { | 273 virtual void SetUp() OVERRIDE { |
| 200 dbus::Bus::Options options; | 274 dbus::Bus::Options options; |
| 201 mock_bus_ = new dbus::MockBus(options); | 275 mock_bus_ = new dbus::MockBus(options); |
| 202 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), | 276 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), |
| 203 ibus::kServiceName, | 277 ibus::kServiceName, |
| 204 dbus::ObjectPath( | 278 dbus::ObjectPath( |
| 205 ibus::config::kServicePath)); | 279 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()); | 280 EXPECT_CALL(*mock_bus_, ShutdownAndBlock()); |
| 212 client_.reset(IBusConfigClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, | 281 client_.reset(IBusConfigClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, |
| 213 mock_bus_)); | 282 mock_bus_)); |
| 283 | |
| 284 // Surpress uninteresting mock function call warning. | |
| 285 EXPECT_CALL(*mock_bus_.get(), AssertOnOriginThread()) | |
| 286 .WillRepeatedly(Return()); | |
| 214 } | 287 } |
| 215 | 288 |
| 216 virtual void TearDown() OVERRIDE { | 289 virtual void TearDown() OVERRIDE { |
| 217 mock_bus_->ShutdownAndBlock(); | 290 mock_bus_->ShutdownAndBlock(); |
| 218 } | 291 } |
| 219 | 292 |
| 293 // Initialize |client_| with success configuration. | |
| 294 void SycnhronousInitialize() { | |
|
satorux1
2012/11/28 06:43:12
InitializeSync() ? Please also add some comment ex
Seigo Nonaka
2012/11/28 07:00:37
Done.
| |
| 295 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, | |
| 296 dbus::ObjectPath( | |
| 297 ibus::config::kServicePath))) | |
| 298 .WillOnce(Return(mock_proxy_.get())); | |
| 299 | |
| 300 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy | |
| 301 = new dbus::MockObjectProxy(mock_bus_.get(), | |
| 302 ibus::kServiceName, | |
| 303 dbus::ObjectPath(ibus::kDBusObjectPath)); | |
| 304 EXPECT_CALL(*mock_bus_, | |
| 305 GetObjectProxy(ibus::kServiceName, | |
| 306 dbus::ObjectPath(ibus::kDBusObjectPath))) | |
| 307 .WillOnce(Return(mock_dbus_proxy.get())); | |
| 308 | |
| 309 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; | |
| 310 EXPECT_CALL(*mock_dbus_proxy, CallMethod(_, _, _)) | |
| 311 .WillOnce(Invoke(&mock_get_name_owner_method_call, | |
| 312 &MockGetNameOwnerMethodCallHandler::Run)); | |
| 313 EXPECT_CALL(*mock_dbus_proxy, SetNameOwnerChangedCallback(_)); | |
| 314 client_->AsyncInitialize(base::Bind(&base::DoNothing)); | |
| 315 mock_get_name_owner_method_call.EmitReplyCallback(":0.1"); | |
| 316 } | |
| 317 | |
| 318 | |
| 220 // The IBus config client to be tested. | 319 // The IBus config client to be tested. |
| 221 scoped_ptr<IBusConfigClient> client_; | 320 scoped_ptr<IBusConfigClient> client_; |
| 222 | 321 |
| 223 // A message loop to emulate asynchronous behavior. | 322 // A message loop to emulate asynchronous behavior. |
| 224 MessageLoop message_loop_; | 323 MessageLoop message_loop_; |
| 225 scoped_refptr<dbus::MockBus> mock_bus_; | 324 scoped_refptr<dbus::MockBus> mock_bus_; |
| 226 scoped_refptr<dbus::MockObjectProxy> mock_proxy_; | 325 scoped_refptr<dbus::MockObjectProxy> mock_proxy_; |
| 227 }; | 326 }; |
| 228 | 327 |
| 229 TEST_F(IBusConfigClientTest, SetStringValueTest) { | 328 TEST_F(IBusConfigClientTest, SetStringValueTest) { |
| 230 // Set expectations | 329 // Set expectations |
| 330 SycnhronousInitialize(); | |
| 231 const char value[] = "value"; | 331 const char value[] = "value"; |
| 232 SetStringValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 332 SetStringValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
| 233 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 333 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 234 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 334 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 235 MockErrorCallback error_callback; | 335 MockErrorCallback error_callback; |
| 236 EXPECT_CALL(error_callback, Run()).Times(0); | 336 EXPECT_CALL(error_callback, Run()).Times(0); |
| 237 | 337 |
| 238 // Call SetStringValue. | 338 // Call SetStringValue. |
| 239 client_->SetStringValue(kKey, kSection, value, | 339 client_->SetStringValue(kKey, kSection, value, |
| 240 base::Bind(&MockErrorCallback::Run, | 340 base::Bind(&MockErrorCallback::Run, |
| 241 base::Unretained(&error_callback))); | 341 base::Unretained(&error_callback))); |
| 242 } | 342 } |
| 243 | 343 |
| 244 TEST_F(IBusConfigClientTest, SetStringValueTest_Fail) { | 344 TEST_F(IBusConfigClientTest, SetStringValueTest_Fail) { |
| 245 // Set expectations | 345 // Set expectations |
| 346 SycnhronousInitialize(); | |
| 246 const char value[] = "value"; | 347 const char value[] = "value"; |
| 247 SetStringValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 348 SetStringValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 248 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 349 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 249 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 350 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 250 MockErrorCallback error_callback; | 351 MockErrorCallback error_callback; |
| 251 EXPECT_CALL(error_callback, Run()); | 352 EXPECT_CALL(error_callback, Run()); |
| 252 | 353 |
| 253 // Call SetStringValue. | 354 // Call SetStringValue. |
| 254 client_->SetStringValue(kKey, kSection, value, | 355 client_->SetStringValue(kKey, kSection, value, |
| 255 base::Bind(&MockErrorCallback::Run, | 356 base::Bind(&MockErrorCallback::Run, |
| 256 base::Unretained(&error_callback))); | 357 base::Unretained(&error_callback))); |
| 257 } | 358 } |
| 258 | 359 |
| 259 TEST_F(IBusConfigClientTest, SetIntValueTest) { | 360 TEST_F(IBusConfigClientTest, SetIntValueTest) { |
| 260 // Set expectations | 361 // Set expectations |
| 362 SycnhronousInitialize(); | |
| 261 const int value = 1234; | 363 const int value = 1234; |
| 262 SetIntValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 364 SetIntValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
| 263 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 365 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 264 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 366 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 265 MockErrorCallback error_callback; | 367 MockErrorCallback error_callback; |
| 266 EXPECT_CALL(error_callback, Run()).Times(0); | 368 EXPECT_CALL(error_callback, Run()).Times(0); |
| 267 | 369 |
| 268 // Call SetIntValue. | 370 // Call SetIntValue. |
| 269 client_->SetIntValue(kKey, kSection, value, | 371 client_->SetIntValue(kKey, kSection, value, |
| 270 base::Bind(&MockErrorCallback::Run, | 372 base::Bind(&MockErrorCallback::Run, |
| 271 base::Unretained(&error_callback))); | 373 base::Unretained(&error_callback))); |
| 272 } | 374 } |
| 273 | 375 |
| 274 TEST_F(IBusConfigClientTest, SetIntValueTest_Fail) { | 376 TEST_F(IBusConfigClientTest, SetIntValueTest_Fail) { |
| 275 // Set expectations | 377 // Set expectations |
| 378 SycnhronousInitialize(); | |
| 276 const int value = 1234; | 379 const int value = 1234; |
| 277 SetIntValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 380 SetIntValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 278 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 381 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 279 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 382 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 280 MockErrorCallback error_callback; | 383 MockErrorCallback error_callback; |
| 281 EXPECT_CALL(error_callback, Run()); | 384 EXPECT_CALL(error_callback, Run()); |
| 282 | 385 |
| 283 // Call SetIntValue. | 386 // Call SetIntValue. |
| 284 client_->SetIntValue(kKey, kSection, value, | 387 client_->SetIntValue(kKey, kSection, value, |
| 285 base::Bind(&MockErrorCallback::Run, | 388 base::Bind(&MockErrorCallback::Run, |
| 286 base::Unretained(&error_callback))); | 389 base::Unretained(&error_callback))); |
| 287 } | 390 } |
| 288 | 391 |
| 289 TEST_F(IBusConfigClientTest, SetBoolValueTest) { | 392 TEST_F(IBusConfigClientTest, SetBoolValueTest) { |
| 290 // Set expectations | 393 // Set expectations |
| 394 SycnhronousInitialize(); | |
| 291 const bool value = true; | 395 const bool value = true; |
| 292 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 396 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
| 293 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 397 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 294 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 398 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 295 MockErrorCallback error_callback; | 399 MockErrorCallback error_callback; |
| 296 EXPECT_CALL(error_callback, Run()).Times(0); | 400 EXPECT_CALL(error_callback, Run()).Times(0); |
| 297 | 401 |
| 298 // Call SetBoolValue. | 402 // Call SetBoolValue. |
| 299 client_->SetBoolValue(kKey, kSection, value, | 403 client_->SetBoolValue(kKey, kSection, value, |
| 300 base::Bind(&MockErrorCallback::Run, | 404 base::Bind(&MockErrorCallback::Run, |
| 301 base::Unretained(&error_callback))); | 405 base::Unretained(&error_callback))); |
| 302 } | 406 } |
| 303 | 407 |
| 304 TEST_F(IBusConfigClientTest, SetBoolValueTest_Fail) { | 408 TEST_F(IBusConfigClientTest, SetBoolValueTest_Fail) { |
| 305 // Set expectations | 409 // Set expectations |
| 410 SycnhronousInitialize(); | |
| 306 const bool value = true; | 411 const bool value = true; |
| 307 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 412 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 308 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 413 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 309 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 414 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 310 MockErrorCallback error_callback; | 415 MockErrorCallback error_callback; |
| 311 EXPECT_CALL(error_callback, Run()); | 416 EXPECT_CALL(error_callback, Run()); |
| 312 | 417 |
| 313 // Call SetBoolValue. | 418 // Call SetBoolValue. |
| 314 client_->SetBoolValue(kKey, kSection, value, | 419 client_->SetBoolValue(kKey, kSection, value, |
| 315 base::Bind(&MockErrorCallback::Run, | 420 base::Bind(&MockErrorCallback::Run, |
| 316 base::Unretained(&error_callback))); | 421 base::Unretained(&error_callback))); |
| 317 } | 422 } |
| 318 | 423 |
| 319 TEST_F(IBusConfigClientTest, SetStringListValueTest) { | 424 TEST_F(IBusConfigClientTest, SetStringListValueTest) { |
| 320 // Set expectations | 425 // Set expectations |
| 426 SycnhronousInitialize(); | |
| 321 std::vector<std::string> value; | 427 std::vector<std::string> value; |
| 322 value.push_back("Sample value 1"); | 428 value.push_back("Sample value 1"); |
| 323 value.push_back("Sample value 2"); | 429 value.push_back("Sample value 2"); |
| 324 | 430 |
| 325 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); | 431 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_SUCCESS); |
| 326 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 432 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 327 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 433 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 328 MockErrorCallback error_callback; | 434 MockErrorCallback error_callback; |
| 329 EXPECT_CALL(error_callback, Run()).Times(0); | 435 EXPECT_CALL(error_callback, Run()).Times(0); |
| 330 | 436 |
| 331 // Call SetStringListValue. | 437 // Call SetStringListValue. |
| 332 client_->SetStringListValue(kKey, kSection, value, | 438 client_->SetStringListValue(kKey, kSection, value, |
| 333 base::Bind(&MockErrorCallback::Run, | 439 base::Bind(&MockErrorCallback::Run, |
| 334 base::Unretained(&error_callback))); | 440 base::Unretained(&error_callback))); |
| 335 } | 441 } |
| 336 | 442 |
| 337 TEST_F(IBusConfigClientTest, SetStringListValueTest_Fail) { | 443 TEST_F(IBusConfigClientTest, SetStringListValueTest_Fail) { |
| 338 // Set expectations | 444 // Set expectations |
| 445 SycnhronousInitialize(); | |
| 339 std::vector<std::string> value; | 446 std::vector<std::string> value; |
| 340 value.push_back("Sample value 1"); | 447 value.push_back("Sample value 1"); |
| 341 value.push_back("Sample value 2"); | 448 value.push_back("Sample value 2"); |
| 342 | 449 |
| 343 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | 450 SetStringListValueHandler handler(kSection, kKey, value, HANDLER_FAIL); |
| 344 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | 451 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) |
| 345 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | 452 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); |
| 346 MockErrorCallback error_callback; | 453 MockErrorCallback error_callback; |
| 347 EXPECT_CALL(error_callback, Run()); | 454 EXPECT_CALL(error_callback, Run()); |
| 348 | 455 |
| 349 // Call SetStringListValue. | 456 // Call SetStringListValue. |
| 350 client_->SetStringListValue(kKey, kSection, value, | 457 client_->SetStringListValue(kKey, kSection, value, |
| 351 base::Bind(&MockErrorCallback::Run, | 458 base::Bind(&MockErrorCallback::Run, |
| 352 base::Unretained(&error_callback))); | 459 base::Unretained(&error_callback))); |
| 353 } | 460 } |
| 354 | 461 |
| 462 TEST_F(IBusConfigClientTest, IBusConfigDaemon_NotAvailableTest) { | |
| 463 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; | |
| 464 | |
| 465 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, | |
| 466 dbus::ObjectPath( | |
| 467 ibus::config::kServicePath))) | |
| 468 .Times(0); | |
| 469 | |
| 470 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy | |
| 471 = new dbus::MockObjectProxy(mock_bus_.get(), | |
| 472 ibus::kServiceName, | |
| 473 dbus::ObjectPath(ibus::kDBusObjectPath)); | |
| 474 EXPECT_CALL(*mock_bus_, | |
| 475 GetObjectProxy(ibus::kServiceName, | |
| 476 dbus::ObjectPath(ibus::kDBusObjectPath))) | |
| 477 .WillOnce(Return(mock_dbus_proxy.get())); | |
| 478 EXPECT_CALL(*mock_dbus_proxy, CallMethod(_, _, _)) | |
| 479 .WillOnce(Invoke(&mock_get_name_owner_method_call, | |
| 480 &MockGetNameOwnerMethodCallHandler::Run)); | |
| 481 EXPECT_CALL(*mock_dbus_proxy, SetNameOwnerChangedCallback(_)); | |
| 482 client_->AsyncInitialize(base::Bind(&base::DoNothing)); | |
| 483 | |
| 484 // Passing empty string means there is no owner, thus ibus-config daemon is | |
| 485 // not ready. | |
| 486 mock_get_name_owner_method_call.EmitReplyCallback(""); | |
| 487 | |
| 488 // Make sure not crashing by function call without initialize. | |
| 489 const bool value = true; | |
| 490 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)).Times(0); | |
| 491 MockErrorCallback error_callback; | |
| 492 EXPECT_CALL(error_callback, Run()).Times(0); | |
| 493 client_->SetBoolValue(kKey, kSection, value, | |
| 494 base::Bind(&MockErrorCallback::Run, | |
| 495 base::Unretained(&error_callback))); | |
| 496 } | |
| 497 | |
| 498 TEST_F(IBusConfigClientTest, IBusConfigDaemon_SlowInitializeTest) { | |
| 499 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; | |
| 500 | |
| 501 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, | |
| 502 dbus::ObjectPath( | |
| 503 ibus::config::kServicePath))) | |
| 504 .WillOnce(Return(mock_proxy_.get())); | |
| 505 | |
| 506 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy | |
| 507 = new dbus::MockObjectProxy(mock_bus_.get(), | |
| 508 ibus::kServiceName, | |
| 509 dbus::ObjectPath(ibus::kDBusObjectPath)); | |
| 510 EXPECT_CALL(*mock_bus_, | |
| 511 GetObjectProxy(ibus::kServiceName, | |
| 512 dbus::ObjectPath(ibus::kDBusObjectPath))) | |
| 513 .WillOnce(Return(mock_dbus_proxy.get())); | |
| 514 EXPECT_CALL(*mock_dbus_proxy, CallMethod(_, _, _)) | |
| 515 .WillOnce(Invoke(&mock_get_name_owner_method_call, | |
| 516 &MockGetNameOwnerMethodCallHandler::Run)); | |
| 517 NameOwnerChangedHandler name_owner_changed_handler; | |
| 518 EXPECT_CALL(*mock_dbus_proxy, SetNameOwnerChangedCallback(_)) | |
| 519 .WillOnce(Invoke(&name_owner_changed_handler, | |
| 520 &NameOwnerChangedHandler::SetNameOwnerChangedCallback)); | |
| 521 | |
| 522 client_->AsyncInitialize(base::Bind(&base::DoNothing)); | |
| 523 | |
| 524 // Passing empty string means there is no owner, thus ibus-config daemon is | |
| 525 // not ready. | |
| 526 mock_get_name_owner_method_call.EmitReplyCallback(""); | |
| 527 | |
| 528 // Fire NameOwnerChanged signal to emulate ibus-config daemon was acquired | |
| 529 // well-known name. | |
| 530 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, | |
| 531 "", | |
| 532 ":0.1"); | |
| 533 | |
| 534 // Make sure it is possible to emit method calls. | |
| 535 const bool value = true; | |
| 536 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | |
| 537 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
| 538 .WillOnce(Invoke(&handler, &SetValueVerifierBase::Run)); | |
| 539 MockErrorCallback error_callback; | |
| 540 EXPECT_CALL(error_callback, Run()); | |
| 541 | |
| 542 // Call SetBoolValue. | |
| 543 client_->SetBoolValue(kKey, kSection, value, | |
| 544 base::Bind(&MockErrorCallback::Run, | |
| 545 base::Unretained(&error_callback))); | |
| 546 } | |
| 547 | |
| 548 TEST_F(IBusConfigClientTest, IBusConfigDaemon_ShutdownTest) { | |
| 549 MockGetNameOwnerMethodCallHandler mock_get_name_owner_method_call; | |
| 550 | |
| 551 EXPECT_CALL(*mock_bus_, GetObjectProxy(ibus::kServiceName, | |
| 552 dbus::ObjectPath( | |
| 553 ibus::config::kServicePath))) | |
| 554 .WillRepeatedly(Return(mock_proxy_.get())); | |
| 555 | |
| 556 scoped_refptr<dbus::MockObjectProxy> mock_dbus_proxy | |
| 557 = new dbus::MockObjectProxy(mock_bus_.get(), | |
| 558 ibus::kServiceName, | |
| 559 dbus::ObjectPath(ibus::kDBusObjectPath)); | |
| 560 EXPECT_CALL(*mock_bus_, | |
| 561 GetObjectProxy(ibus::kServiceName, | |
| 562 dbus::ObjectPath(ibus::kDBusObjectPath))) | |
| 563 .WillOnce(Return(mock_dbus_proxy.get())); | |
| 564 EXPECT_CALL(*mock_dbus_proxy, CallMethod(_, _, _)) | |
| 565 .WillOnce(Invoke(&mock_get_name_owner_method_call, | |
| 566 &MockGetNameOwnerMethodCallHandler::Run)); | |
| 567 NameOwnerChangedHandler name_owner_changed_handler; | |
| 568 EXPECT_CALL(*mock_dbus_proxy, SetNameOwnerChangedCallback(_)) | |
| 569 .WillOnce(Invoke(&name_owner_changed_handler, | |
| 570 &NameOwnerChangedHandler::SetNameOwnerChangedCallback)); | |
| 571 | |
| 572 client_->AsyncInitialize(base::Bind(&base::DoNothing)); | |
| 573 | |
| 574 const bool value = true; | |
| 575 SetBoolValueHandler handler(kSection, kKey, value, HANDLER_FAIL); | |
| 576 EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
| 577 .WillRepeatedly(Invoke(&handler, &SetValueVerifierBase::Run)); | |
| 578 MockErrorCallback error_callback; | |
| 579 EXPECT_CALL(error_callback, Run()).WillRepeatedly(Return()); | |
| 580 | |
| 581 // Initialize succeeded sucessfully. | |
| 582 mock_get_name_owner_method_call.EmitReplyCallback(":0.2"); | |
| 583 | |
| 584 // Call SetBoolValue. | |
| 585 client_->SetBoolValue(kKey, kSection, value, | |
| 586 base::Bind(&MockErrorCallback::Run, | |
| 587 base::Unretained(&error_callback))); | |
| 588 | |
| 589 // Fire NameOwnerChanged signal to emulate shutting down the ibus-config | |
| 590 // daemon. | |
| 591 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, | |
| 592 ":0.1", | |
| 593 ""); | |
| 594 | |
| 595 // Make sure not crashing on emitting method call. | |
| 596 client_->SetBoolValue(kKey, kSection, value, | |
| 597 base::Bind(&MockErrorCallback::Run, | |
| 598 base::Unretained(&error_callback))); | |
| 599 | |
| 600 // Fire NameOwnerChanged signal to emulate that ibus-daemon is revived. | |
| 601 name_owner_changed_handler.InvokeSignal(ibus::config::kServiceName, | |
| 602 "", | |
| 603 ":0.2"); | |
| 604 | |
| 605 // Make sure it is possible to emit method calls. | |
| 606 client_->SetBoolValue(kKey, kSection, value, | |
| 607 base::Bind(&MockErrorCallback::Run, | |
| 608 base::Unretained(&error_callback))); | |
| 609 } | |
| 610 | |
| 355 } // namespace chromeos | 611 } // namespace chromeos |
| OLD | NEW |