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