/*
 *  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,
                   DelayPeakDetector* peak_detector,
                   const TickTimer* tick_timer)
      : DelayManager(max_packets_in_buffer, 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_METHOD1(CalculateTargetLevel,
      int(int iat_packets));
  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_
