15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_object_proxy.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/values_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientName[] = "chrome";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEngineName[] = "engine";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kRestartFlag = true;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCreateInputContextCallback {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Run, void(const dbus::ObjectPath& object_path));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockErrorCallback {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Run, void());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IBusClientTest : public testing::Test {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBusClientTest() : response_(NULL) {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles CreateInputContext method call.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateInputContext(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string client_name;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&client_name));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kClientName, client_name);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles fail case of CreateInputContext method call.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateInputContextFail(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string client_name;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&client_name));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kClientName, client_name);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(error_callback,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 error_response_));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles SetGlobalEngine method call.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetGlobalEngine(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string engine_name;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&engine_name));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEngineName, engine_name);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles fail case of SetGlobalEngine method call.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetGlobalEngineFail(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string engine_name;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&engine_name));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEngineName, engine_name);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(error_callback,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 error_response_));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles Exit method call.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExit(dbus::MethodCall* method_call,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              int timeout_ms,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const dbus::ObjectProxy::ResponseCallback& callback,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const dbus::ObjectProxy::ErrorCallback& error_callback) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restart = false;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopBool(&restart));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kRestartFlag, restart);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles fail case of Exit method call.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExitFail(dbus::MethodCall* method_call,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int timeout_ms,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const dbus::ObjectProxy::ResponseCallback& callback,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const dbus::ObjectProxy::ErrorCallback& error_callback) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restart = false;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopBool(&restart));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kRestartFlag, restart);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(error_callback,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 error_response_));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::Bus::Options options;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_bus_ = new dbus::MockBus(options);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(),
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ibus::kServiceName,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            dbus::ObjectPath(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                ibus::bus::kServicePath));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_bus_.get(),
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                GetObjectProxy(ibus::kServiceName,
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               dbus::ObjectPath(ibus::bus::kServicePath)))
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_proxy_.get()));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock());
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    client_.reset(
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        IBusClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, mock_bus_.get()));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_bus_->ShutdownAndBlock();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The IBus client to be tested.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IBusClient> client_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A message loop to emulate asynchronous behavior.
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop message_loop_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockBus> mock_bus_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Response returned by mock methods.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* response_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::ErrorResponse* error_response_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, CreateInputContextTest) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const dbus::ObjectPath kInputContextObjectPath =
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::ObjectPath("/some/object/path");
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCreateInputContextCallback callback;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(kInputContextObjectPath));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run()).Times(0);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(response.get());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendObjectPath(kInputContextObjectPath);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->CreateInputContext(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClientName,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockCreateInputContextCallback::Run,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, CreateInputContext_NullResponseFail) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCreateInputContextCallback callback;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(_)).Times(0);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set NULL response.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = NULL;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->CreateInputContext(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClientName,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockCreateInputContextCallback::Run,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, CreateInputContext_InvalidResponseFail) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCreateInputContextCallback callback;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(_)).Times(0);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create invalid(empty) response.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->CreateInputContext(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClientName,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockCreateInputContextCallback::Run,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, CreateInputContext_MethodCallFail) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContextFail));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCreateInputContextCallback callback;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(_)).Times(0);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in CreateInputContext.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->CreateInputContext(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClientName,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockCreateInputContextCallback::Run,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, SetGlobalEngineTest) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngine));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run()).Times(0);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create empty response.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->SetGlobalEngine(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kEngineName,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, SetGlobalEngineTest_InvalidResponse) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngineFail));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set invalid response.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = NULL;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->SetGlobalEngine(
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kEngineName,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, SetGlobalEngineTest_MethodCallFail) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngineFail));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create empty response.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->SetGlobalEngine(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kEngineName,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, ExitTest) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnExit));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run()).Times(0);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create empty response.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->Exit(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IBusClient::RESTART_IBUS_DAEMON,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, ExitTest_InvalidResponse) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnExit));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set invalid response.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = NULL;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->Exit(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IBusClient::RESTART_IBUS_DAEMON,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusClientTest, ExitTest_MethodCallFail) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusClientTest::OnExitFail));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockErrorCallback error_callback;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create empty response.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error response is not used in SetGLobalEngine.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_response_ = NULL;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CreateInputContext.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->Exit(
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IBusClient::RESTART_IBUS_DAEMON,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockErrorCallback::Run,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&error_callback)));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
412