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