19a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org/*
29a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
39a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *
49a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  Use of this source code is governed by a BSD-style license
59a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  that can be found in the LICENSE file in the root of the source
69a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  tree. An additional intellectual property rights grant can be found
79a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  in the file PATENTS.  All contributing project authors may
89a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
99a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org */
109a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org// Unit tests for DelayManager class.
129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
13e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
159a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org#include <math.h>
169a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1749d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gmock/include/gmock/gmock.h"
1849d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
19e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
219a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgnamespace webrtc {
229a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
239a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgusing ::testing::Return;
24662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgusing ::testing::_;
259a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
269a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgclass DelayManagerTest : public ::testing::Test {
279a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org protected:
289a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  static const int kMaxNumberOfPackets = 240;
299a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  static const int kTimeStepMs = 10;
309a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  static const int kFs = 8000;
319a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  static const int kFrameSizeMs = 20;
329a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  static const int kTsIncrement = kFrameSizeMs * kFs / 1000;
339a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
349a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  DelayManagerTest();
359a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  virtual void SetUp();
369a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  virtual void TearDown();
379a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  void SetPacketAudioLength(int lengt_ms);
389a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  void InsertNextPacket();
399a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  void IncreaseTime(int inc_ms);
409a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
419a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  DelayManager* dm_;
429a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  MockDelayPeakDetector detector_;
439a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  uint16_t seq_no_;
449a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  uint32_t ts_;
459a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org};
469a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
479a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgDelayManagerTest::DelayManagerTest()
489a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    : dm_(NULL),
499a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      seq_no_(0x1234),
509a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      ts_(0x12345678) {
519a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
529a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
539a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::SetUp() {
549a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Reset())
559a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org            .Times(1);
569a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_ = new DelayManager(kMaxNumberOfPackets, &detector_);
579a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
589a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
599a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
609a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
619a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->SetPacketAudioLength(lengt_ms);
629a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
639a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
649a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::InsertNextPacket() {
659a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
669a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  seq_no_ += 1;
679a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  ts_ += kTsIncrement;
689a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
699a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
709a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::IncreaseTime(int inc_ms) {
719a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  for (int t = 0; t < inc_ms; t += kTimeStepMs) {
729a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    EXPECT_CALL(detector_, IncrementCounter(kTimeStepMs))
739a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org        .Times(1);
749a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    dm_->UpdateCounters(kTimeStepMs);
759a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  }
769a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
779a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::TearDown() {
789a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Die());
799a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  delete dm_;
809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, CreateAndDestroy) {
839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Nothing to do here. The test fixture creates and destroys the DelayManager
849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // object.
859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
869a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
879a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, VectorInitialization) {
889a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  const DelayManager::IATVector& vec = dm_->iat_vector();
899a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  double sum = 0.0;
909a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  for (size_t i = 0; i < vec.size(); i++) {
919a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    EXPECT_NEAR(ldexp(pow(0.5, static_cast<int>(i + 1)), 30), vec[i], 65536);
929a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    // Tolerance 65536 in Q30 corresponds to a delta of approximately 0.00006.
939a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org    sum += vec[i];
949a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  }
959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(1 << 30, static_cast<int>(sum));  // Should be 1 in Q30.
969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
979a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
989a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, SetPacketAudioLength) {
999a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  const int kLengthMs = 30;
1009a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect DelayManager to pass on the new length to the detector object.
1019a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs))
1029a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .Times(1);
1039a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
1049a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));  // Illegal parameter value.
1059a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1069a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1079a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, PeakFound) {
1089a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect DelayManager to pass on the question to the detector.
1099a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Call twice, and let the detector return true the first time and false the
1109a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // second time.
1119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, peak_found())
1129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(true))
1139a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(false));
1149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_TRUE(dm_->PeakFound());
1159a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_FALSE(dm_->PeakFound());
1169a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1179a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1189a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateCounters) {
1199a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect DelayManager to pass on the counter update to the detector.
1209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, IncrementCounter(kTimeStepMs))
1219a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .Times(1);
1229a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->UpdateCounters(kTimeStepMs);
1239a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1249a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1259a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateNormal) {
1269a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
1279a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // First packet arrival.
1289a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1299a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Advance time by one frame size.
1309a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  IncreaseTime(kFrameSizeMs);
1319a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Second packet arrival.
1329a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect detector update method to be called once with inter-arrival time
1339a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // equal to 1 packet, and (base) target level equal to 1 as well.
1349a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Return false to indicate no peaks found.
1359a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Update(1, 1))
1369a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(false));
1379a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1389a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
1399a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(1, dm_->base_target_level());
1409a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  int lower, higher;
1419a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->BufferLimits(&lower, &higher);
1429a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect |lower| to be 75% of target level, and |higher| to be target level,
1439a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // but also at least 20 ms higher than |lower|, which is the limiting case
1449a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // here.
1459a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ((1 << 8) * 3 / 4, lower);
1469a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
1479a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1489a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1499a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
1509a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
1519a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // First packet arrival.
1529a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1539a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Advance time by two frame size.
1549a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  IncreaseTime(2 * kFrameSizeMs);
1559a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Second packet arrival.
1569a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect detector update method to be called once with inter-arrival time
1579a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // equal to 1 packet, and (base) target level equal to 1 as well.
1589a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Return false to indicate no peaks found.
1599a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Update(2, 2))
1609a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(false));
1619a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1629a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(2 << 8, dm_->TargetLevel());  // In Q8.
1639a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(2, dm_->base_target_level());
1649a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  int lower, higher;
1659a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->BufferLimits(&lower, &higher);
1669a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect |lower| to be 75% of target level, and |higher| to be target level,
1679a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // but also at least 20 ms higher than |lower|, which is the limiting case
1689a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // here.
1699a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ((2 << 8) * 3 / 4, lower);
1709a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
1719a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1729a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
1739a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdatePeakFound) {
1749a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
1759a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // First packet arrival.
1769a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1779a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Advance time by one frame size.
1789a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  IncreaseTime(kFrameSizeMs);
1799a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Second packet arrival.
1809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect detector update method to be called once with inter-arrival time
1819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // equal to 1 packet, and (base) target level equal to 1 as well.
1829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Return true to indicate that peaks are found. Let the peak height be 5.
1839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Update(1, 1))
1849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(true));
1859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, MaxPeakHeight())
1869a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(5));
1879a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
1889a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(5 << 8, dm_->TargetLevel());
1899a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(1, dm_->base_target_level());  // Base target level is w/o peaks.
1909a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  int lower, higher;
1919a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->BufferLimits(&lower, &higher);
1929a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect |lower| to be 75% of target level, and |higher| to be target level.
1939a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ((5 << 8) * 3 / 4, lower);
1949a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(5 << 8, higher);
1959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
1969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
197662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, TargetDelay) {
1989a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
1999a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // First packet arrival.
2009a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
2019a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Advance time by one frame size.
2029a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  IncreaseTime(kFrameSizeMs);
2039a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Second packet arrival.
2049a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Expect detector update method to be called once with inter-arrival time
2059a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // equal to 1 packet, and (base) target level equal to 1 as well.
2069a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Return false to indicate no peaks found.
2079a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_CALL(detector_, Update(1, 1))
2089a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org      .WillOnce(Return(false));
2099a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  InsertNextPacket();
210662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  const int kExpectedTarget = 1;
2119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());  // In Q8.
2129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(1, dm_->base_target_level());
2139a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  int lower, higher;
2149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  dm_->BufferLimits(&lower, &higher);
215662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Expect |lower| to be 75% of base target level, and |higher| to be
216662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // lower + 20 ms headroom.
217662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ((1 << 8) * 3 / 4, lower);
2189a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
2199a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
2209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
221662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, MaxAndRequiredDelay) {
222662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  const int kExpectedTarget = 5;
223662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
224662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
225662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // First packet arrival.
226662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
227662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Second packet arrival.
228662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Expect detector update method to be called once with inter-arrival time
229662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
230662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_CALL(detector_, Update(kExpectedTarget, _))
231662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org      .WillRepeatedly(Return(true));
232662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_CALL(detector_, MaxPeakHeight())
233662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org      .WillRepeatedly(Return(kExpectedTarget));
234662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  IncreaseTime(kTimeIncrement);
235662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
236662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
237662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // No limit is set.
238662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
239662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
240662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  int kMaxDelayPackets = kExpectedTarget - 2;
241662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
242662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
243662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  IncreaseTime(kTimeIncrement);
244662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
245662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms());
246662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
247662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
248662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Target level at least should be one packet.
249662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
250662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org}
251662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
252662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, MinAndRequiredDelay) {
253662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  const int kExpectedTarget = 5;
254662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
255662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  SetPacketAudioLength(kFrameSizeMs);
256662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // First packet arrival.
257662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
258662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Second packet arrival.
259662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Expect detector update method to be called once with inter-arrival time
260662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
261662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_CALL(detector_, Update(kExpectedTarget, _))
262662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org      .WillRepeatedly(Return(true));
263662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_CALL(detector_, MaxPeakHeight())
264662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org      .WillRepeatedly(Return(kExpectedTarget));
265662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  IncreaseTime(kTimeIncrement);
266662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
267662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
268662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // No limit is applied.
269662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
270662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
271662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  int kMinDelayPackets = kExpectedTarget + 2;
272662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
273662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  dm_->SetMinimumDelay(kMinDelayMs);
274662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  IncreaseTime(kTimeIncrement);
275662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  InsertNextPacket();
276662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms());
277662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
278662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org}
279662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
2809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, Failures) {
2819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Wrong sample rate.
2829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(-1, dm_->Update(0, 0, -1));
2839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  // Wrong packet size.
2849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
2859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org  EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
286662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
287662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Minimum delay higher than a maximum delay is not accepted.
288662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_TRUE(dm_->SetMaximumDelay(10));
289662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_FALSE(dm_->SetMinimumDelay(20));
290662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org
291662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  // Maximum delay less than minimum delay is not accepted.
292662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_TRUE(dm_->SetMaximumDelay(100));
293662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_TRUE(dm_->SetMinimumDelay(80));
294662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org  EXPECT_FALSE(dm_->SetMaximumDelay(60));
2959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}
2969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org
2979a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}  // namespace webrtc
298