/*
 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_
#define WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_

#include "testing/gmock/include/gmock/gmock.h"
#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"

namespace webrtc {
namespace test {

class MockBitrateObserver : public BitrateObserver {
 public:
  MOCK_METHOD3(OnNetworkChanged,
               void(uint32_t bitrate_bps,
                    uint8_t fraction_loss,
                    int64_t rtt_ms));
};

class MockBitrateController : public BitrateController {
 public:
  MOCK_METHOD0(CreateRtcpBandwidthObserver, RtcpBandwidthObserver*());
  MOCK_METHOD1(SetStartBitrate, void(int start_bitrate_bps));
  MOCK_METHOD2(SetMinMaxBitrate,
               void(int min_bitrate_bps, int max_bitrate_bps));
  MOCK_METHOD3(SetBitrates,
               void(int start_bitrate_bps,
                    int min_bitrate_bps,
                    int max_bitrate_bps));
  MOCK_METHOD1(UpdateDelayBasedEstimate, void(uint32_t bitrate_bps));
  MOCK_METHOD1(SetEventLog, void(RtcEventLog* event_log));
  MOCK_CONST_METHOD1(AvailableBandwidth, bool(uint32_t* bandwidth));
  MOCK_METHOD1(SetReservedBitrate, void(uint32_t reserved_bitrate_bps));
  MOCK_METHOD3(GetNetworkParameters,
               bool(uint32_t* bitrate, uint8_t* fraction_loss, int64_t* rtt));

  MOCK_METHOD0(Process, void());
  MOCK_METHOD0(TimeUntilNextProcess, int64_t());
};
}  // namespace test
}  // namespace webrtc

#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_
