/*
 *  Copyright (c) 2021 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.
 */

#include <cstdint>
#include <vector>

#include "api/test/simulated_network.h"
#include "audio/test/audio_end_to_end_test.h"
#include "call/audio_receive_stream.h"
#include "call/audio_send_stream.h"
#include "rtc_base/thread.h"
#include "test/call_test.h"
#include "test/gtest.h"

namespace webrtc {
namespace test {

using NackTest = CallTest;

TEST_F(NackTest, ShouldNackInLossyNetwork) {
  class NackTest : public AudioEndToEndTest {
   public:
    const int kTestDurationMs = 2000;
    const int64_t kRttMs = 30;
    const int64_t kLossPercent = 30;
    const int kNackHistoryMs = 1000;

    BuiltInNetworkBehaviorConfig GetSendTransportConfig() const override {
      BuiltInNetworkBehaviorConfig pipe_config;
      pipe_config.queue_delay_ms = kRttMs / 2;
      pipe_config.loss_percent = kLossPercent;
      return pipe_config;
    }

    void ModifyAudioConfigs(AudioSendStream::Config* send_config,
                            std::vector<AudioReceiveStreamInterface::Config>*
                                receive_configs) override {
      ASSERT_EQ(receive_configs->size(), 1U);
      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackHistoryMs;
      AudioEndToEndTest::ModifyAudioConfigs(send_config, receive_configs);
    }

    void PerformTest() override { Thread::SleepMs(kTestDurationMs); }

    void OnStreamsStopped() override {
      AudioReceiveStreamInterface::Stats recv_stats =
          receive_stream()->GetStats(/*get_and_clear_legacy_stats=*/true);
      EXPECT_GT(recv_stats.nacks_sent, 0U);
      AudioSendStream::Stats send_stats = send_stream()->GetStats();
      EXPECT_GT(send_stats.retransmitted_packets_sent, 0U);
      EXPECT_GT(send_stats.nacks_received, 0U);
    }
  } test;

  RunBaseTest(&test);
}

}  // namespace test
}  // namespace webrtc
