// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DBUS_MOCK_OBJECT_PROXY_H_
#define DBUS_MOCK_OBJECT_PROXY_H_

#include <string>

#include "dbus/message.h"
#include "dbus/object_path.h"
#include "dbus/object_proxy.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace dbus {

// Mock for ObjectProxy.
class MockObjectProxy : public ObjectProxy {
 public:
  MockObjectProxy(Bus* bus,
                  const std::string& service_name,
                  const ObjectPath& object_path);

  // GMock doesn't support the return type of scoped_ptr<> because scoped_ptr is
  // uncopyable. This is a workaround which defines |MockCallMethodAndBlock| as
  // a mock method and makes |CallMethodAndBlock| call the mocked method.
  // Use |MockCallMethodAndBlock| for setting/testing expectations.
  MOCK_METHOD3(MockCallMethodAndBlockWithErrorDetails,
               Response*(MethodCall* method_call,
                         int timeout_ms,
                         ScopedDBusError* error));
  virtual scoped_ptr<Response> CallMethodAndBlockWithErrorDetails(
      MethodCall* method_call,
      int timeout_ms,
      ScopedDBusError* error) OVERRIDE {
    return scoped_ptr<Response>(
        MockCallMethodAndBlockWithErrorDetails(method_call, timeout_ms, error));
  }
  MOCK_METHOD2(MockCallMethodAndBlock, Response*(MethodCall* method_call,
                                                 int timeout_ms));
  virtual scoped_ptr<Response> CallMethodAndBlock(MethodCall* method_call,
                                                  int timeout_ms) OVERRIDE {
    return scoped_ptr<Response>(MockCallMethodAndBlock(method_call,
                                                       timeout_ms));
  }
  MOCK_METHOD3(CallMethod, void(MethodCall* method_call,
                                int timeout_ms,
                                ResponseCallback callback));
  MOCK_METHOD4(CallMethodWithErrorCallback, void(MethodCall* method_call,
                                                 int timeout_ms,
                                                 ResponseCallback callback,
                                                 ErrorCallback error_callback));
  MOCK_METHOD4(ConnectToSignal,
               void(const std::string& interface_name,
                    const std::string& signal_name,
                    SignalCallback signal_callback,
                    OnConnectedCallback on_connected_callback));
  MOCK_METHOD0(Detach, void());

 protected:
  virtual ~MockObjectProxy();
};

}  // namespace dbus

#endif  // DBUS_MOCK_OBJECT_PROXY_H_
