Home | History | Annotate | Download | only in ibus
      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