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 "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_exported_object.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "dbus/mock_object_proxy.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "dbus/scoped_dbus_error.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Unused; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace dbus { 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTest : public testing::Test { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTest() { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a mock bus. 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Bus::Options options; 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.bus_type = Bus::SYSTEM; 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) mock_bus_ = new MockBus(options); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a mock proxy. 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) mock_proxy_ = new MockObjectProxy( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_bus_.get(), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "org.chromium.TestService", 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/TestObject")); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an expectation so mock_proxy's CallMethodAndBlock() will use 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateMockProxyResponse() to return responses. 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), MockCallMethodAndBlock(_, _)) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, &MockTest::CreateMockProxyResponse)); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*mock_proxy_.get(), 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockCallMethodAndBlockWithErrorDetails(_, _, _)) 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly( 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Invoke(this, &MockTest::CreateMockProxyResponseWithErrorDetails)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an expectation so mock_proxy's CallMethod() will use 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HandleMockProxyResponseWithMessageLoop() to return responses. 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _)).WillRepeatedly( 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Invoke(this, &MockTest::HandleMockProxyResponseWithMessageLoop)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an expectation so mock_bus's GetObjectProxy() for the given 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // service name and the object path will return mock_proxy_. 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetObjectProxy("org.chromium.TestService", 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/TestObject"))) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(mock_proxy_.get())); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ShutdownAndBlock() will be called in TearDown(). 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_bus_->ShutdownAndBlock(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the response is received. 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnResponse(Response* response) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |response| will be deleted on exit of the function. Copy the 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // payload to |response_string_|. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (response) { 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageReader reader(response); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(reader.PopString(&response_string_)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Quit(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string response_string_; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::RunLoop> run_loop_; 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_refptr<MockBus> mock_bus_; 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_refptr<MockObjectProxy> mock_proxy_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a response for the given method call. Used to implement 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CallMethodAndBlock() for |mock_proxy_|. 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Response* CreateMockProxyResponse(MethodCall* method_call, 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int timeout_ms) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (method_call->GetInterface() == "org.chromium.TestInterface" && 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_call->GetMember() == "Echo") { 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageReader reader(method_call); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string text_message; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader.PopString(&text_message)) { 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<Response> response = Response::CreateEmpty(); 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageWriter writer(response.get()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(text_message); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return response.release(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Response* CreateMockProxyResponseWithErrorDetails( 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MethodCall* method_call, int timeout_ms, ScopedDBusError* error) { 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dbus_set_error(error->get(), DBUS_ERROR_NOT_SUPPORTED, "Not implemented"); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a response and runs the given response callback in the 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop with the response. Used to implement for |mock_proxy_|. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleMockProxyResponseWithMessageLoop( 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodCall* method_call, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy::ResponseCallback response_callback) { 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Response* response = CreateMockProxyResponse(method_call, timeout_ms); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockTest::RunResponseCallback, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_callback, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the given response callback with the given response. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunResponseCallback( 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy::ResponseCallback response_callback, 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Response* response) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_callback.Run(response); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete response; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This test demonstrates how to mock a synchronous method call using the 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mock classes. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MockTest, CallMethodAndBlock) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kHello[] = "Hello"; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get an object proxy from the mock bus. 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy* proxy = mock_bus_->GetObjectProxy( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "org.chromium.TestService", 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/TestObject")); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a method call. 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodCall method_call("org.chromium.TestInterface", "Echo"); 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageWriter writer(&method_call); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(kHello); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call the method. 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<Response> response( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy->CallMethodAndBlock(&method_call, 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy::TIMEOUT_USE_DEFAULT)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the response. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(response.get()); 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageReader reader(response.get()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string text_message; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(reader.PopString(&text_message)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The text message should be echo'ed back. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kHello, text_message); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(MockTest, CallMethodAndBlockWithErrorDetails) { 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Get an object proxy from the mock bus. 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ObjectProxy* proxy = mock_bus_->GetObjectProxy( 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "org.chromium.TestService", 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ObjectPath("/org/chromium/TestObject")); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create a method call. 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MethodCall method_call("org.chromium.TestInterface", "Echo"); 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedDBusError error; 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Call the method. 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Response> response( 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proxy->CallMethodAndBlockWithErrorDetails( 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &method_call, ObjectProxy::TIMEOUT_USE_DEFAULT, &error)); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check the response. 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(response.get()); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(error.is_set()); 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_STREQ(DBUS_ERROR_NOT_SUPPORTED, error.name()); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_STREQ("Not implemented", error.message()); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This test demonstrates how to mock an asynchronous method call using the 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mock classes. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MockTest, CallMethod) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kHello[] = "hello"; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get an object proxy from the mock bus. 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy* proxy = mock_bus_->GetObjectProxy( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "org.chromium.TestService", 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/TestObject")); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a method call. 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodCall method_call("org.chromium.TestInterface", "Echo"); 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageWriter writer(&method_call); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(kHello); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call the method. 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy->CallMethod(&method_call, 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy::TIMEOUT_USE_DEFAULT, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockTest::OnResponse, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop to let OnResponse be called. 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kHello, response_string_); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace dbus 219