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 3 // found in the LICENSE file. 4 5 #include "chromeos/dbus/ibus/ibus_input_context_client.h" 6 7 #include <map> 8 #include <string> 9 #include "base/message_loop/message_loop.h" 10 #include "chromeos/dbus/ibus/ibus_constants.h" 11 #include "chromeos/dbus/ibus/ibus_text.h" 12 #include "dbus/message.h" 13 #include "dbus/mock_bus.h" 14 #include "dbus/mock_object_proxy.h" 15 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 18 using ::testing::Invoke; 19 using ::testing::Return; 20 using ::testing::_; 21 22 namespace chromeos { 23 24 // TODO(nona): Remove after complete libibus removal. 25 using chromeos::IBusText; 26 27 namespace { 28 const char kObjectPath[] = "/org/freedesktop/IBus/InputContext_1010"; 29 30 // Following variables are used in callback expectations. 31 const uint32 kCapabilities = 12345; 32 const int32 kCursorX = 30; 33 const int32 kCursorY = 31; 34 const int32 kCursorWidth = 32; 35 const int32 kCursorHeight = 33; 36 const uint32 kKeyval = 34; 37 const uint32 kKeycode = 35; 38 const uint32 kState = 36; 39 const int32 kCompositionX = 37; 40 const int32 kCompositionY = 38; 41 const int32 kCompositionWidth = 39; 42 const int32 kCompositionHeight = 40; 43 const bool kIsKeyHandled = false; 44 const char kSurroundingText[] = "Surrounding Text"; 45 const uint32 kCursorPos = 2; 46 const uint32 kAnchorPos = 7; 47 const char kPropertyKey[] = "Property Key"; 48 const ibus::IBusPropertyState kPropertyState = 49 ibus::IBUS_PROPERTY_STATE_CHECKED; 50 51 class MockInputContextHandler : public IBusInputContextHandlerInterface { 52 public: 53 MOCK_METHOD1(CommitText, void(const IBusText& text)); 54 MOCK_METHOD3(ForwardKeyEvent, 55 void(uint32 keyval, uint32 keycode, uint32 state)); 56 MOCK_METHOD0(ShowPreeditText, void()); 57 MOCK_METHOD0(HidePreeditText, void()); 58 MOCK_METHOD3(UpdatePreeditText, 59 void(const IBusText& text, uint32 cursor_pos, bool visible)); 60 MOCK_METHOD2(DeleteSurroundingText, void(int32 offset, uint32 length)); 61 }; 62 63 class MockProcessKeyEventHandler { 64 public: 65 MOCK_METHOD1(Run, void(bool is_key_handled)); 66 }; 67 68 class MockProcessKeyEventErrorHandler { 69 public: 70 MOCK_METHOD0(Run, void()); 71 }; 72 73 MATCHER_P(IBusTextEq, expected_text, "The expected IBusText does not match") { 74 // TODO(nona): Check attributes. 75 return (arg.text() == expected_text->text()); 76 } 77 78 } // namespace 79 80 class IBusInputContextClientTest : public testing::Test { 81 public: 82 IBusInputContextClientTest() 83 : response_(NULL), 84 on_set_cursor_location_call_count_(0) {} 85 86 virtual void SetUp() OVERRIDE { 87 // Create a mock bus. 88 dbus::Bus::Options options; 89 options.bus_type = dbus::Bus::SYSTEM; 90 mock_bus_ = new dbus::MockBus(options); 91 92 // Create a mock proxy. 93 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), 94 ibus::kServiceName, 95 dbus::ObjectPath(kObjectPath)); 96 97 // Create a client. 98 client_.reset(IBusInputContextClient::Create( 99 REAL_DBUS_CLIENT_IMPLEMENTATION)); 100 101 // Set an expectation so mock_bus's GetObjectProxy() for the given service 102 // name and the object path will return mock_proxy_. The GetObjectProxy 103 // function is called in Initialized function. 104 EXPECT_CALL( 105 *mock_bus_.get(), 106 GetObjectProxy(ibus::kServiceName, dbus::ObjectPath(kObjectPath))) 107 .WillOnce(Return(mock_proxy_.get())); 108 109 // Set expectations so mock_proxy's ConnectToSignal will use 110 // OnConnectToSignal() to run the callback. The ConnectToSignal is called in 111 // Initialize function. 112 EXPECT_CALL(*mock_proxy_.get(), 113 ConnectToSignal(ibus::input_context::kServiceInterface, 114 ibus::input_context::kCommitTextSignal, 115 _, 116 _)) 117 .WillRepeatedly( 118 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 119 EXPECT_CALL(*mock_proxy_.get(), 120 ConnectToSignal(ibus::input_context::kServiceInterface, 121 ibus::input_context::kForwardKeyEventSignal, 122 _, 123 _)) 124 .WillRepeatedly( 125 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 126 EXPECT_CALL(*mock_proxy_.get(), 127 ConnectToSignal(ibus::input_context::kServiceInterface, 128 ibus::input_context::kHidePreeditTextSignal, 129 _, 130 _)) 131 .WillRepeatedly( 132 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 133 EXPECT_CALL(*mock_proxy_.get(), 134 ConnectToSignal(ibus::input_context::kServiceInterface, 135 ibus::input_context::kShowPreeditTextSignal, 136 _, 137 _)) 138 .WillRepeatedly( 139 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 140 EXPECT_CALL(*mock_proxy_.get(), 141 ConnectToSignal(ibus::input_context::kServiceInterface, 142 ibus::input_context::kUpdatePreeditTextSignal, 143 _, 144 _)) 145 .WillRepeatedly( 146 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 147 EXPECT_CALL( 148 *mock_proxy_.get(), 149 ConnectToSignal(ibus::input_context::kServiceInterface, 150 ibus::input_context::kDeleteSurroundingTextSignal, 151 _, 152 _)) 153 .WillRepeatedly( 154 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal)); 155 156 // Call Initialize to create object proxy and connect signals. 157 client_->Initialize(mock_bus_.get(), dbus::ObjectPath(kObjectPath)); 158 } 159 160 virtual void TearDown() OVERRIDE { 161 EXPECT_TRUE(client_->IsObjectProxyReady()); 162 client_->ResetObjectProxy(); 163 EXPECT_FALSE(client_->IsObjectProxyReady()); 164 } 165 166 // Handles FocusIn method call. 167 void OnFocusIn(dbus::MethodCall* method_call, 168 int timeout_ms, 169 const dbus::ObjectProxy::ResponseCallback& callback, 170 const dbus::ObjectProxy::ErrorCallback& error_callback) { 171 EXPECT_EQ(ibus::input_context::kServiceInterface, 172 method_call->GetInterface()); 173 EXPECT_EQ(ibus::input_context::kFocusInMethod, method_call->GetMember()); 174 dbus::MessageReader reader(method_call); 175 EXPECT_FALSE(reader.HasMoreData()); 176 177 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 178 } 179 180 // Handles FocusOut method call. 181 void OnFocusOut(dbus::MethodCall* method_call, 182 int timeout_ms, 183 const dbus::ObjectProxy::ResponseCallback& callback, 184 const dbus::ObjectProxy::ErrorCallback& error_callback) { 185 EXPECT_EQ(ibus::input_context::kServiceInterface, 186 method_call->GetInterface()); 187 EXPECT_EQ(ibus::input_context::kFocusOutMethod, method_call->GetMember()); 188 dbus::MessageReader reader(method_call); 189 EXPECT_FALSE(reader.HasMoreData()); 190 191 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 192 } 193 194 // Handles Reset method call. 195 void OnReset(dbus::MethodCall* method_call, 196 int timeout_ms, 197 const dbus::ObjectProxy::ResponseCallback& callback, 198 const dbus::ObjectProxy::ErrorCallback& error_callback) { 199 EXPECT_EQ(ibus::input_context::kServiceInterface, 200 method_call->GetInterface()); 201 EXPECT_EQ(ibus::input_context::kResetMethod, method_call->GetMember()); 202 dbus::MessageReader reader(method_call); 203 EXPECT_FALSE(reader.HasMoreData()); 204 205 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 206 } 207 208 // Handles SetCursorLocation method call. 209 void OnSetCursorLocation(const ibus::Rect& cursor_location, 210 const ibus::Rect& composition_head) { 211 ++on_set_cursor_location_call_count_; 212 } 213 214 // Handles SetCapabilities method call. 215 void OnSetCapabilities( 216 dbus::MethodCall* method_call, 217 int timeout_ms, 218 const dbus::ObjectProxy::ResponseCallback& callback, 219 const dbus::ObjectProxy::ErrorCallback& error_callback) { 220 EXPECT_EQ(ibus::input_context::kServiceInterface, 221 method_call->GetInterface()); 222 EXPECT_EQ(ibus::input_context::kSetCapabilitiesMethod, 223 method_call->GetMember()); 224 uint32 capabilities; 225 dbus::MessageReader reader(method_call); 226 EXPECT_TRUE(reader.PopUint32(&capabilities)); 227 EXPECT_EQ(kCapabilities, capabilities); 228 EXPECT_FALSE(reader.HasMoreData()); 229 230 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 231 } 232 233 // Handles ProcessKeyEvent method call. 234 void OnProcessKeyEvent( 235 dbus::MethodCall* method_call, 236 int timeout_ms, 237 const dbus::ObjectProxy::ResponseCallback& callback, 238 const dbus::ObjectProxy::ErrorCallback& error_callback) { 239 EXPECT_EQ(ibus::input_context::kServiceInterface, 240 method_call->GetInterface()); 241 EXPECT_EQ(ibus::input_context::kProcessKeyEventMethod, 242 method_call->GetMember()); 243 uint32 keyval, keycode, state; 244 dbus::MessageReader reader(method_call); 245 EXPECT_TRUE(reader.PopUint32(&keyval)); 246 EXPECT_TRUE(reader.PopUint32(&keycode)); 247 EXPECT_TRUE(reader.PopUint32(&state)); 248 EXPECT_FALSE(reader.HasMoreData()); 249 250 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 251 } 252 253 void OnProcessKeyEventFail( 254 dbus::MethodCall* method_call, 255 int timeout_ms, 256 const dbus::ObjectProxy::ResponseCallback& callback, 257 const dbus::ObjectProxy::ErrorCallback& error_callback) { 258 EXPECT_EQ(ibus::input_context::kServiceInterface, 259 method_call->GetInterface()); 260 EXPECT_EQ(ibus::input_context::kProcessKeyEventMethod, 261 method_call->GetMember()); 262 uint32 keyval, keycode, state; 263 dbus::MessageReader reader(method_call); 264 EXPECT_TRUE(reader.PopUint32(&keyval)); 265 EXPECT_TRUE(reader.PopUint32(&keycode)); 266 EXPECT_TRUE(reader.PopUint32(&state)); 267 EXPECT_FALSE(reader.HasMoreData()); 268 269 message_loop_.PostTask(FROM_HERE, base::Bind(error_callback, 270 error_response_)); 271 } 272 273 // Handles SetSurroudingText method call. 274 void OnSetSurroundingText( 275 dbus::MethodCall* method_call, 276 int timeout_ms, 277 const dbus::ObjectProxy::ResponseCallback& callback, 278 const dbus::ObjectProxy::ErrorCallback& error_callback) { 279 EXPECT_EQ(ibus::input_context::kServiceInterface, 280 method_call->GetInterface()); 281 EXPECT_EQ(ibus::input_context::kSetSurroundingTextMethod, 282 method_call->GetMember()); 283 dbus::MessageReader reader(method_call); 284 std::string text; 285 uint32 cursor_pos = 0; 286 uint32 anchor_pos = 0; 287 288 EXPECT_TRUE(PopStringFromIBusText(&reader, &text)); 289 EXPECT_TRUE(reader.PopUint32(&cursor_pos)); 290 EXPECT_TRUE(reader.PopUint32(&anchor_pos)); 291 EXPECT_FALSE(reader.HasMoreData()); 292 293 EXPECT_EQ(kSurroundingText, text); 294 EXPECT_EQ(kCursorPos, cursor_pos); 295 EXPECT_EQ(kAnchorPos, anchor_pos); 296 297 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 298 } 299 300 // Handles PropertyActivate method call. 301 void OnPropertyActivate( 302 dbus::MethodCall* method_call, 303 int timeout_ms, 304 const dbus::ObjectProxy::ResponseCallback& callback, 305 const dbus::ObjectProxy::ErrorCallback& error_callback) { 306 EXPECT_EQ(ibus::input_context::kServiceInterface, 307 method_call->GetInterface()); 308 EXPECT_EQ(ibus::input_context::kPropertyActivateMethod, 309 method_call->GetMember()); 310 dbus::MessageReader reader(method_call); 311 std::string key; 312 uint32 state = 0; 313 314 EXPECT_TRUE(reader.PopString(&key)); 315 EXPECT_TRUE(reader.PopUint32(&state)); 316 EXPECT_FALSE(reader.HasMoreData()); 317 318 EXPECT_EQ(kPropertyKey, key); 319 EXPECT_EQ(kPropertyState, static_cast<ibus::IBusPropertyState>(state)); 320 321 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 322 } 323 324 protected: 325 // The client to be tested. 326 scoped_ptr<IBusInputContextClient> client_; 327 // The mock bus. 328 scoped_refptr<dbus::MockBus> mock_bus_; 329 // The mock object proxy. 330 scoped_refptr<dbus::MockObjectProxy> mock_proxy_; 331 // Response returned by mock methods. 332 dbus::Response* response_; 333 dbus::ErrorResponse* error_response_; 334 // A message loop to emulate asynchronous behavior. 335 base::MessageLoop message_loop_; 336 // The map from signal to signal handler. 337 std::map<std::string, dbus::ObjectProxy::SignalCallback> signal_callback_map_; 338 // Call count of OnSetCursorLocation. 339 int on_set_cursor_location_call_count_; 340 341 private: 342 // Used to implement the mock proxy. 343 void OnConnectToSignal( 344 const std::string& interface_name, 345 const std::string& signal_name, 346 const dbus::ObjectProxy::SignalCallback& signal_callback, 347 const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) { 348 signal_callback_map_[signal_name] = signal_callback; 349 const bool success = true; 350 message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback, 351 interface_name, 352 signal_name, 353 success)); 354 } 355 }; 356 357 TEST_F(IBusInputContextClientTest, CommitTextHandler) { 358 const char kSampleText[] = "Sample Text"; 359 IBusText ibus_text; 360 ibus_text.set_text(kSampleText); 361 362 // Set handler expectations. 363 MockInputContextHandler mock_handler; 364 EXPECT_CALL(mock_handler, CommitText(IBusTextEq(&ibus_text))); 365 client_->SetInputContextHandler(&mock_handler); 366 message_loop_.RunUntilIdle(); 367 368 // Emit signal. 369 dbus::Signal signal(ibus::input_context::kServiceInterface, 370 ibus::input_context::kCommitTextSignal); 371 dbus::MessageWriter writer(&signal); 372 AppendIBusText(ibus_text, &writer); 373 ASSERT_FALSE( 374 signal_callback_map_[ibus::input_context::kCommitTextSignal].is_null()); 375 signal_callback_map_[ibus::input_context::kCommitTextSignal].Run(&signal); 376 377 // Unset the handler so expect not calling handler. 378 client_->SetInputContextHandler(NULL); 379 signal_callback_map_[ibus::input_context::kCommitTextSignal].Run(&signal); 380 } 381 382 TEST_F(IBusInputContextClientTest, ForwardKeyEventHandlerTest) { 383 // Set handler expectations. 384 MockInputContextHandler mock_handler; 385 EXPECT_CALL(mock_handler, ForwardKeyEvent(kKeyval, kKeycode, kState)); 386 client_->SetInputContextHandler(&mock_handler); 387 message_loop_.RunUntilIdle(); 388 389 // Emit signal. 390 dbus::Signal signal(ibus::input_context::kServiceInterface, 391 ibus::input_context::kForwardKeyEventSignal); 392 dbus::MessageWriter writer(&signal); 393 writer.AppendUint32(kKeyval); 394 writer.AppendUint32(kKeycode); 395 writer.AppendUint32(kState); 396 ASSERT_FALSE( 397 signal_callback_map_[ibus::input_context::kForwardKeyEventSignal] 398 .is_null()); 399 signal_callback_map_[ibus::input_context::kForwardKeyEventSignal].Run( 400 &signal); 401 402 // Unset the handler so expect not calling handler. 403 client_->SetInputContextHandler(NULL); 404 signal_callback_map_[ibus::input_context::kForwardKeyEventSignal].Run( 405 &signal); 406 } 407 408 TEST_F(IBusInputContextClientTest, HidePreeditTextHandlerTest) { 409 // Set handler expectations. 410 MockInputContextHandler mock_handler; 411 EXPECT_CALL(mock_handler, HidePreeditText()); 412 client_->SetInputContextHandler(&mock_handler); 413 message_loop_.RunUntilIdle(); 414 415 // Emit signal. 416 dbus::Signal signal(ibus::input_context::kServiceInterface, 417 ibus::input_context::kHidePreeditTextSignal); 418 ASSERT_FALSE( 419 signal_callback_map_[ibus::input_context::kHidePreeditTextSignal] 420 .is_null()); 421 signal_callback_map_[ibus::input_context::kHidePreeditTextSignal].Run( 422 &signal); 423 424 // Unset the handler so expect not calling handler. 425 client_->SetInputContextHandler(NULL); 426 signal_callback_map_[ibus::input_context::kHidePreeditTextSignal].Run( 427 &signal); 428 } 429 430 TEST_F(IBusInputContextClientTest, ShowPreeditTextHandlerTest) { 431 // Set handler expectations. 432 MockInputContextHandler mock_handler; 433 EXPECT_CALL(mock_handler, ShowPreeditText()); 434 client_->SetInputContextHandler(&mock_handler); 435 message_loop_.RunUntilIdle(); 436 437 // Emit signal. 438 dbus::Signal signal(ibus::input_context::kServiceInterface, 439 ibus::input_context::kShowPreeditTextSignal); 440 ASSERT_FALSE( 441 signal_callback_map_[ibus::input_context::kShowPreeditTextSignal] 442 .is_null()); 443 signal_callback_map_[ibus::input_context::kShowPreeditTextSignal].Run( 444 &signal); 445 446 // Unset the handler so expect not calling handler. 447 client_->SetInputContextHandler(NULL); 448 signal_callback_map_[ibus::input_context::kShowPreeditTextSignal].Run( 449 &signal); 450 } 451 452 TEST_F(IBusInputContextClientTest, UpdatePreeditTextHandlerTest) { 453 const uint32 kCursorPos = 20; 454 const bool kVisible = false; 455 const char kSampleText[] = "Sample Text"; 456 IBusText ibus_text; 457 ibus_text.set_text(kSampleText); 458 459 // Set handler expectations. 460 MockInputContextHandler mock_handler; 461 EXPECT_CALL(mock_handler, 462 UpdatePreeditText(IBusTextEq(&ibus_text), kCursorPos, kVisible)); 463 client_->SetInputContextHandler(&mock_handler); 464 message_loop_.RunUntilIdle(); 465 466 // Emit signal. 467 dbus::Signal signal(ibus::input_context::kServiceInterface, 468 ibus::input_context::kUpdatePreeditTextSignal); 469 dbus::MessageWriter writer(&signal); 470 AppendIBusText(ibus_text, &writer); 471 writer.AppendUint32(kCursorPos); 472 writer.AppendBool(kVisible); 473 ASSERT_FALSE( 474 signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal] 475 .is_null()); 476 signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal].Run( 477 &signal); 478 479 // Unset the handler so expect not calling handler. 480 client_->SetInputContextHandler(NULL); 481 signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal].Run( 482 &signal); 483 } 484 485 TEST_F(IBusInputContextClientTest, FocusInTest) { 486 // Set expectations. 487 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 488 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusIn)); 489 // Create response. 490 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 491 response_ = response.get(); 492 493 // Call FocusIn. 494 client_->FocusIn(); 495 // Run the message loop. 496 message_loop_.RunUntilIdle(); 497 } 498 499 TEST_F(IBusInputContextClientTest, FocusOutTest) { 500 // Set expectations. 501 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 502 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusOut)); 503 // Create response. 504 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 505 response_ = response.get(); 506 507 // Call FocusOut. 508 client_->FocusOut(); 509 // Run the message loop. 510 message_loop_.RunUntilIdle(); 511 } 512 513 TEST_F(IBusInputContextClientTest, ResetTest) { 514 // Set expectations. 515 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 516 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnReset)); 517 // Create response. 518 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 519 response_ = response.get(); 520 521 // Call Reset. 522 client_->Reset(); 523 // Run the message loop. 524 message_loop_.RunUntilIdle(); 525 } 526 527 TEST_F(IBusInputContextClientTest, SetCapabilitiesTest) { 528 // Set expectations. 529 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 530 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnSetCapabilities)); 531 // Create response. 532 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 533 response_ = response.get(); 534 535 // Call SetCapabilities. 536 client_->SetCapabilities(kCapabilities); 537 // Run the message loop. 538 message_loop_.RunUntilIdle(); 539 } 540 541 TEST_F(IBusInputContextClientTest, SetCursorLocationTest) { 542 on_set_cursor_location_call_count_ = 0; 543 client_->SetSetCursorLocationHandler( 544 base::Bind(&IBusInputContextClientTest::OnSetCursorLocation, 545 base::Unretained(this))); 546 const ibus::Rect cursor_location(kCursorX, 547 kCursorY, 548 kCursorWidth, 549 kCursorHeight); 550 const ibus::Rect composition_location(kCompositionX, 551 kCompositionY, 552 kCompositionWidth, 553 kCompositionHeight); 554 // Call SetCursorLocation. 555 client_->SetCursorLocation(cursor_location, composition_location); 556 557 EXPECT_EQ(1, on_set_cursor_location_call_count_); 558 client_->UnsetSetCursorLocationHandler(); 559 } 560 561 TEST_F(IBusInputContextClientTest, OnProcessKeyEvent) { 562 // Set expectations. 563 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 564 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnProcessKeyEvent)); 565 MockProcessKeyEventHandler callback; 566 MockProcessKeyEventErrorHandler error_callback; 567 568 EXPECT_CALL(callback, Run(kIsKeyHandled)); 569 EXPECT_CALL(error_callback, Run()).Times(0); 570 // Create response. 571 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 572 dbus::MessageWriter writer(response.get()); 573 writer.AppendBool(kIsKeyHandled); 574 response_ = response.get(); 575 576 // Call ProcessKeyEvent. 577 client_->ProcessKeyEvent(kKeyval, 578 kKeycode, 579 kState, 580 base::Bind(&MockProcessKeyEventHandler::Run, 581 base::Unretained(&callback)), 582 base::Bind(&MockProcessKeyEventErrorHandler::Run, 583 base::Unretained(&error_callback))); 584 // Run the message loop. 585 message_loop_.RunUntilIdle(); 586 } 587 588 TEST_F(IBusInputContextClientTest, OnProcessKeyEventFail) { 589 // Set expectations. 590 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 591 .WillOnce( 592 Invoke(this, &IBusInputContextClientTest::OnProcessKeyEventFail)); 593 MockProcessKeyEventHandler callback; 594 MockProcessKeyEventErrorHandler error_callback; 595 596 EXPECT_CALL(callback, Run(_)).Times(0); 597 EXPECT_CALL(error_callback, Run()); 598 // Create response. 599 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 600 dbus::MessageWriter writer(response.get()); 601 writer.AppendBool(kIsKeyHandled); 602 response_ = response.get(); 603 604 // Call ProcessKeyEvent. 605 client_->ProcessKeyEvent(kKeyval, 606 kKeycode, 607 kState, 608 base::Bind(&MockProcessKeyEventHandler::Run, 609 base::Unretained(&callback)), 610 base::Bind(&MockProcessKeyEventErrorHandler::Run, 611 base::Unretained(&error_callback))); 612 // Run the message loop. 613 message_loop_.RunUntilIdle(); 614 } 615 616 TEST_F(IBusInputContextClientTest, SetSurroundingTextTest) { 617 // Set expectations. 618 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 619 .WillOnce( 620 Invoke(this, &IBusInputContextClientTest::OnSetSurroundingText)); 621 // Create response. 622 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 623 response_ = response.get(); 624 625 // Call SetCursorLocation. 626 client_->SetSurroundingText(kSurroundingText, kCursorPos, kAnchorPos); 627 // Run the message loop. 628 message_loop_.RunUntilIdle(); 629 } 630 631 TEST_F(IBusInputContextClientTest, PropertyActivateTest) { 632 // Set expectations. 633 EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _)) 634 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnPropertyActivate)); 635 // Create response. 636 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 637 response_ = response.get(); 638 639 // Call SetCursorLocation. 640 client_->PropertyActivate(kPropertyKey, kPropertyState); 641 // Run the message loop. 642 message_loop_.RunUntilIdle(); 643 } 644 } // namespace chromeos 645