/*
 *  Copyright (c) 2012 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 MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_
#define MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_

#include "modules/audio_coding/neteq/packet_buffer.h"

#include "test/gmock.h"

namespace webrtc {

class MockPacketBuffer : public PacketBuffer {
 public:
  MockPacketBuffer(size_t max_number_of_packets, const TickTimer* tick_timer)
      : PacketBuffer(max_number_of_packets, tick_timer) {}
  virtual ~MockPacketBuffer() { Die(); }
  MOCK_METHOD0(Die, void());
  MOCK_METHOD0(Flush,
      void());
  MOCK_CONST_METHOD0(Empty,
      bool());
  int InsertPacket(Packet&& packet, StatisticsCalculator* stats) {
    return InsertPacketWrapped(&packet, stats);
  }
  // Since gtest does not properly support move-only types, InsertPacket is
  // implemented as a wrapper. You'll have to implement InsertPacketWrapped
  // instead and move from |*packet|.
  MOCK_METHOD2(InsertPacketWrapped,
               int(Packet* packet, StatisticsCalculator* stats));
  MOCK_METHOD5(InsertPacketList,
               int(PacketList* packet_list,
                   const DecoderDatabase& decoder_database,
                   rtc::Optional<uint8_t>* current_rtp_payload_type,
                   rtc::Optional<uint8_t>* current_cng_rtp_payload_type,
                   StatisticsCalculator* stats));
  MOCK_CONST_METHOD1(NextTimestamp,
      int(uint32_t* next_timestamp));
  MOCK_CONST_METHOD2(NextHigherTimestamp,
      int(uint32_t timestamp, uint32_t* next_timestamp));
  MOCK_CONST_METHOD0(PeekNextPacket,
      const Packet*());
  MOCK_METHOD0(GetNextPacket,
      rtc::Optional<Packet>());
  MOCK_METHOD1(DiscardNextPacket, int(StatisticsCalculator* stats));
  MOCK_METHOD3(DiscardOldPackets,
               void(uint32_t timestamp_limit,
                    uint32_t horizon_samples,
                    StatisticsCalculator* stats));
  MOCK_METHOD2(DiscardAllOldPackets,
               void(uint32_t timestamp_limit, StatisticsCalculator* stats));
  MOCK_CONST_METHOD0(NumPacketsInBuffer,
      size_t());
  MOCK_METHOD1(IncrementWaitingTimes,
      void(int));
  MOCK_CONST_METHOD0(current_memory_bytes,
      int());
};

}  // namespace webrtc
#endif  // MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_
