/*
 *  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_DELAY_MANAGER_H_
#define MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_

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

#include "test/gmock.h"

namespace webrtc {

class MockDelayManager : public DelayManager {
 public:
  MockDelayManager(size_t max_packets_in_buffer,
                   int base_min_target_delay_ms,
                   DelayPeakDetector* peak_detector,
                   const TickTimer* tick_timer)
      : DelayManager(max_packets_in_buffer,
                     base_min_target_delay_ms,
                     peak_detector,
                     tick_timer) {}
  virtual ~MockDelayManager() { Die(); }
  MOCK_METHOD0(Die, void());
  MOCK_CONST_METHOD0(iat_vector, const IATVector&());
  MOCK_METHOD3(Update,
               int(uint16_t sequence_number,
                   uint32_t timestamp,
                   int sample_rate_hz));
  MOCK_METHOD2(CalculateTargetLevel, int(int iat_packets, bool reordered));
  MOCK_METHOD1(SetPacketAudioLength, int(int length_ms));
  MOCK_METHOD0(Reset, void());
  MOCK_CONST_METHOD0(PeakFound, bool());
  MOCK_METHOD1(UpdateCounters, void(int elapsed_time_ms));
  MOCK_METHOD0(ResetPacketIatCount, void());
  MOCK_CONST_METHOD2(BufferLimits, void(int* lower_limit, int* higher_limit));
  MOCK_CONST_METHOD0(TargetLevel, int());
  MOCK_METHOD0(RegisterEmptyPacket, void());
  MOCK_METHOD1(set_extra_delay_ms, void(int16_t delay));
  MOCK_CONST_METHOD0(base_target_level, int());
  MOCK_METHOD1(set_streaming_mode, void(bool value));
  MOCK_CONST_METHOD0(last_pack_cng_or_dtmf, int());
  MOCK_METHOD1(set_last_pack_cng_or_dtmf, void(int value));
};

}  // namespace webrtc
#endif  // MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
