/*
 *  Copyright 2018 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 VIDEO_TEST_MOCK_VIDEO_STREAM_ENCODER_H_
#define VIDEO_TEST_MOCK_VIDEO_STREAM_ENCODER_H_

#include "test/gmock.h"
#include "video/video_stream_encoder.h"

namespace webrtc {

class MockVideoStreamEncoder : public VideoStreamEncoderInterface {
 public:
  MOCK_METHOD2(SetSource,
               void(rtc::VideoSourceInterface<VideoFrame>*,
                    const VideoSendStream::DegradationPreference&));
  MOCK_METHOD2(SetSink, void(EncoderSink*, bool));
  MOCK_METHOD1(SetStartBitrate, void(int));
  MOCK_METHOD0(SendKeyFrame, void());
  MOCK_METHOD3(OnBitrateUpdated, void(uint32_t, uint8_t, int64_t));
  MOCK_METHOD1(OnFrame, void(const VideoFrame&));
  MOCK_METHOD1(SetBitrateObserver, void(VideoBitrateAllocationObserver*));
  MOCK_METHOD0(Stop, void());

  MOCK_METHOD2(MockedConfigureEncoder,
               void(const VideoEncoderConfig&, size_t));
  // gtest generates implicit copy which is not allowed on VideoEncoderConfig,
  // so we can't mock ConfigureEncoder directly.
  void ConfigureEncoder(VideoEncoderConfig config,
                        size_t max_data_payload_length) {
    MockedConfigureEncoder(config, max_data_payload_length);
  }
};

}  // namespace webrtc

#endif  // VIDEO_TEST_MOCK_VIDEO_STREAM_ENCODER_H_
